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