xserver: Branch 'input-hotplug' - 4 commits

Daniel Stone daniels at kemper.freedesktop.org
Mon Aug 7 23:03:08 EEST 2006


 Xi/listdev.c                |   11 +++++++----
 config/config.c             |    4 ++++
 dix/devices.c               |   16 +---------------
 dix/events.c                |    8 --------
 hw/kdrive/ephyr/ephyr.c     |    2 ++
 hw/kdrive/ephyr/ephyrinit.c |    4 ++--
 6 files changed, 16 insertions(+), 29 deletions(-)

New commits:
diff-tree 7721ee308fbbb6fc9c969f15fe04b3346c04f843 (from 458c63a84110f64c7fce397a531a3a779c2239a2)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Aug 7 23:03:02 2006 +0300

    config client: fix minor race with event queue
    Fix a small race whereby you could remove a device while events from it
    were still in the queue, by calling ProcessInputEvents immediately before
    RemoveDevice, to (hopefully) flush the event queue.

diff --git a/config/config.c b/config/config.c
index b85b120..d4cf233 100644
--- a/config/config.c
+++ b/config/config.c
@@ -173,6 +173,10 @@ configMessage(DBusConnection *connection
                 return DBUS_HANDLER_RESULT_HANDLED;
             }
             ErrorF("pDev is %p\n", pDev);
+            /* Call PIE here so we don't try to dereference a device that's
+             * already been removed.  Technically there's still a small race
+             * here, so we should ensure that SIGIO is blocked. */
+            ProcessInputEvents();
             RemoveDevice(pDev);
             dbus_error_free(&error);
             return DBUS_HANDLER_RESULT_HANDLED;
diff-tree 458c63a84110f64c7fce397a531a3a779c2239a2 (from a31d11a7a8485cdc799f76c4d407d3b7f7c9b350)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Aug 7 23:02:17 2006 +0300

    enable adding devices after removal of a middle device
    Allow new devices to be added after a device that _wasn't_ the last on the
    list was removed, by ensuring inputInfo.numDevices always increases, and
    never decreases.

diff --git a/Xi/listdev.c b/Xi/listdev.c
index 91e8f22..02d55ad 100644
--- a/Xi/listdev.c
+++ b/Xi/listdev.c
@@ -96,7 +96,7 @@ int
 ProcXListInputDevices(register ClientPtr client)
 {
     xListInputDevicesReply rep;
-    int numdevs;
+    int numdevs = 0;
     int namesize = 1;	/* need 1 extra byte for strcpy */
     int size = 0;
     int total_length;
@@ -115,12 +115,15 @@ ProcXListInputDevices(register ClientPtr
     rep.sequenceNumber = client->sequence;
 
     AddOtherInputDevices();
-    numdevs = inputInfo.numDevices;
 
-    for (d = inputInfo.devices; d; d = d->next)
+    for (d = inputInfo.devices; d; d = d->next) {
 	SizeDeviceInfo(d, &namesize, &size);
-    for (d = inputInfo.off_devices; d; d = d->next)
+        numdevs++;
+    }
+    for (d = inputInfo.off_devices; d; d = d->next) {
 	SizeDeviceInfo(d, &namesize, &size);
+        numdevs++;
+    }
 
     total_length = numdevs * sizeof(xDeviceInfo) + size + namesize;
     devbuf = (char *)xalloc(total_length);
diff --git a/dix/devices.c b/dix/devices.c
index 1d423e2..69f1e7b 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -536,7 +536,7 @@ RemoveDevice(DeviceIntPtr dev)
     ErrorF("want to remove device %p, kb is %p, pointer is %p\n", dev, inputInfo.keyboard, inputInfo.pointer);
 #endif
 
-    if (!dev)
+    if (!dev || dev == inputInfo.keyboard || dev == inputInfo.pointer)
         return BadImplementation;
 
     prev = NULL;
@@ -550,13 +550,6 @@ RemoveDevice(DeviceIntPtr dev)
 	    else
 		prev->next = next;
 
-	    inputInfo.numDevices--;
-
-	    if (inputInfo.keyboard == tmp)
-	        inputInfo.keyboard = NULL;
-	    else if (inputInfo.pointer == tmp)
-	        inputInfo.pointer = NULL;
-
 	    ret = Success;
 	}
     }
@@ -572,13 +565,6 @@ RemoveDevice(DeviceIntPtr dev)
 	    else
 		prev->next = next;
 
-	    inputInfo.numDevices--;
-
-	    if (inputInfo.keyboard == tmp)
-	        inputInfo.keyboard = NULL;
-	    else if (inputInfo.pointer == tmp)
-	        inputInfo.pointer = NULL;
-
             ret = Success;
 	}
     }
diff-tree a31d11a7a8485cdc799f76c4d407d3b7f7c9b350 (from bedc4ecf23c7150e3156e0d24602ed3bc3977225)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Aug 7 23:01:23 2006 +0300

    GKVE: get rid of bogus double-release check
    Get rid of a bogus double-release check which broke non-XKB servers.

diff --git a/dix/events.c b/dix/events.c
index 002b47d..e5ae3e6 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4727,14 +4727,6 @@ int GetKeyboardValuatorEvents(xEvent **x
                                                KeyRelease, key_code,
                                                num_valuators, valuators);
     }
-    else if (type == KeyRelease &&
-             !((pDev->key->down[key_code >> 3] & (key_code & 7)) & 1)
-#ifdef XKB
-             && noXkbExtension
-#endif
-             ) {
-        return;
-    }
 
     ev = (xEvent *)xcalloc(sizeof(xEvent), numEvents);
     if (!ev)
diff-tree bedc4ecf23c7150e3156e0d24602ed3bc3977225 (from baf93b3abe1e88d82ee6a3d6939f50f96ded271a)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Aug 7 23:00:45 2006 +0300

    xephyr: aid input debugging
    Add the 'ephyr' mouse and keyboard drivers to the driver list so we can
    re-add devices.
    Set the names properly in Ephyr{Keyboard,Mouse}Init, not in InitInput.

diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c
index d3c9bf9..7db8675 100644
--- a/hw/kdrive/ephyr/ephyr.c
+++ b/hw/kdrive/ephyr/ephyr.c
@@ -865,6 +865,7 @@ MouseInit (KdPointerInfo *pi)
     ((EphyrPointerPrivate *)pi->driverPrivate)->enabled = FALSE;
     pi->nAxes = 3;
     pi->nButtons = 32;
+    pi->name = KdSaveString("Xephyr virtual mouse");
     ephyrMouse = pi;
     return Success;
 }
@@ -917,6 +918,7 @@ EphyrKeyboardInit (KdKeyboardInfo *ki)
   ki->maxScanCode = ki->keySyms.maxKeyCode;
   ki->keySyms.mapWidth = ephyrKeySyms.mapWidth;
   ki->keySyms.map = ephyrKeySyms.map;
+  ki->name = KdSaveString("Xephyr virtual keyboard");
   ephyrKbd = ki;
   return Success;
 }
diff --git a/hw/kdrive/ephyr/ephyrinit.c b/hw/kdrive/ephyr/ephyrinit.c
index 021abd6..a77b87e 100644
--- a/hw/kdrive/ephyr/ephyrinit.c
+++ b/hw/kdrive/ephyr/ephyrinit.c
@@ -58,14 +58,14 @@ InitInput (int argc, char **argv)
   if (!ki)
     FatalError("Couldn't create Xephyr keyboard\n");
   ki->driver = &EphyrKeyboardDriver;
-  ki->name = KdSaveString("Xephyr virtual keyboard");
+  KdAddKeyboardDriver(&EphyrKeyboardDriver);
   KdAddKeyboard(ki);
 
   pi = KdNewPointer();
   if (!pi)
     FatalError("Couldn't create Xephyr pointer\n");
   pi->driver = &EphyrMouseDriver;
-  pi->name = KdSaveString("Xephyr virtual mouse");
+  KdAddPointerDriver(&EphyrMouseDriver);
   KdAddPointer(pi);
 
   KdInitInput();



More information about the xorg-commit mailing list