xorg-server: Changes to 'ubuntu'
debian/changelog | 7
debian/patches/510-dix-return-early-from-DisableDevice-if-the-device-is.patch | 29 ++
debian/patches/511-dix-move-freeing-the-sprite-into-a-function.patch | 70 ++++++
debian/patches/512-dix-free-the-sprite-when-disabling-the-device.patch | 31 ++
debian/patches/513-dix-disable-non-sprite-owners-first-when-disabling-p.patch | 45 ++++
debian/patches/514-Xi-drop-forced-unpairing-when-changing-the-hierarchy.patch | 33 +++
debian/patches/515-dix-disable-all-devices-before-shutdown.patch | 104 ++++++++++
debian/patches/series | 8
8 files changed, 327 insertions(+)
New commits:
commit 65e8e82dd7069543858872ca63911abfd23d2b59
Author: Maarten Lankhorst <maarten.lankhorst@canonical.com>
Date: Wed Jun 20 17:01:37 2012 +0200
Add upstream patches for proper device disabling
* Add upstream patches for proper device disabling:
- 510-dix-return-early-from-DisableDevice-if-the-device-is.patch
- 511-dix-move-freeing-the-sprite-into-a-function.patch
- 512-dix-free-the-sprite-when-disabling-the-device.patch
- 513-dix-disable-non-sprite-owners-first-when-disabling-p.patch
- 514-Xi-drop-forced-unpairing-when-changing-the-hierarchy.patch
- 515-dix-disable-all-devices-before-shutdown.patch
diff --git a/debian/changelog b/debian/changelog
index 6800c19..135c501 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -11,6 +11,13 @@ xorg-server (2:1.12.1.902-1ubuntu1) UNRELEASED; urgency=medium
- 507_touchscreen_fixes.patch
* Non-trivial refresh of 500_pointer_barrier_thresholds.diff, based on xorg-edgers
* Rest was refreshed with patch-x-indent.sh to survive coding style changes
+ * Add upstream patches for proper device disabling:
+ - 510-dix-return-early-from-DisableDevice-if-the-device-is.patch
+ - 511-dix-move-freeing-the-sprite-into-a-function.patch
+ - 512-dix-free-the-sprite-when-disabling-the-device.patch
+ - 513-dix-disable-non-sprite-owners-first-when-disabling-p.patch
+ - 514-Xi-drop-forced-unpairing-when-changing-the-hierarchy.patch
+ - 515-dix-disable-all-devices-before-shutdown.patch
[ Bryce Harrington ]
* Drop 209_add_legacy_bgnone_option.patch: lightdm and other *dm's have
diff --git a/debian/patches/510-dix-return-early-from-DisableDevice-if-the-device-is.patch b/debian/patches/510-dix-return-early-from-DisableDevice-if-the-device-is.patch
new file mode 100644
index 0000000..87ae244
--- /dev/null
+++ b/debian/patches/510-dix-return-early-from-DisableDevice-if-the-device-is.patch
@@ -0,0 +1,29 @@
+From 46adcefb0e08515195d8e49985a4e210395700b3 Mon Sep 17 00:00:00 2001
+From: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Thu, 10 May 2012 12:10:12 +1000
+Subject: [PATCH 07/12] dix: return early from DisableDevice if the device is
+ already disabled
+
+Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+---
+ dix/devices.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/dix/devices.c b/dix/devices.c
+index df46497..6acff4f 100644
+--- a/dix/devices.c
++++ b/dix/devices.c
+@@ -428,6 +428,9 @@ DisableDevice(DeviceIntPtr dev, BOOL sendevent)
+ BOOL enabled;
+ int flags[MAXDEVICES] = { 0 };
+
++ if (!dev->enabled)
++ return TRUE;
++
+ for (prev = &inputInfo.devices;
+ *prev && (*prev != dev); prev = &(*prev)->next);
+ if (*prev != dev)
+--
+1.7.9.5
+
diff --git a/debian/patches/511-dix-move-freeing-the-sprite-into-a-function.patch b/debian/patches/511-dix-move-freeing-the-sprite-into-a-function.patch
new file mode 100644
index 0000000..cd4db33
--- /dev/null
+++ b/debian/patches/511-dix-move-freeing-the-sprite-into-a-function.patch
@@ -0,0 +1,70 @@
+From e57d6a89027c55fef987cdc259668c48a8b4ea1b Mon Sep 17 00:00:00 2001
+From: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Thu, 10 May 2012 15:32:20 +1000
+Subject: [PATCH 08/12] dix: move freeing the sprite into a function
+
+Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+---
+ dix/devices.c | 7 +------
+ dix/events.c | 12 ++++++++++++
+ include/dix.h | 2 ++
+ 3 files changed, 15 insertions(+), 6 deletions(-)
+
+diff --git a/dix/devices.c b/dix/devices.c
+index 6acff4f..a280dee 100644
+--- a/dix/devices.c
++++ b/dix/devices.c
+@@ -918,12 +918,7 @@ CloseDevice(DeviceIntPtr dev)
+ free(classes);
+ }
+
+- if (DevHasCursor(dev) && dev->spriteInfo->sprite) {
+- if (dev->spriteInfo->sprite->current)
+- FreeCursor(dev->spriteInfo->sprite->current, None);
+- free(dev->spriteInfo->sprite->spriteTrace);
+- free(dev->spriteInfo->sprite);
+- }
++ FreeSprite(dev);
+
+ /* a client may have the device set as client pointer */
+ for (j = 0; j < currentMaxClients; j++) {
+diff --git a/dix/events.c b/dix/events.c
+index 83ae5c9..49894fa 100644
+--- a/dix/events.c
++++ b/dix/events.c
+@@ -3192,6 +3192,18 @@ InitializeSprite(DeviceIntPtr pDev, WindowPtr pWin)
+ #endif
+ }
+
++void FreeSprite(DeviceIntPtr dev)
++{
++ if (DevHasCursor(dev) && dev->spriteInfo->sprite) {
++ if (dev->spriteInfo->sprite->current)
++ FreeCursor(dev->spriteInfo->sprite->current, None);
++ free(dev->spriteInfo->sprite->spriteTrace);
++ free(dev->spriteInfo->sprite);
++ }
++ dev->spriteInfo->sprite = NULL;
++}
++
++
+ /**
+ * Update the mouse sprite info when the server switches from a pScreen to another.
+ * Otherwise, the pScreen of the mouse sprite is never updated when we switch
+diff --git a/include/dix.h b/include/dix.h
+index 5dc2ac5..3d8b0e5 100644
+--- a/include/dix.h
++++ b/include/dix.h
+@@ -395,6 +395,8 @@ DeliverTouchEvents(DeviceIntPtr /* dev */ ,
+ extern void
+ InitializeSprite(DeviceIntPtr /* pDev */ ,
+ WindowPtr /* pWin */ );
++extern void
++FreeSprite(DeviceIntPtr pDev);
+
+ extern void
+ UpdateSpriteForScreen(DeviceIntPtr /* pDev */ ,
+--
+1.7.9.5
+
diff --git a/debian/patches/512-dix-free-the-sprite-when-disabling-the-device.patch b/debian/patches/512-dix-free-the-sprite-when-disabling-the-device.patch
new file mode 100644
index 0000000..0ba5be4
--- /dev/null
+++ b/debian/patches/512-dix-free-the-sprite-when-disabling-the-device.patch
@@ -0,0 +1,31 @@
+From df1704365e700d3cf1d36a241bdfc479159a8df7 Mon Sep 17 00:00:00 2001
+From: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Thu, 10 May 2012 15:33:15 +1000
+Subject: [PATCH 09/12] dix: free the sprite when disabling the device
+
+Disabled devices don't need sprites (they can't send events anyway) and the
+device init process is currently geared to check for whether sprite is
+present to check if the device should be paired/attached.
+
+Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+---
+ dix/devices.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/dix/devices.c b/dix/devices.c
+index a280dee..f134f31 100644
+--- a/dix/devices.c
++++ b/dix/devices.c
+@@ -465,6 +465,8 @@ DisableDevice(DeviceIntPtr dev, BOOL sendevent)
+ (void) (*dev->deviceProc) (dev, DEVICE_OFF);
+ dev->enabled = FALSE;
+
++ FreeSprite(dev);
++
+ /* now that the device is disabled, we can reset the signal handler's
+ * last.slave */
+ OsBlockSignals();
+--
+1.7.9.5
+
diff --git a/debian/patches/513-dix-disable-non-sprite-owners-first-when-disabling-p.patch b/debian/patches/513-dix-disable-non-sprite-owners-first-when-disabling-p.patch
new file mode 100644
index 0000000..0f7301a
--- /dev/null
+++ b/debian/patches/513-dix-disable-non-sprite-owners-first-when-disabling-p.patch
@@ -0,0 +1,45 @@
+From e433d1046c222f9d969c2c28a4651ff9097614f4 Mon Sep 17 00:00:00 2001
+From: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Thu, 10 May 2012 12:42:59 +1000
+Subject: [PATCH 10/12] dix: disable non-sprite-owners first when disabling
+ paired devices
+
+If a sprite-owner is to be disabled but still paired, disable the paired
+device first. i.e. disabling a master pointer will disable the master
+keyboard first.
+
+Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+---
+Altered to apply to stable
+
+ dix/devices.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/dix/devices.c b/dix/devices.c
+index f134f31..c5a713f 100644
+--- a/dix/devices.c
++++ b/dix/devices.c
+@@ -455,13 +455,13 @@
+
+ if (IsMaster(dev) && dev->spriteInfo->sprite) {
+ for (other = inputInfo.devices; other; other = other->next) {
+- if (other->spriteInfo->paired == dev) {
+- ErrorF("[dix] cannot disable device, still paired. "
+- "This is a bug. \n");
+- return FALSE;
+- }
++ if (other->spriteInfo->paired == dev && !other->spriteInfo->spriteOwner)
++ DisableDevice(other, sendevent);
+ }
+ }
++
++ if (dev->spriteInfo->paired)
++ dev->spriteInfo->paired = NULL;
+
+ (void) (*dev->deviceProc) (dev, DEVICE_OFF);
+ dev->enabled = FALSE;
+
+--
+1.7.9.5
+
diff --git a/debian/patches/514-Xi-drop-forced-unpairing-when-changing-the-hierarchy.patch b/debian/patches/514-Xi-drop-forced-unpairing-when-changing-the-hierarchy.patch
new file mode 100644
index 0000000..19e3d8a
--- /dev/null
+++ b/debian/patches/514-Xi-drop-forced-unpairing-when-changing-the-hierarchy.patch
@@ -0,0 +1,33 @@
+From 9c0e820216cd1631f75b037b7908d55ac091692c Mon Sep 17 00:00:00 2001
+From: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Thu, 10 May 2012 12:55:44 +1000
+Subject: [PATCH 11/12] Xi: drop forced unpairing when changing the hierarchy
+
+Devices are unpaired as needed on DisableDevice now.
+
+Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+---
+ Xi/xichangehierarchy.c | 6 ------
+ 1 file changed, 6 deletions(-)
+
+diff --git a/Xi/xichangehierarchy.c b/Xi/xichangehierarchy.c
+index 756aaac..89f16d8 100644
+--- a/Xi/xichangehierarchy.c
++++ b/Xi/xichangehierarchy.c
+@@ -293,12 +293,6 @@ remove_master(ClientPtr client, xXIRemoveMasterInfo * r, int flags[MAXDEVICES])
+ }
+ }
+
+- /* can't disable until we removed pairing */
+- keybd->spriteInfo->paired = NULL;
+- ptr->spriteInfo->paired = NULL;
+- XTestptr->spriteInfo->paired = NULL;
+- XTestkeybd->spriteInfo->paired = NULL;
+-
+ /* disable the remove the devices, XTest devices must be done first
+ else the sprites they rely on will be destroyed */
+ DisableDevice(XTestptr, FALSE);
+--
+1.7.9.5
+
diff --git a/debian/patches/515-dix-disable-all-devices-before-shutdown.patch b/debian/patches/515-dix-disable-all-devices-before-shutdown.patch
new file mode 100644
index 0000000..b368b6e
--- /dev/null
+++ b/debian/patches/515-dix-disable-all-devices-before-shutdown.patch
@@ -0,0 +1,104 @@
+From 4c68f5d395c66f28b56e488cb3cd12f36820357b Mon Sep 17 00:00:00 2001
+From: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Wed, 9 May 2012 09:21:28 +1000
+Subject: [PATCH 12/12] dix: disable all devices before shutdown
+
+f3410b97cf9b48a47bee3d15d232f8a88e75f4ef introduced a regression on server
+shutdown. If any button or key was held on shutdown (ctrl, alt, backspace
+are usually still down) sending a raw event will segfault the server. The
+the root windows are set to NULL before calling CloseDownDevices().
+
+Avoid this by disabling all devices first when shutting down. Disabled
+devices won't send events anymore.
+
+Master keyboards must be disabled first, otherwise disabling the pointer
+will trigger DisableDevice(keyboard) and the keyboard is removed from the
+inputInfo.devices list and moved to inputInfo.off_devices. A regular loop
+through inputInfo.devices would thus jump to off_devices and not recover.
+
+Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+Acked-by: Chase Douglas <chase.douglas@canonical.com>
+Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+---
+ dix/devices.c | 20 ++++++++++++++++++++
+ dix/main.c | 4 ++++
+ include/input.h | 2 +-
+ 3 files changed, 25 insertions(+), 1 deletion(-)
+
+diff --git a/dix/devices.c b/dix/devices.c
+index c5a713f..08875bc 100644
+--- a/dix/devices.c
++++ b/dix/devices.c
+@@ -501,6 +501,26 @@ DisableDevice(DeviceIntPtr dev, BOOL sendevent)
+ return TRUE;
+ }
+
++void
++DisableAllDevices(void)
++{
++ DeviceIntPtr dev, tmp;
++
++ nt_list_for_each_entry_safe(dev, tmp, inputInfo.devices, next) {
++ if (!IsMaster(dev))
++ DisableDevice(dev, FALSE);
++ }
++ /* master keyboards need to be disabled first */
++ nt_list_for_each_entry_safe(dev, tmp, inputInfo.devices, next) {
++ if (dev->enabled && IsMaster(dev) && IsKeyboardDevice(dev))
++ DisableDevice(dev, FALSE);
++ }
++ nt_list_for_each_entry_safe(dev, tmp, inputInfo.devices, next) {
++ if (dev->enabled)
++ DisableDevice(dev, FALSE);
++ }
++}
++
+ /**
+ * Initialise a new device through the driver and tell all clients about the
+ * new device.
+diff --git a/dix/main.c b/dix/main.c
+index 70dcc94..df9023e 100644
+--- a/dix/main.c
++++ b/dix/main.c
+@@ -104,6 +104,7 @@ Equipment Corporation.
+ #include "privates.h"
+ #include "registry.h"
+ #include "client.h"
++#include "exevents.h"
+ #ifdef PANORAMIX
+ #include "panoramiXsrv.h"
+ #else
+@@ -295,6 +296,7 @@ main(int argc, char *argv[], char *envp[])
+ #endif
+
+ UndisplayDevices();
++ DisableAllDevices();
+
+ /* Now free up whatever must be freed */
+ if (screenIsSaved == SCREEN_SAVER_ON)
+@@ -318,7 +320,9 @@ main(int argc, char *argv[], char *envp[])
+
+ for (i = 0; i < screenInfo.numScreens; i++)
+ screenInfo.screens[i]->root = NullWindow;
++
+ CloseDownDevices();
++
+ CloseDownEvents();
+
+ for (i = screenInfo.numScreens - 1; i >= 0; i--) {
+diff --git a/include/input.h b/include/input.h
+index bcf98a6..5747f3c 100644
+--- a/include/input.h
++++ b/include/input.h
+@@ -264,7 +264,7 @@ extern _X_EXPORT Bool ActivateDevice(DeviceIntPtr /*device */ ,
+
+ extern _X_EXPORT Bool DisableDevice(DeviceIntPtr /*device */ ,
+ BOOL /* sendevent */ );
+-
++extern void DisableAllDevices(void);
+ extern int InitAndStartDevices(void);
+
+ extern void CloseDownDevices(void);
+--
+1.7.9.5
+
diff --git a/debian/patches/series b/debian/patches/series
index 291778c..bf823d8 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -26,3 +26,11 @@
# Temporary, until it's reviewed & accepted upstream
500_pointer_barrier_thresholds.diff
508_device_off_release_buttons.patch
+
+# Upstream patches
+510-dix-return-early-from-DisableDevice-if-the-device-is.patch
+511-dix-move-freeing-the-sprite-into-a-function.patch
+512-dix-free-the-sprite-when-disabling-the-device.patch
+513-dix-disable-non-sprite-owners-first-when-disabling-p.patch
+514-Xi-drop-forced-unpairing-when-changing-the-hierarchy.patch
+515-dix-disable-all-devices-before-shutdown.patch
Reply to: