1 From 873ef3430e92b0756c0dbe5033f6aec38a20d6ad Mon Sep 17 00:00:00 2001
2 From: Peter Hutterer <peter.hutterer@who-t.net>
3 Date: Wed, 16 Dec 2009 13:43:22 +1000
4 Subject: [PATCH] dix: if owner-events is true for passive grabs, add the window mask (#25400)
6 A client requesting a GrabModeSync button grab, owner-events true, with only
7 the ButtonRelease mask set would never receive the press event even if the
8 grab window had the ButtonPress mask set.
10 The protocol requires that if owner-events is true, then the delivery mask
11 is the combination of the grab mask + the window event mask.
13 X.Org Bug 25400 <http://bugs.freedesktop.org/show_bug.cgi?id=25400>
15 Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
17 dix/events.c | 36 ++++++++++++++++++++++++++++++++++++
18 1 files changed, 36 insertions(+), 0 deletions(-)
20 diff --git a/dix/events.c b/dix/events.c
21 index 7e0867c..12b12a8 100644
24 @@ -3590,6 +3590,8 @@ CheckPassiveGrabsOnWindow(
27 mask = grab->eventMask;
28 + if (grab->ownerEvents)
29 + mask |= pWin->eventMask;
30 } else if (match & XI2_MATCH)
32 rc = EventToXI2((InternalEvent*)event, &xE);
33 @@ -3611,6 +3613,24 @@ CheckPassiveGrabsOnWindow(
34 mask = grab->xi2mask[device->id][((xGenericEvent*)xE)->evtype/8];
35 else if (event->type == XI_Enter || event->type == XI_FocusIn)
36 mask = grab->xi2mask[device->id][event->type/8];
38 + if (grab->ownerEvents && wOtherInputMasks(grab->window))
40 + InputClientsPtr icp =
41 + wOtherInputMasks(grab->window)->inputClients;
45 + if (rClient(icp) == rClient(grab))
47 + int evtype = (xE) ? ((xGenericEvent*)xE)->evtype : event->type;
48 + mask |= icp->xi2mask[device->id][evtype/8];
57 rc = EventToXI((InternalEvent*)event, &xE, &count);
58 @@ -3622,6 +3642,22 @@ CheckPassiveGrabsOnWindow(
61 mask = grab->eventMask;
62 + if (grab->ownerEvents && wOtherInputMasks(grab->window))
64 + InputClientsPtr icp =
65 + wOtherInputMasks(grab->window)->inputClients;
69 + if (rClient(icp) == rClient(grab))
71 + mask |= icp->mask[device->id];
80 (*grabinfo->ActivateGrab)(device, grab, currentTime, TRUE);