dix: if a client has a core grab, return the grab device on QueryPointer.
The correct thing would be to return the ClientPointer. However, if the client for some reason has a core grab on another device (e.g. as result of a passive grab), return the coordinates of the grabbed device instead. This makes the use of nautilus a bit saner.
This commit is contained in:
parent
cd2ad4c2ed
commit
6492d513c0
16
dix/events.c
16
dix/events.c
|
@ -5595,7 +5595,8 @@ ProcQueryPointer(ClientPtr client)
|
||||||
xQueryPointerReply rep;
|
xQueryPointerReply rep;
|
||||||
WindowPtr pWin, t;
|
WindowPtr pWin, t;
|
||||||
DeviceIntPtr mouse = PickPointer(client);
|
DeviceIntPtr mouse = PickPointer(client);
|
||||||
SpritePtr pSprite = mouse->spriteInfo->sprite;
|
DeviceIntPtr dev;
|
||||||
|
SpritePtr pSprite;
|
||||||
int rc;
|
int rc;
|
||||||
REQUEST(xResourceReq);
|
REQUEST(xResourceReq);
|
||||||
REQUEST_SIZE_MATCH(xResourceReq);
|
REQUEST_SIZE_MATCH(xResourceReq);
|
||||||
|
@ -5607,6 +5608,19 @@ ProcQueryPointer(ClientPtr client)
|
||||||
if (rc != Success)
|
if (rc != Success)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
|
for (dev = inputInfo.devices; dev; dev = dev->next)
|
||||||
|
{
|
||||||
|
if (dev->isMaster && IsPointerDevice(dev) &&
|
||||||
|
dev->deviceGrab.grab && dev->deviceGrab.grab->coreGrab &&
|
||||||
|
SameClient(dev->deviceGrab.grab, client))
|
||||||
|
{
|
||||||
|
/* special case, we have a grab on the device so we need to return
|
||||||
|
* this one */
|
||||||
|
mouse = dev;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pSprite = mouse->spriteInfo->sprite;
|
||||||
if (mouse->valuator->motionHintWindow)
|
if (mouse->valuator->motionHintWindow)
|
||||||
MaybeStopHint(mouse, client);
|
MaybeStopHint(mouse, client);
|
||||||
rep.type = X_Reply;
|
rep.type = X_Reply;
|
||||||
|
|
Loading…
Reference in New Issue