diff options
author | Peter Hutterer <peter@cs.unisa.edu.au> | 2007-03-16 15:52:24 +1030 |
---|---|---|
committer | Peter Hutterer <peter@cs.unisa.edu.au> | 2007-03-16 15:52:24 +1030 |
commit | 65b0eb60b0b9e6405aa2e3d4c712ec4d2f0da070 (patch) | |
tree | 5df30d373d704eb79ae1d976d05d0aea66430bc3 | |
parent | 456f429ad655ab4d80e30c58291d801966a613b2 (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.c | 15 | ||||
-rw-r--r-- | dix/devices.c | 15 | ||||
-rw-r--r-- | dix/events.c | 32 | ||||
-rw-r--r-- | hw/xfree86/common/xf86Xinput.c | 11 | ||||
-rw-r--r-- | include/dix.h | 3 | ||||
-rw-r--r-- | include/extinit.h | 4 |
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 |