diff options
author | Keith Packard <keithp@keithp.com> | 2015-11-23 16:04:54 -0800 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2016-07-05 01:36:23 +0200 |
commit | ee090f9785571343235d5ebda070bca37ab600cb (patch) | |
tree | f6c172c0877ba2363c0faf67bdc7634732121127 | |
parent | c6aa0c804a839418425b06504975780d7c1e978d (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.c | 11 |
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, |