[PATCH v2] dix: split client list retrieval out of DeliverEventToClients

Peter Hutterer peter.hutterer at who-t.net
Mon May 30 00:38:05 PDT 2011


No functional change, but "other" was renamed to "clients".

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
Turns out there was a functional change and the original patch would
sometimes return EVENT_SKIP when the correct value should have been
EVENT_NOT_DELIVERED. This caused drop-down menus in firefox to fail.

Changes to v1:
- change GetClientsForDelivery to return 0/1 depending on whether delivery
  should even be attempted. Then use that to return EVENT_NOT_DELIVERED or
  EVENT_SKIP

 dix/events.c |   50 ++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 36 insertions(+), 14 deletions(-)

diff --git a/dix/events.c b/dix/events.c
index ec4bf59..5ebf3eb 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2037,31 +2037,29 @@ DeliverToWindowOwner(DeviceIntPtr dev, WindowPtr win,
     return EVENT_NOT_DELIVERED;
 }
 
+
 /**
- * Deliver events to clients registered on the window.
+ * Get the list of clients that should be tried for event delivery on the
+ * given window.
  *
- * @param client_return On successful delivery, set to the recipient.
- * @param mask_return On successful delivery, set to the recipient's event
- * mask for this event.
+ * @return 1 if the client list should be traversed, zero if the event
+ * should be skipped.
  */
-static enum EventDeliveryState
-DeliverEventToClients(DeviceIntPtr dev, WindowPtr win, xEvent *events,
-                      int count, Mask filter, GrabPtr grab,
-                      ClientPtr *client_return, Mask *mask_return)
+static int
+GetClientsForDelivery(DeviceIntPtr dev, WindowPtr win,
+                      xEvent *events, Mask filter, InputClients **clients)
 {
-    int attempt;
-    enum EventDeliveryState rc = EVENT_SKIP;
-    InputClients *other;
+    int rc = 0;
 
     if (core_get_type(events) != 0)
-        other = (InputClients *)wOtherClients(win);
+        *clients = (InputClients *)wOtherClients(win);
     else if (xi2_get_type(events) != 0)
     {
         OtherInputMasks *inputMasks = wOtherInputMasks(win);
         /* Has any client selected for the event? */
         if (!GetWindowXI2Mask(dev, win, events))
             goto out;
-        other = inputMasks->inputClients;
+        *clients = inputMasks->inputClients;
     } else {
         OtherInputMasks *inputMasks = wOtherInputMasks(win);
         /* Has any client selected for the event? */
@@ -2069,9 +2067,33 @@ DeliverEventToClients(DeviceIntPtr dev, WindowPtr win, xEvent *events,
             !(inputMasks->inputEvents[dev->id] & filter))
             goto out;
 
-        other = inputMasks->inputClients;
+        *clients = inputMasks->inputClients;
     }
 
+    rc = 1;
+out:
+    return rc;
+}
+
+/**
+ * Deliver events to clients registered on the window.
+ *
+ * @param client_return On successful delivery, set to the recipient.
+ * @param mask_return On successful delivery, set to the recipient's event
+ * mask for this event.
+ */
+static enum EventDeliveryState
+DeliverEventToClients(DeviceIntPtr dev, WindowPtr win, xEvent *events,
+                      int count, Mask filter, GrabPtr grab,
+                      ClientPtr *client_return, Mask *mask_return)
+{
+    int attempt;
+    enum EventDeliveryState rc = EVENT_SKIP;
+    InputClients *other;
+
+    if (!GetClientsForDelivery(dev, win, events, filter, &other))
+        goto out;
+
     rc = EVENT_NOT_DELIVERED;
 
     for (; other; other = other->next)
-- 
1.7.5.1



More information about the xorg-devel mailing list