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);
|
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.
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
32
dix/events.c
32
dix/events.c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -149,10 +149,6 @@ AssignTypeAndName (
|
||||||
char * /* name */
|
char * /* name */
|
||||||
);
|
);
|
||||||
|
|
||||||
Bool IsPointerDevice(
|
|
||||||
DeviceIntPtr /* dev */
|
|
||||||
);
|
|
||||||
|
|
||||||
void
|
void
|
||||||
MakeDeviceTypeAtoms (
|
MakeDeviceTypeAtoms (
|
||||||
void
|
void
|
||||||
|
|
Loading…
Reference in New Issue
Block a user