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