[gtk+] gdk: strengthen touch crossing event synthesizing on programmatical crossings
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] gdk: strengthen touch crossing event synthesizing on programmatical crossings
- Date: Tue, 15 Jan 2013 16:52:31 +0000 (UTC)
commit 3210cd6511e99507a36454576b896efa785daf3c
Author: Carlos Garnacho <carlos lanedo com>
Date: Mon Dec 3 18:28:57 2012 +0100
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 60bbb44..b02ab8a 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 065dfcd..e337d53 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)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]