summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2015-11-23 16:04:54 -0800
committerKeith Packard <keithp@keithp.com>2016-07-05 01:36:23 +0200
commitee090f9785571343235d5ebda070bca37ab600cb (patch)
treef6c172c0877ba2363c0faf67bdc7634732121127
parentc6aa0c804a839418425b06504975780d7c1e978d (diff)
Deliver input events exclusively to window owner
When the window owner selects for core keyboard and mouse events, don't go looking for other clients to deliver those events to. This means that if the window owner receives a key or mouse event, then it can know that no other client could have also received the same event. This could be generalized to deliver input events to only one client, but which client would receive the event is less well defined as it would depend on the order that clients selected for input on particular windows. Signed-off-by: Keith Packard <keithp@keithp.com> Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Adam Jackson <ajax@redhat.com>
-rw-r--r--dix/events.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/dix/events.c b/dix/events.c
index a6fefa960..ff9dd6861 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -160,6 +160,12 @@ Equipment Corporation.
#define PropagateMask ( \
KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | \
MotionMask )
+
+/* Deliver these events only to the owner if the owner selects them */
+#define OwnerPriorityMask (\
+ KeyPressMask | KeyReleaseMask | \
+ ButtonPressMask | ButtonReleaseMask | PointerMotionMask)
+
#define PointerGrabMask ( \
ButtonPressMask | ButtonReleaseMask | \
EnterWindowMask | LeaveWindowMask | \
@@ -2254,6 +2260,7 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
Mask deliveryMask = 0; /* If a grab occurs due to a button press, then
this mask is the mask of the grab. */
int type = pEvents->u.u.type;
+ Bool deliver_other_clients = TRUE;
/* Deliver to window owner */
if ((filter == CantBeFiltered) || core_get_type(pEvents) != 0) {
@@ -2270,6 +2277,8 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
case EVENT_DELIVERED:
/* We delivered to the owner, with our event mask */
deliveries++;
+ if (filter & OwnerPriorityMask)
+ deliver_other_clients = FALSE;
client = wClient(pWin);
deliveryMask = pWin->eventMask;
break;
@@ -2279,7 +2288,7 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
}
/* CantBeFiltered means only window owner gets the event */
- if (filter != CantBeFiltered) {
+ if (filter != CantBeFiltered && deliver_other_clients) {
enum EventDeliveryState rc;
rc = DeliverEventToWindowMask(pDev, pWin, pEvents, count, filter,