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'.
This commit is contained in:
Peter Hutterer 2007-03-16 15:52:24 +10:30
parent 456f429ad6
commit 65b0eb60b0
6 changed files with 49 additions and 31 deletions

View File

@ -983,21 +983,6 @@ AssignTypeAndName(DeviceIntPtr dev, Atom type, char *name)
strcpy(dev->name, name); strcpy(dev->name, 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. * Make device type atoms.

View File

@ -221,6 +221,11 @@ ActivateDevice(DeviceIntPtr dev)
SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask, SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask,
(xEvent *) &ev, 1); (xEvent *) &ev, 1);
if (IsPointerDevice(dev) && dev->isMPDev)
InitializeSprite(dev, GetCurrentRootWindow());
else
PairDevices(NULL, inputInfo.pointer, dev);
return ret; return ret;
} }
@ -403,7 +408,6 @@ InitCoreDevices()
inputInfo.pointer = dev; inputInfo.pointer = dev;
inputInfo.pointer->next = NULL; inputInfo.pointer->next = NULL;
/* the core keyboard is initialised by now. set the keyboard's sprite /* the core keyboard is initialised by now. set the keyboard's sprite
* to the core pointer's sprite. */ * to the core pointer's sprite. */
PairDevices(pairingClient, inputInfo.pointer, inputInfo.keyboard); PairDevices(pairingClient, inputInfo.pointer, inputInfo.keyboard);
@ -1995,6 +1999,9 @@ ProcQueryKeymap(ClientPtr client)
int int
PairDevices(ClientPtr client, DeviceIntPtr ptr, DeviceIntPtr kbd) PairDevices(ClientPtr client, DeviceIntPtr ptr, DeviceIntPtr kbd)
{ {
if (!ptr)
return BadDevice;
if (!pairingClient) if (!pairingClient)
RegisterPairingClient(client); RegisterPairingClient(client);
else if (pairingClient != 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 /* Find the keyboard device that is paired with the given pointer. If none is
* found, return NULL. * 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 _X_EXPORT DeviceIntPtr
GetPairedKeyboard(DeviceIntPtr ptr) GetPairedKeyboard(DeviceIntPtr ptr)
@ -2040,7 +2049,9 @@ GetPairedKeyboard(DeviceIntPtr ptr)
while(dev) while(dev)
{ {
if (ptr != dev && ptr->pSprite == dev->pSprite) if (ptr != dev &&
IsKeyboardDevice(dev) &&
ptr->pSprite == dev->pSprite)
return dev; return dev;
dev = dev->next; dev = dev->next;
} }

View File

@ -250,6 +250,27 @@ DevHasCursor(DeviceIntPtr pDev)
return (pDev != inputInfo.pointer && pDev->spriteOwner); 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 #ifdef XEVIE
_X_EXPORT WindowPtr xeviewin; _X_EXPORT WindowPtr xeviewin;
_X_EXPORT HotSpot xeviehot; _X_EXPORT HotSpot xeviehot;
@ -4914,9 +4935,16 @@ _X_EXPORT DeviceIntPtr
PickKeyboard(ClientPtr client) PickKeyboard(ClientPtr client)
{ {
DeviceIntPtr ptr = PickPointer(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; return (kbd) ? kbd : inputInfo.keyboard;
} }

View File

@ -186,14 +186,6 @@ xf86ActivateDevice(LocalDevicePtr local)
} }
#endif #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); RegisterOtherDevice(dev);
if (serverGeneration == 1) if (serverGeneration == 1)
@ -426,6 +418,9 @@ NewInputDeviceRequest (InputOption *options)
if (dev->inited && dev->startup) if (dev->inited && dev->startup)
EnableDevice(dev); EnableDevice(dev);
if (!IsPointerDevice(dev))
PairDevices(NULL, GuessFreePointerDevice(), dev);
/* send enter/leave event, update sprite window */ /* send enter/leave event, update sprite window */
CheckMotion(NULL, dev); CheckMotion(NULL, dev);

View File

@ -757,4 +757,7 @@ extern int ffs(int i);
extern Bool DevHasCursor(DeviceIntPtr pDev); extern Bool DevHasCursor(DeviceIntPtr pDev);
extern Bool IsPointerDevice( DeviceIntPtr dev);
extern Bool IsKeyboardDevice(DeviceIntPtr dev);
#endif /* DIX_H */ #endif /* DIX_H */

View File

@ -149,10 +149,6 @@ AssignTypeAndName (
char * /* name */ char * /* name */
); );
Bool IsPointerDevice(
DeviceIntPtr /* dev */
);
void void
MakeDeviceTypeAtoms ( MakeDeviceTypeAtoms (
void void