7730e12c9e
resolves: rhbz#1729925
77 lines
2.5 KiB
Diff
77 lines
2.5 KiB
Diff
From 98e3db2ac43d4a3f13475cb160c8ce0155ac7d61 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= <mail@3v1n0.net>
|
|
Date: Fri, 26 Oct 2018 19:52:49 +0200
|
|
Subject: [PATCH xserver 01/15] Xi: Use current device active grab to deliver
|
|
touch events if any
|
|
|
|
When Retrieving touch delivery data we need to check if we have an active
|
|
grab on such device, and in that case use it to delivery events.
|
|
If we don't do this, when rejecting the touch events in DeactivatePointerGrab,
|
|
we will end-up in creating an implicit grab that will change the device
|
|
deviceGrab's state, causing a recursion during TouchEndTouch.
|
|
|
|
Fixes #7
|
|
|
|
https://bugs.freedesktop.org/show_bug.cgi?id=96536
|
|
(cherry picked from commit 35e5a76cc1d02801fadd49d12e60664b02e4bebc)
|
|
---
|
|
Xi/exevents.c | 21 ++++++++-------------
|
|
1 file changed, 8 insertions(+), 13 deletions(-)
|
|
|
|
diff --git a/Xi/exevents.c b/Xi/exevents.c
|
|
index 17d751e31..659816a46 100644
|
|
--- a/Xi/exevents.c
|
|
+++ b/Xi/exevents.c
|
|
@@ -1293,14 +1293,21 @@ RetrieveTouchDeliveryData(DeviceIntPtr dev, TouchPointInfoPtr ti,
|
|
int rc;
|
|
InputClients *iclients = NULL;
|
|
*mask = NULL;
|
|
+ *grab = NULL;
|
|
|
|
if (listener->type == LISTENER_GRAB ||
|
|
listener->type == LISTENER_POINTER_GRAB) {
|
|
-
|
|
*grab = listener->grab;
|
|
|
|
BUG_RETURN_VAL(!*grab, FALSE);
|
|
+ }
|
|
+ else if (ti->emulate_pointer && dev->deviceGrab.grab &&
|
|
+ !dev->deviceGrab.fromPassiveGrab) {
|
|
+ /* There may be an active pointer grab on the device */
|
|
+ *grab = dev->deviceGrab.grab;
|
|
+ }
|
|
|
|
+ if (*grab) {
|
|
*client = rClient(*grab);
|
|
*win = (*grab)->window;
|
|
*mask = (*grab)->xi2mask;
|
|
@@ -1357,8 +1364,6 @@ RetrieveTouchDeliveryData(DeviceIntPtr dev, TouchPointInfoPtr ti,
|
|
/* if owner selected, oclients is NULL */
|
|
*client = oclients ? rClient(oclients) : wClient(*win);
|
|
}
|
|
-
|
|
- *grab = NULL;
|
|
}
|
|
|
|
return TRUE;
|
|
@@ -1498,16 +1503,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);
|
|
}
|
|
--
|
|
2.21.0
|
|
|