From: Carlos Garnacho Date: Mon, 3 Dec 2012 17:28:57 +0000 (+0100) Subject: gdk: strengthen touch crossing event synthesizing on programmatical crossings X-Git-Url: http://pileus.org/git/?a=commitdiff_plain;h=3210cd6511e99507a36454576b896efa785daf3c;p=~andy%2Fgtk 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 --- diff --git a/gdk/gdkdisplay.c b/gdk/gdkdisplay.c index 60bbb44c8..b02ab8a54 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 065dfcd9f..e337d53ae 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)