2356ef3
From 883ed64cd23ad286250894b42c04603da85b65b5 Mon Sep 17 00:00:00 2001
2356ef3
From: Peter Hutterer <peter.hutterer@who-t.net>
2356ef3
Date: Wed, 16 Dec 2009 13:43:22 +1000
2356ef3
Subject: [PATCH] dix: if owner-events is true for passive grabs, add the window mask (#25400)
2356ef3
2356ef3
A client requesting a GrabModeSync button grab, owner-events true, with only
2356ef3
the ButtonRelease mask set would never receive the press event even if the
2356ef3
grab window had the ButtonPress mask set.
2356ef3
2356ef3
The protocol requires that if owner-events is true, then the delivery mask
2356ef3
is the combination of the grab mask + the window event mask.
2356ef3
2356ef3
X.Org Bug 25400 <http://bugs.freedesktop.org/show_bug.cgi?id=25400>
2356ef3
2356ef3
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2356ef3
Tested-by: Jim Ramsay <i.am@jimramsay.com>
2356ef3
---
2356ef3
 dix/events.c |   36 ++++++++++++++++++++++++++++++++++++
2356ef3
 1 files changed, 36 insertions(+), 0 deletions(-)
2356ef3
2356ef3
diff --git a/dix/events.c b/dix/events.c
2356ef3
index 85c8f9a..b854d98 100644
2356ef3
--- a/dix/events.c
2356ef3
+++ b/dix/events.c
2356ef3
@@ -3580,6 +3580,8 @@ CheckPassiveGrabsOnWindow(
2356ef3
                 xE = &cor;;
2356ef3
                 count = 1;
2356ef3
                 mask = grab->eventMask;
2356ef3
+                if (grab->ownerEvents)
2356ef3
+                    mask |= pWin->eventMask;
2356ef3
             } else if (match & XI2_MATCH)
2356ef3
             {
2356ef3
                 rc = EventToXI2((InternalEvent*)event, &xE;;
2356ef3
@@ -3601,6 +3603,24 @@ CheckPassiveGrabsOnWindow(
2356ef3
                     mask = grab->xi2mask[device->id][((xGenericEvent*)xE)->evtype/8];
2356ef3
                 else if (event->type == XI_Enter || event->type == XI_FocusIn)
2356ef3
                     mask = grab->xi2mask[device->id][event->type/8];
2356ef3
+
2356ef3
+                if (grab->ownerEvents && wOtherInputMasks(grab->window))
2356ef3
+                {
2356ef3
+                    InputClientsPtr icp =
2356ef3
+                        wOtherInputMasks(grab->window)->inputClients;
2356ef3
+
2356ef3
+                    while(icp)
2356ef3
+                    {
2356ef3
+                        if (rClient(icp) == rClient(grab))
2356ef3
+                        {
2356ef3
+                            int evtype = (xE) ? ((xGenericEvent*)xE)->evtype : event->type;
2356ef3
+                            mask |= icp->xi2mask[device->id][evtype/8];
2356ef3
+                            break;
2356ef3
+                        }
2356ef3
+
2356ef3
+                        icp = icp->next;
2356ef3
+                    }
2356ef3
+                }
2356ef3
             } else
2356ef3
             {
2356ef3
                 rc = EventToXI((InternalEvent*)event, &xE, &count);
2356ef3
@@ -3612,6 +3632,22 @@ CheckPassiveGrabsOnWindow(
2356ef3
                     continue;
2356ef3
                 }
2356ef3
                 mask = grab->eventMask;
2356ef3
+                if (grab->ownerEvents && wOtherInputMasks(grab->window))
2356ef3
+                {
2356ef3
+                    InputClientsPtr icp =
2356ef3
+                        wOtherInputMasks(grab->window)->inputClients;
2356ef3
+
2356ef3
+                    while(icp)
2356ef3
+                    {
2356ef3
+                        if (rClient(icp) == rClient(grab))
2356ef3
+                        {
2356ef3
+                            mask |= icp->mask[device->id];
2356ef3
+                            break;
2356ef3
+                        }
2356ef3
+
2356ef3
+                        icp = icp->next;
2356ef3
+                    }
2356ef3
+                }
2356ef3
             }
2356ef3
 
2356ef3
 	    (*grabinfo->ActivateGrab)(device, grab, currentTime, TRUE);
2356ef3
-- 
2356ef3
1.6.6
2356ef3