diff options
author | Povilas Kanapickas <povilas@radix.lt> | 2020-12-20 00:48:22 +0200 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2021-02-15 04:40:16 +0000 |
commit | 213129012bc0fe508a8a4180ffda1ef661894049 (patch) | |
tree | e01b7566ae3756ee68a8c2f307a8100d66f045c4 /Xi | |
parent | 30e11535afb3c4efc3a5cef640de44c7cd9bb561 (diff) |
Xi: Deliver pointer emulated touch events to grabbing client
Delivery of emulated events usually happens only to the owning client.
If there are grabs, only the grabbing client may receive these events.
This logic does not work during the touch event replay in
DeactivatePointerGrab(), as the previous grab is no longer in the
listener queue of the touch, so the next owner gets whole emulated event
sequence. This may trigger implicit grabs. After replay,
DeactivatePointerGrab() will update the global grab without regard to
this new implicit grab, which leads to issues down the line.
This change is effectively the same as 35e5a76cc1 except that the change
is limited to only emulated pointer events. Otherwise, in the case of a
device grab we end up not sending any touch events to clients that
selected XI_TouchOwnership event and should get touch events before they
get ownership of touch sequence.
Fixes #7
https://bugs.freedesktop.org/show_bug.cgi?id=96536
Diffstat (limited to 'Xi')
-rw-r--r-- | Xi/exevents.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/Xi/exevents.c b/Xi/exevents.c index 29c617c14..dd3e90ae5 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -1373,6 +1373,16 @@ DeliverTouchEmulatedEvent(DeviceIntPtr dev, TouchPointInfoPtr ti, int nevents; DeviceIntPtr kbd; + /* There may be a pointer grab on the device */ + if (!grab) { + grab = dev->deviceGrab.grab; + if (grab) { + win = grab->window; + xi2mask = grab->xi2mask; + client = rClient(grab); + } + } + /* We don't deliver pointer events to non-owners */ if (!TouchResourceIsOwner(ti, listener->listener)) return !Success; @@ -1502,16 +1512,6 @@ DeliverEmulatedMotionEvent(DeviceIntPtr dev, TouchPointInfoPtr ti, &mask)) return; - /* There may be a pointer grab on the device */ - if (!grab) { - grab = dev->deviceGrab.grab; - if (grab) { - win = grab->window; - mask = grab->xi2mask; - client = rClient(grab); - } - } - DeliverTouchEmulatedEvent(dev, ti, (InternalEvent*)&motion, &ti->listeners[0], client, win, grab, mask); } |