From 3210cd6511e99507a36454576b896efa785daf3c Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Mon, 3 Dec 2012 18:28:57 +0100 Subject: [PATCH] gdk: strengthen touch crossing event synthesizing on programmatical crossings There are cases where crossing events aren't generated by input devices themselves but rather through programmatical means (windows being moved/hidden/destroyed while the pointer is on top). Those events come from X as sourceid=deviceid, and GDK does its deal at lessening this by setting a meaningful source device on such events, although this caused some confusion on the mechanism to block/synthesize touch crossing events that could possibly cause bogus enter events on the new window below the pointer. Fixes https://bugzilla.gnome.org/show_bug.cgi?id=691572 --- gdk/gdkdisplay.c | 3 ++- gdk/gdkwindow.c | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/gdk/gdkdisplay.c b/gdk/gdkdisplay.c index 60bbb44c8f..b02ab8a541 100644 --- a/gdk/gdkdisplay.c +++ b/gdk/gdkdisplay.c @@ -985,7 +985,8 @@ switch_to_pointer_grab (GdkDisplay *display, NULL, NULL); } - if (pointer_window != last_grab->window) + if (!info->need_touch_press_enter && + pointer_window != last_grab->window) synthesize_crossing_events (display, device, source_device, last_grab->window, pointer_window, GDK_CROSSING_UNGRAB, time, serial); diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c index 065dfcd9fc..e337d53ae1 100644 --- a/gdk/gdkwindow.c +++ b/gdk/gdkwindow.c @@ -8373,10 +8373,12 @@ send_crossing_event (GdkDisplay *display, window_event_mask = window->event_mask; if (type == GDK_ENTER_NOTIFY && - pointer_info->need_touch_press_enter && + (pointer_info->need_touch_press_enter || + gdk_device_get_source (source_device) == GDK_SOURCE_TOUCHSCREEN) && mode != GDK_CROSSING_TOUCH_BEGIN && mode != GDK_CROSSING_TOUCH_END) { + pointer_info->need_touch_press_enter = TRUE; block_event = TRUE; } else if (type == GDK_LEAVE_NOTIFY)