From 213129012bc0fe508a8a4180ffda1ef661894049 Mon Sep 17 00:00:00 2001 From: Povilas Kanapickas Date: Sun, 20 Dec 2020 00:48:22 +0200 Subject: [PATCH] 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 --- Xi/exevents.c | 20 ++++++++++---------- 1 file 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); }