summaryrefslogtreecommitdiff
path: root/dix/devices.c
diff options
context:
space:
mode:
Diffstat (limited to 'dix/devices.c')
-rw-r--r--dix/devices.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/dix/devices.c b/dix/devices.c
index 42eebf104..0c1553e85 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -221,6 +221,11 @@ ActivateDevice(DeviceIntPtr dev)
SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask,
(xEvent *) &ev, 1);
+ if (IsPointerDevice(dev) && dev->isMPDev)
+ InitializeSprite(dev, GetCurrentRootWindow());
+ else
+ PairDevices(NULL, inputInfo.pointer, dev);
+
return ret;
}
@@ -403,7 +408,6 @@ InitCoreDevices()
inputInfo.pointer = dev;
inputInfo.pointer->next = NULL;
-
/* the core keyboard is initialised by now. set the keyboard's sprite
* to the core pointer's sprite. */
PairDevices(pairingClient, inputInfo.pointer, inputInfo.keyboard);
@@ -1995,6 +1999,9 @@ ProcQueryKeymap(ClientPtr client)
int
PairDevices(ClientPtr client, DeviceIntPtr ptr, DeviceIntPtr kbd)
{
+ if (!ptr)
+ return BadDevice;
+
if (!pairingClient)
RegisterPairingClient(client);
else if (pairingClient != client)
@@ -2032,6 +2039,8 @@ GetPairedPointer(DeviceIntPtr kbd)
/* Find the keyboard device that is paired with the given pointer. If none is
* found, return NULL.
+ * We also check if the paired device is a keyboard. If not (e.g. evdev brain)
+ * we don't return it. This probably needs to be fixed.
*/
_X_EXPORT DeviceIntPtr
GetPairedKeyboard(DeviceIntPtr ptr)
@@ -2040,7 +2049,9 @@ GetPairedKeyboard(DeviceIntPtr ptr)
while(dev)
{
- if (ptr != dev && ptr->pSprite == dev->pSprite)
+ if (ptr != dev &&
+ IsKeyboardDevice(dev) &&
+ ptr->pSprite == dev->pSprite)
return dev;
dev = dev->next;
}