[gtk+] gdk: strengthen touch crossing event synthesizing on programmatical crossings



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]