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);
}
/***********************************************************************
*
* 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.

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);

View File

@ -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 */

View File

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