input: add support for XIAllDevices and XIAllMasterDevices passive grabs.
These grabs are suported through two fake devices inputInfo.all_devices and inputInfo.all_master_devices. These devices are not part of the device list and are only initialised for their device id, nothing else. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
parent
f00cf76751
commit
a66686a83e
14
Xi/extinit.c
14
Xi/extinit.c
|
@ -188,6 +188,9 @@ static struct dev_type
|
||||||
CARD8 event_base[numInputClasses];
|
CARD8 event_base[numInputClasses];
|
||||||
XExtEventInfo EventInfo[32];
|
XExtEventInfo EventInfo[32];
|
||||||
|
|
||||||
|
static DeviceIntRec xi_all_devices;
|
||||||
|
static DeviceIntRec xi_all_master_devices;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dispatch vector. Functions defined in here will be called when the matching
|
* Dispatch vector. Functions defined in here will be called when the matching
|
||||||
* request arrives.
|
* request arrives.
|
||||||
|
@ -1215,6 +1218,17 @@ XInputExtensionInit(void)
|
||||||
EventSwapVector[DevicePresenceNotify] = SEventIDispatch;
|
EventSwapVector[DevicePresenceNotify] = SEventIDispatch;
|
||||||
|
|
||||||
GERegisterExtension(IReqCode, XI2EventSwap);
|
GERegisterExtension(IReqCode, XI2EventSwap);
|
||||||
|
|
||||||
|
|
||||||
|
memset(&xi_all_devices, 0, sizeof(xi_all_devices));
|
||||||
|
memset(&xi_all_master_devices, 0, sizeof(xi_all_master_devices));
|
||||||
|
xi_all_devices.id = XIAllDevices;
|
||||||
|
xi_all_devices.name = "XIAllDevices";
|
||||||
|
xi_all_master_devices.id = XIAllMasterDevices;
|
||||||
|
xi_all_master_devices.name = "XIAllMasterDevices";
|
||||||
|
|
||||||
|
inputInfo.all_devices = &xi_all_devices;
|
||||||
|
inputInfo.all_master_devices = &xi_all_master_devices;
|
||||||
} else {
|
} else {
|
||||||
FatalError("IExtensionInit: AddExtensions failed\n");
|
FatalError("IExtensionInit: AddExtensions failed\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,9 +90,16 @@ ProcXIPassiveGrabDevice(ClientPtr client)
|
||||||
REQUEST(xXIPassiveGrabDeviceReq);
|
REQUEST(xXIPassiveGrabDeviceReq);
|
||||||
REQUEST_AT_LEAST_SIZE(xXIPassiveGrabDeviceReq);
|
REQUEST_AT_LEAST_SIZE(xXIPassiveGrabDeviceReq);
|
||||||
|
|
||||||
ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGrabAccess);
|
if (stuff->deviceid == XIAllDevices)
|
||||||
if (ret != Success)
|
dev = inputInfo.all_devices;
|
||||||
return ret;
|
else if (stuff->deviceid == XIAllMasterDevices)
|
||||||
|
dev = inputInfo.all_master_devices;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGrabAccess);
|
||||||
|
if (ret != Success)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
if (stuff->grab_type != XIGrabtypeButton &&
|
if (stuff->grab_type != XIGrabtypeButton &&
|
||||||
stuff->grab_type != XIGrabtypeKeysym &&
|
stuff->grab_type != XIGrabtypeKeysym &&
|
||||||
|
|
12
dix/events.c
12
dix/events.c
|
@ -248,6 +248,18 @@ static Bool CheckPassiveGrabsOnWindow(WindowPtr pWin,
|
||||||
*
|
*
|
||||||
* inputInfo.numDevices
|
* inputInfo.numDevices
|
||||||
* Total number of devices.
|
* Total number of devices.
|
||||||
|
*
|
||||||
|
* inputInfo.all_devices
|
||||||
|
* Virtual device used for XIAllDevices passive grabs. This device is
|
||||||
|
* not part of the inputInfo.devices list and mostly unset except for
|
||||||
|
* the deviceid. It exists because passivegrabs need a valid device
|
||||||
|
* reference.
|
||||||
|
*
|
||||||
|
* inputInfo.all_master_devices
|
||||||
|
* Virtual device used for XIAllMasterDevices passive grabs. This device
|
||||||
|
* is not part of the inputInfo.devices list and mostly unset except for
|
||||||
|
* the deviceid. It exists because passivegrabs need a valid device
|
||||||
|
* reference.
|
||||||
*/
|
*/
|
||||||
InputInfo inputInfo;
|
InputInfo inputInfo;
|
||||||
|
|
||||||
|
|
20
dix/grabs.c
20
dix/grabs.c
|
@ -267,7 +267,25 @@ GrabMatchesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab, Bool ignoreDevice)
|
||||||
if (pFirstGrab->grabtype != pSecondGrab->grabtype)
|
if (pFirstGrab->grabtype != pSecondGrab->grabtype)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (!ignoreDevice &&
|
if (pFirstGrab->grabtype == GRABTYPE_XI2)
|
||||||
|
{
|
||||||
|
if (pFirstGrab->device == inputInfo.all_devices ||
|
||||||
|
pSecondGrab->device == inputInfo.all_devices)
|
||||||
|
{
|
||||||
|
/* do nothing */
|
||||||
|
} else if (pFirstGrab->device == inputInfo.all_master_devices)
|
||||||
|
{
|
||||||
|
if (pSecondGrab->device != inputInfo.all_master_devices &&
|
||||||
|
!IsMaster(pSecondGrab->device))
|
||||||
|
return FALSE;
|
||||||
|
} else if (pSecondGrab->device == inputInfo.all_master_devices)
|
||||||
|
{
|
||||||
|
if (pFirstGrab->device != inputInfo.all_master_devices &&
|
||||||
|
!IsMaster(pFirstGrab->device))
|
||||||
|
return FALSE;
|
||||||
|
} else if (pSecondGrab->device != pFirstGrab->device)
|
||||||
|
return FALSE;
|
||||||
|
} else if (!ignoreDevice &&
|
||||||
((pFirstGrab->device != pSecondGrab->device) ||
|
((pFirstGrab->device != pSecondGrab->device) ||
|
||||||
(pFirstGrab->modifierDevice != pSecondGrab->modifierDevice)))
|
(pFirstGrab->modifierDevice != pSecondGrab->modifierDevice)))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
|
@ -528,6 +528,8 @@ typedef struct {
|
||||||
DeviceIntPtr off_devices; /* all devices turned off */
|
DeviceIntPtr off_devices; /* all devices turned off */
|
||||||
DeviceIntPtr keyboard; /* the main one for the server */
|
DeviceIntPtr keyboard; /* the main one for the server */
|
||||||
DeviceIntPtr pointer;
|
DeviceIntPtr pointer;
|
||||||
|
DeviceIntPtr all_devices;
|
||||||
|
DeviceIntPtr all_master_devices;
|
||||||
} InputInfo;
|
} InputInfo;
|
||||||
|
|
||||||
extern _X_EXPORT InputInfo inputInfo;
|
extern _X_EXPORT InputInfo inputInfo;
|
||||||
|
|
Loading…
Reference in New Issue