xserver: Branch 'master' - 5 commits

Peter Hutterer whot at kemper.freedesktop.org
Tue Jun 14 22:40:48 PDT 2011


 Xi/exevents.c |   28 ---------------
 dix/events.c  |  107 ++++++++++++++++++++++++++++++++++++++++++++++------------
 include/dix.h |    5 ++
 3 files changed, 92 insertions(+), 48 deletions(-)

New commits:
commit 08a7246f43c9f18079219a1c982bed558722f545
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri May 27 14:21:39 2011 +1000

    dix: rename ProcessRawEvents to dix/events.c:DeliverRawEvent
    
    No functional changes, prep work for future changes.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Cyril Brulebois <kibi at debian.org>
    Reviewed-by: Jeremy Huddleston <jeremyhu at apple.com>
    Reviewed-by: Daniel Stone <daniel at fooishbar.org>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 042ea69..3e3c67b 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -876,35 +876,6 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event)
     return DEFAULT;
 }
 
-static void
-ProcessRawEvent(RawDeviceEvent *ev, DeviceIntPtr device)
-{
-    GrabPtr grab = device->deviceGrab.grab;
-
-    if (grab)
-        DeliverGrabbedEvent((InternalEvent*)ev, device, FALSE);
-    else { /* deliver to all root windows */
-        xEvent *xi;
-        int i;
-        int filter;
-
-        i = EventToXI2((InternalEvent*)ev, (xEvent**)&xi);
-        if (i != Success)
-        {
-            ErrorF("[Xi] %s: XI2 conversion failed in %s (%d)\n",
-                    __func__, device->name, i);
-            return;
-        }
-
-        filter = GetEventFilter(device, xi);
-
-        for (i = 0; i < screenInfo.numScreens; i++)
-            DeliverEventsToWindow(device, screenInfo.screens[i]->root, xi, 1,
-                                  filter, NullGrab);
-        free(xi);
-    }
-}
-
 /**
  * Main device event processing function.
  * Called from when processing the events from the event queue.
@@ -932,7 +903,7 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
         ev->any.type == ET_RawButtonRelease ||
         ev->any.type == ET_RawMotion)
     {
-        ProcessRawEvent(&ev->raw_event, device);
+        DeliverRawEvent(&ev->raw_event, device);
         return;
     }
 
diff --git a/dix/events.c b/dix/events.c
index 9063c28..8a4c6b9 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2243,6 +2243,35 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
     return nondeliveries;
 }
 
+void
+DeliverRawEvent(RawDeviceEvent *ev, DeviceIntPtr device)
+{
+    GrabPtr grab = device->deviceGrab.grab;
+
+    if (grab)
+        DeliverGrabbedEvent((InternalEvent*)ev, device, FALSE);
+    else { /* deliver to all root windows */
+        xEvent *xi;
+        int i;
+        int filter;
+
+        i = EventToXI2((InternalEvent*)ev, (xEvent**)&xi);
+        if (i != Success)
+        {
+            ErrorF("[Xi] %s: XI2 conversion failed in %s (%d)\n",
+                    __func__, device->name, i);
+            return;
+        }
+
+        filter = GetEventFilter(device, xi);
+
+        for (i = 0; i < screenInfo.numScreens; i++)
+            DeliverEventsToWindow(device, screenInfo.screens[i]->root, xi, 1,
+                                  filter, NullGrab);
+        free(xi);
+    }
+}
+
 /* If the event goes to dontClient, don't send it and return 0.  if
    send works,  return 1 or if send didn't work, return 2.
    Only works for core events.
diff --git a/include/dix.h b/include/dix.h
index 9a111e8..b1bf9ed 100644
--- a/include/dix.h
+++ b/include/dix.h
@@ -387,6 +387,11 @@ extern _X_EXPORT int DeliverEventsToWindow(
     Mask /* filter */,
     GrabPtr /* grab */);
 
+extern _X_EXPORT void DeliverRawEvent(
+    RawDeviceEvent* /* ev */,
+    DeviceIntPtr /* dev */
+);
+
 extern int DeliverDeviceEvents(
     WindowPtr /* pWin */,
     InternalEvent* /* event */,
commit 0aa45c5c53e2e7ba0723f5a12c1a5f5d4baab933
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri May 27 14:19:45 2011 +1000

    Xi: use temporary variable for filter.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Jeremy Huddleston <jeremyhu at apple.com>
    Reviewed-by: Daniel Stone <daniel at fooishbar.org>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 3b0411d..042ea69 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -886,6 +886,7 @@ ProcessRawEvent(RawDeviceEvent *ev, DeviceIntPtr device)
     else { /* deliver to all root windows */
         xEvent *xi;
         int i;
+        int filter;
 
         i = EventToXI2((InternalEvent*)ev, (xEvent**)&xi);
         if (i != Success)
@@ -895,9 +896,11 @@ ProcessRawEvent(RawDeviceEvent *ev, DeviceIntPtr device)
             return;
         }
 
+        filter = GetEventFilter(device, xi);
+
         for (i = 0; i < screenInfo.numScreens; i++)
             DeliverEventsToWindow(device, screenInfo.screens[i]->root, xi, 1,
-                                  GetEventFilter(device, xi), NULL);
+                                  filter, NullGrab);
         free(xi);
     }
 }
commit a1beae635caf81ec31a8998687df0ae92b505fda
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri May 27 12:14:32 2011 +1000

    dix: split DeliverEventToWindowMask up a bit more.
    
    Move out the actual event delivery, it needs to be used from elsewhere.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Jeremy Huddleston <jeremyhu at apple.com>
    Reviewed-by: Daniel Stone <daniel at fooishbar.org>

diff --git a/dix/events.c b/dix/events.c
index 66fbe9a..9063c28 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2076,35 +2076,27 @@ out:
 }
 
 /**
- * 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.
+ * Try delivery on each client in inputclients, provided the event mask
+ * accepts it and there is no interfering core grab..
  */
 static enum EventDeliveryState
-DeliverEventToWindowMask(DeviceIntPtr dev, WindowPtr win, xEvent *events,
-                         int count, Mask filter, GrabPtr grab,
-                         ClientPtr *client_return, Mask *mask_return)
+DeliverEventToInputClients(DeviceIntPtr dev, InputClients *inputclients,
+                           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;
+    enum EventDeliveryState rc = EVENT_NOT_DELIVERED;
 
-    if (!GetClientsForDelivery(dev, win, events, filter, &other))
-        goto out;
-
-    rc = EVENT_NOT_DELIVERED;
-
-    for (; other; other = other->next)
+    for (; inputclients; inputclients = inputclients->next)
     {
         Mask mask;
-        ClientPtr client = rClient(other);
+        ClientPtr client = rClient(inputclients);
 
         if (IsInterferingGrab(client, dev, events))
             continue;
 
-        mask = GetEventMask(dev, events, other);
+        mask = GetEventMask(dev, events, inputclients);
 
         if (XaceHook(XACE_RECEIVE_ACCESS, client, win,
                     events, count))
@@ -2125,12 +2117,34 @@ DeliverEventToWindowMask(DeviceIntPtr dev, WindowPtr win, xEvent *events,
         }
     }
 
-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
+DeliverEventToWindowMask(DeviceIntPtr dev, WindowPtr win, xEvent *events,
+                         int count, Mask filter, GrabPtr grab,
+                         ClientPtr *client_return, Mask *mask_return)
+{
+    InputClients *clients;
+
+    if (!GetClientsForDelivery(dev, win, events, filter, &clients))
+        return EVENT_SKIP;
+
+    return DeliverEventToInputClients(dev, clients, win, events, count, filter,
+                                      grab, client_return, mask_return);
+
+}
+
+
+/**
  * Deliver events to a window. At this point, we do not yet know if the event
  * actually needs to be delivered. May activate a grab if the event is a
  * button press.
commit 58e4831ed68c2fbc219c7250e9837e76a73a6432
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri May 27 11:43:50 2011 +1000

    dix: rename DeliverEventsToClients to DeliverEventsToWindowMask
    
    To avoid confusion with a future patch and it better describes what this
    does anyway - delivering events to all clients that have the event mask on
    the window.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Jeremy Huddleston <jeremyhu at apple.com>
    Reviewed-by: Daniel Stone <daniel at fooishbar.org>

diff --git a/dix/events.c b/dix/events.c
index 20754f0..66fbe9a 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2083,9 +2083,9 @@ out:
  * 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)
+DeliverEventToWindowMask(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;
@@ -2192,8 +2192,8 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
     {
         enum EventDeliveryState rc;
 
-        rc = DeliverEventToClients(pDev, pWin, pEvents, count, filter, grab,
-                                   &client, &deliveryMask);
+        rc = DeliverEventToWindowMask(pDev, pWin, pEvents, count, filter,
+                                      grab, &client, &deliveryMask);
 
         switch(rc)
         {
commit 37a53f15b0dfa1b25f7e3e826c7c945453398ac5
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri May 27 11:40:56 2011 +1000

    dix: split client list retrieval out of DeliverEventToClients
    
    No functional change, but "other" was renamed to "clients".
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Jeremy Huddleston <jeremyhu at apple.com>
    Reviewed-by: Daniel Stone <daniel at fooishbar.org>

diff --git a/dix/events.c b/dix/events.c
index 3c7bd50..20754f0 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 Bool
+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)


More information about the xorg-commit mailing list