summaryrefslogtreecommitdiff
path: root/Xi
diff options
context:
space:
mode:
authorPovilas Kanapickas <povilas@radix.lt>2020-12-20 00:48:22 +0200
committerPeter Hutterer <peter.hutterer@who-t.net>2021-02-15 04:40:16 +0000
commit213129012bc0fe508a8a4180ffda1ef661894049 (patch)
treee01b7566ae3756ee68a8c2f307a8100d66f045c4 /Xi
parent30e11535afb3c4efc3a5cef640de44c7cd9bb561 (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.c20
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);
}