On Tue, Aug 09, 2011 at 08:48:36PM -0700, Keith Packard wrote:
> On Wed, 10 Aug 2011 12:56:32 +1000, Peter Hutterer <[email protected]> 
> wrote:
> 
> > Proximity events don't have an XI2 type and caused error messages in the
> > log when trying to get the event filter. Use this opportunity to clean up
> > the code, instead of manually setting the fields that GetEventFilter
> > requires use EventTo(XI2|XI|Core) instead.
> 
> Seems like this would look neater if it wasn't allocating events just to
> be able to use the GetEventFilter function.
> 
> This is on top of your patch; I haven't tested it at all, but does it
> look like a reasonable thing to do?

yes, I agree. I take your patch and raise you another one (on top of both).
Looking at the diff of those three together, the code is much easier to
follow now too. Though I might split up the patches to introduce the
functions first and then replace the EventIsDeliverable() code to fix the
original bug, I'll send out a separate sequence for this.

>From e1faa8dff2be68515d0d16d9841675aada1ff1c4 Mon Sep 17 00:00:00 2001
From: Peter Hutterer <[email protected]>
Date: Thu, 11 Aug 2011 10:13:09 +1000
Subject: [PATCH] dix: Abstract XI2 filter mask lookup through
 GetXI2EventMaskByte

Each time we need to get the XI2 event mask, we end up using (device->id |
XIAllDevices | XIAllMasterDevices). Abstract that away.

This commit also fixes a half-bug where GetWindowXI2Mask() would return the
XIAllDevices | XIAllMasterDevices mask as non-zero even when it is not set
for the current event mask. This would have only result in the event being
filtered later though.

Signed-off-by: Peter Hutterer <[email protected]>
---
 dix/events.c |   37 +++++++++++++++++++------------------
 1 files changed, 19 insertions(+), 18 deletions(-)

diff --git a/dix/events.c b/dix/events.c
index 6c4b6ef..1a84514 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -455,6 +455,20 @@ GetEventFilter(DeviceIntPtr dev, xEvent *event)
 }
 
 /**
+ * Return the single byte of the device's XI2 mask that contains the mask
+ * for the event_type.
+ */
+static int
+GetXI2MaskByte(unsigned char xi2mask[][XI2MASKSIZE], DeviceIntPtr dev, int 
event_type)
+{
+    int byte = GetXI2EventFilterOffset(event_type);
+    return xi2mask[dev->id][byte] |
+           xi2mask[XIAllDevices][byte] |
+           (IsMaster(dev) ? xi2mask[XIAllMasterDevices][byte] : 0);
+}
+
+
+/**
  * Return the windows complete XI2 mask for the given XI2 event type.
  */
 Mask
@@ -470,9 +484,7 @@ GetWindowXI2Mask(DeviceIntPtr dev, WindowPtr win, xEvent* 
ev)
     evtype = ((xGenericEvent*)ev)->evtype;
     filter = GetEventFilter(dev, ev);
 
-    return ((inputMasks->xi2mask[dev->id][evtype/8] & filter) ||
-            inputMasks->xi2mask[XIAllDevices][evtype/8] ||
-            (inputMasks->xi2mask[XIAllMasterDevices][evtype/8] && 
IsMaster(dev)));
+    return (GetXI2MaskByte(inputMasks->xi2mask, dev, evtype) & filter);
 }
 
 Mask
@@ -483,10 +495,7 @@ GetEventMask(DeviceIntPtr dev, xEvent *event, 
InputClients* other)
     /* XI2 filters are only ever 8 bit, so let's return a 8 bit mask */
     if ((evtype = xi2_get_type(event)))
     {
-        int byte = GetXI2EventFilterOffset(evtype);
-        return (other->xi2mask[dev->id][byte] |
-                other->xi2mask[XIAllDevices][byte] |
-                (IsMaster(dev)? other->xi2mask[XIAllMasterDevices][byte] : 0));
+        return GetXI2MaskByte(other->xi2mask, dev, evtype);
     } else if (core_get_type(event) != 0)
         return other->mask[XIAllDevices];
     else
@@ -2497,13 +2506,9 @@ EventIsDeliverable(DeviceIntPtr dev, InternalEvent* 
event, WindowPtr win)
 
     if ((type = GetXI2Type(event)) != 0)
     {
-       int byte = GetXI2EventFilterOffset(type);
         filter = GetXI2EventFilterMask(type);
 
-        if (type && inputMasks &&
-            ((inputMasks->xi2mask[XIAllDevices][byte] & filter) ||
-            ((inputMasks->xi2mask[XIAllMasterDevices][byte] & filter) && 
IsMaster(dev)) ||
-            (inputMasks->xi2mask[dev->id][byte] & filter)))
+        if (type && inputMasks && (GetXI2MaskByte(inputMasks->xi2mask,  dev, 
type) & filter))
             rc |= EVENT_XI2_MASK;
     }
 
@@ -4078,9 +4083,7 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr 
thisDev,
             if (rc == Success)
             {
                 int evtype = xi2_get_type(xi2);
-                mask = grab->xi2mask[XIAllDevices][evtype/8] |
-                    grab->xi2mask[XIAllMasterDevices][evtype/8] |
-                    grab->xi2mask[thisDev->id][evtype/8];
+                mask = GetXI2MaskByte(grab->xi2mask, thisDev, evtype);
                 /* try XI2 event */
                 FixUpEventFromWindow(pSprite, xi2, grab->window, None, TRUE);
                 /* XXX: XACE */
@@ -4559,9 +4562,7 @@ DeviceEnterLeaveEvent(
     if (grab)
     {
         Mask mask;
-        mask = grab->xi2mask[XIAllDevices][type/8] |
-               grab->xi2mask[XIAllMasterDevices][type/8] |
-               grab->xi2mask[mouse->id][type/8];
+        mask = GetXI2MaskByte(grab->xi2mask, mouse, type);
         TryClientEvents(rClient(grab), mouse, (xEvent*)event, 1, mask,
                         filter, grab);
     } else {
-- 
1.7.6

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to