summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter@cs.unisa.edu.au>2007-03-16 15:52:24 +1030
committerPeter Hutterer <peter@cs.unisa.edu.au>2007-03-16 15:52:24 +1030
commit65b0eb60b0b9e6405aa2e3d4c712ec4d2f0da070 (patch)
tree5df30d373d704eb79ae1d976d05d0aea66430bc3
parent456f429ad655ab4d80e30c58291d801966a613b2 (diff)
Xi: move IsPointerDevice into dix.
dix: IsPointerDevice and IsKeyboardDevice, use same ways to identify type of device as XI does for the XListInputDevices reply. Autopair each non-pointer device with VCP when activating, pair with real device after activation. Don't return non-keyboard devices when calling GetPairedKeyboard or PickKeyboard, otherwise we segfault for 'evdev brain'.
-rw-r--r--Xi/extinit.c15
-rw-r--r--dix/devices.c15
-rw-r--r--dix/events.c32
-rw-r--r--hw/xfree86/common/xf86Xinput.c11
-rw-r--r--include/dix.h3
-rw-r--r--include/extinit.h4
6 files changed, 49 insertions, 31 deletions
diff --git a/Xi/extinit.c b/Xi/extinit.c
index ff6e4ac0e..672d333e1 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -985,21 +985,6 @@ AssignTypeAndName(DeviceIntPtr dev, Atom type, char *name)
/***********************************************************************
*
- * Returns true if a device may require a pointer (is a mouse).
- * FIXME: Other devices should be able to get a pointer too...
- *
- */
-_X_EXPORT Bool
-IsPointerDevice(DeviceIntPtr dev)
-{
- if (dev_type[1].type == dev->type)
- return TRUE;
-
- return FALSE;
-}
-
-/***********************************************************************
- *
* Make device type atoms.
*
*/
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;
}
diff --git a/dix/events.c b/dix/events.c
index fbbae1de9..ca12d2285 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -250,6 +250,27 @@ DevHasCursor(DeviceIntPtr pDev)
return (pDev != inputInfo.pointer && pDev->spriteOwner);
}
+/*
+ * Return true if a device is a pointer, check is the same as used by XI to
+ * fill the 'use' field.
+ */
+_X_EXPORT Bool
+IsPointerDevice(DeviceIntPtr dev)
+{
+ return ((dev->valuator && dev->button) || dev == inputInfo.pointer);
+}
+
+/*
+ * Return true if a device is a keyboard, check is the same as used by XI to
+ * fill the 'use' field.
+ */
+_X_EXPORT Bool
+IsKeyboardDevice(DeviceIntPtr dev)
+{
+ return ((dev->key && dev->kbdfeed) || dev == inputInfo.keyboard);
+}
+
+
#ifdef XEVIE
_X_EXPORT WindowPtr xeviewin;
_X_EXPORT HotSpot xeviehot;
@@ -4914,9 +4935,16 @@ _X_EXPORT DeviceIntPtr
PickKeyboard(ClientPtr client)
{
DeviceIntPtr ptr = PickPointer(client);
- DeviceIntPtr kbd;
+ DeviceIntPtr kbd = inputInfo.devices;
- kbd = GetPairedKeyboard(ptr);
+ while(kbd)
+ {
+ if (ptr != kbd &&
+ IsKeyboardDevice(kbd) &&
+ ptr->pSprite == kbd->pSprite)
+ return kbd;
+ kbd = kbd->next;
+ }
return (kbd) ? kbd : inputInfo.keyboard;
}
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index c6d6b360e..db3998025 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -186,14 +186,6 @@ xf86ActivateDevice(LocalDevicePtr local)
}
#endif
- /* Only create a new sprite if it's a non-shared pointer */
- if (IsPointerDevice(dev) && dev->isMPDev)
- InitializeSprite(dev, GetCurrentRootWindow());
- else {
- /* pair with a free device */
- PairDevices(NULL, GuessFreePointerDevice(), dev);
- }
-
RegisterOtherDevice(dev);
if (serverGeneration == 1)
@@ -426,6 +418,9 @@ NewInputDeviceRequest (InputOption *options)
if (dev->inited && dev->startup)
EnableDevice(dev);
+ if (!IsPointerDevice(dev))
+ PairDevices(NULL, GuessFreePointerDevice(), dev);
+
/* send enter/leave event, update sprite window */
CheckMotion(NULL, dev);
diff --git a/include/dix.h b/include/dix.h
index 57cdce33d..44862ad23 100644
--- a/include/dix.h
+++ b/include/dix.h
@@ -757,4 +757,7 @@ extern int ffs(int i);
extern Bool DevHasCursor(DeviceIntPtr pDev);
+extern Bool IsPointerDevice( DeviceIntPtr dev);
+extern Bool IsKeyboardDevice(DeviceIntPtr dev);
+
#endif /* DIX_H */
diff --git a/include/extinit.h b/include/extinit.h
index d7aa54137..ead59be24 100644
--- a/include/extinit.h
+++ b/include/extinit.h
@@ -149,10 +149,6 @@ AssignTypeAndName (
char * /* name */
);
-Bool IsPointerDevice(
- DeviceIntPtr /* dev */
- );
-
void
MakeDeviceTypeAtoms (
void