summaryrefslogtreecommitdiff
path: root/dix/events.c
diff options
context:
space:
mode:
authorPovilas Kanapickas <povilas@radix.lt>2022-01-16 10:42:15 +0200
committerPovilas Kanapickas <povilas@radix.lt>2022-07-01 15:29:19 +0300
commit9d05ee10c231edacc69b342677ae8c3cc32f97e5 (patch)
tree09a85d78fb91352d6d221702d2917cd2850e82c6 /dix/events.c
parentb713e717c34d539486f661c03a0f1b35b3208d21 (diff)
dix: Don't send touch end to clients that do async grab without touches
GTK3 menu widget creates a selection for touch and other events and after receiving touch events creates an async grab that excludes touch events. Unfortunately it relies on X server not sending the touch end event in order to function properly. Sending touch end event will cause it to think that the initiating touch ended and when it actually ends, the ButtonRelease event will make it think that the menu should be closed. As a result, the menu will be open only for the duration of the touch making it useless. This commit reverts f682e0563f736ed2c2c612ed575e05b6e3db945e. Fixes: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1255 Signed-off-by: Povilas Kanapickas <povilas@radix.lt> (cherry picked from commit 43e934a19f644cddedae73602e86429c9dc5074a)
Diffstat (limited to 'dix/events.c')
-rw-r--r--dix/events.c15
1 files changed, 6 insertions, 9 deletions
diff --git a/dix/events.c b/dix/events.c
index 28d7d177c..782ed35dc 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -1505,16 +1505,13 @@ UpdateTouchesForGrab(DeviceIntPtr mouse)
CLIENT_BITS(listener->listener) == grab->resource) {
if (grab->grabtype == CORE || grab->grabtype == XI ||
!xi2mask_isset(grab->xi2mask, mouse, XI_TouchBegin)) {
+ /* Note that the grab will override any current listeners and if these listeners
+ already received touch events then this is the place to send touch end event
+ to complete the touch sequence.
- if (listener->type == TOUCH_LISTENER_REGULAR &&
- listener->state != TOUCH_LISTENER_AWAITING_BEGIN &&
- listener->state != TOUCH_LISTENER_HAS_END) {
- /* if the listener already got any events relating to the touch, we must send
- a touch end because the grab overrides the previous listener and won't
- itself send any touch events.
- */
- TouchEmitTouchEnd(mouse, ti, 0, listener->listener);
- }
+ Unfortunately GTK3 menu widget implementation relies on not getting touch end
+ event, so we can't fix the current behavior.
+ */
listener->type = TOUCH_LISTENER_POINTER_GRAB;
} else {
listener->type = TOUCH_LISTENER_GRAB;