diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2010-03-17 14:32:38 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2010-04-09 10:50:53 +1000 |
commit | e7154e9375e6b624db01a787d9ec6c8cedc2eb81 (patch) | |
tree | ad96bf853f66663533ddaf39958ac69bf6ace344 | |
parent | d33b3bf41b92e088e7aacbbcb01df18bae50baa8 (diff) |
dix: if owner-events is true for passive grabs, add the window mask (#25400)
A client requesting a GrabModeSync button grab, owner-events true, with only
the ButtonRelease mask set would never receive the press event even if the
grab window had the ButtonPress mask set.
The protocol requires that if owner-events is true, then the delivery mask
is the combination of the grab mask + the window event mask.
X.Org Bug 25400 <http://bugs.freedesktop.org/show_bug.cgi?id=25400>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Tested-by: Jim Ramsay <i.am@jimramsay.com>
Signed-off-by: Keith Packard <keithp@keithp.com>
(cherry picked from commit 1c612acca8568fcdf9761d23f112adaf4d496f1b)
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r-- | dix/events.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/dix/events.c b/dix/events.c index 3c625db6e..732740e82 100644 --- a/dix/events.c +++ b/dix/events.c @@ -3552,6 +3552,8 @@ CheckPassiveGrabsOnWindow( xE = &core; count = 1; mask = grab->eventMask; + if (grab->ownerEvents) + mask |= pWin->eventMask; } else if (match & XI2_MATCH) { rc = EventToXI2((InternalEvent*)event, &xE); @@ -3573,6 +3575,24 @@ CheckPassiveGrabsOnWindow( mask = grab->xi2mask[device->id][((xGenericEvent*)xE)->evtype/8]; else if (event->type == XI_Enter || event->type == XI_FocusIn) mask = grab->xi2mask[device->id][event->type/8]; + + if (grab->ownerEvents && wOtherInputMasks(grab->window)) + { + InputClientsPtr icp = + wOtherInputMasks(grab->window)->inputClients; + + while(icp) + { + if (rClient(icp) == rClient(grab)) + { + int evtype = (xE) ? ((xGenericEvent*)xE)->evtype : event->type; + mask |= icp->xi2mask[device->id][evtype/8]; + break; + } + + icp = icp->next; + } + } } else { rc = EventToXI((InternalEvent*)event, &xE, &count); @@ -3584,6 +3604,22 @@ CheckPassiveGrabsOnWindow( continue; } mask = grab->eventMask; + if (grab->ownerEvents && wOtherInputMasks(grab->window)) + { + InputClientsPtr icp = + wOtherInputMasks(grab->window)->inputClients; + + while(icp) + { + if (rClient(icp) == rClient(grab)) + { + mask |= icp->mask[device->id]; + break; + } + + icp = icp->next; + } + } } (*grabinfo->ActivateGrab)(device, grab, currentTime, TRUE); |