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:
parent
456f429ad6
commit
65b0eb60b0
15
Xi/extinit.c
15
Xi/extinit.c
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
32
dix/events.c
32
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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -149,10 +149,6 @@ AssignTypeAndName (
|
|||
char * /* name */
|
||||
);
|
||||
|
||||
Bool IsPointerDevice(
|
||||
DeviceIntPtr /* dev */
|
||||
);
|
||||
|
||||
void
|
||||
MakeDeviceTypeAtoms (
|
||||
void
|
||||
|
|
Loading…
Reference in New Issue