dix: let PickPointer() return devices that are core-grabbed by the client.
If the client currently holds a core grab on any device, this device has priority, even over the ClientPointer.
This commit is contained in:
parent
f5ac98747d
commit
93ee338307
23
dix/events.c
23
dix/events.c
|
@ -6435,10 +6435,31 @@ SetClientPointer(ClientPtr client, ClientPtr setter, DeviceIntPtr device)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PickPointer will pick an appropriate pointer for the given client. */
|
/* PickPointer will pick an appropriate pointer for the given client.
|
||||||
|
*
|
||||||
|
* An "appropriate device" is (in order of priority):
|
||||||
|
* 1) A device the given client has a core grab on.
|
||||||
|
* 2) A device set as ClientPointer for the given client.
|
||||||
|
* 3) The first master device.
|
||||||
|
*/
|
||||||
_X_EXPORT DeviceIntPtr
|
_X_EXPORT DeviceIntPtr
|
||||||
PickPointer(ClientPtr client)
|
PickPointer(ClientPtr client)
|
||||||
{
|
{
|
||||||
|
DeviceIntPtr it = inputInfo.devices;
|
||||||
|
|
||||||
|
/* First, check if the client currently has a grab on a device. Even
|
||||||
|
* keyboards count. */
|
||||||
|
for(it = inputInfo.devices; it; it = it->next)
|
||||||
|
{
|
||||||
|
GrabPtr grab = it->deviceGrab.grab;
|
||||||
|
if (grab && grab->coreGrab && SameClient(grab, client))
|
||||||
|
{
|
||||||
|
if (!IsPointerDevice(it))
|
||||||
|
it = GetPairedDevice(it);
|
||||||
|
return it; /* Always return a core grabbed device */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!client->clientPtr)
|
if (!client->clientPtr)
|
||||||
{
|
{
|
||||||
DeviceIntPtr it = inputInfo.devices;
|
DeviceIntPtr it = inputInfo.devices;
|
||||||
|
|
Loading…
Reference in New Issue