[gtk+] wayland: Unset "pointer emulating" touch on wl_touch.cancel



commit 77cf80f3a9e788a93519b3cde44c5106ddc760ae
Author: Carlos Garnacho <carlosg gnome org>
Date:   Wed Dec 9 12:46:08 2015 +0100

    wayland: Unset "pointer emulating" touch on wl_touch.cancel
    
    And emit the corresnponding leave event on its master pointer.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=759309

 gdk/wayland/gdkdevice-wayland.c |   19 ++++++++++++++-----
 1 files changed, 14 insertions(+), 5 deletions(-)
---
diff --git a/gdk/wayland/gdkdevice-wayland.c b/gdk/wayland/gdkdevice-wayland.c
index baf40bf..e6eaf62 100644
--- a/gdk/wayland/gdkdevice-wayland.c
+++ b/gdk/wayland/gdkdevice-wayland.c
@@ -1768,19 +1768,28 @@ static void
 touch_handle_cancel (void            *data,
                      struct wl_touch *wl_touch)
 {
-  GdkWaylandDeviceData *device = data;
+  GdkWaylandSeat *wayland_seat = data;
   GdkWaylandTouchData *touch;
   GHashTableIter iter;
   GdkEvent *event;
 
-  g_hash_table_iter_init (&iter, device->touches);
+  if (GDK_WAYLAND_DEVICE (wayland_seat->touch_master)->emulating_touch)
+    {
+      touch = GDK_WAYLAND_DEVICE (wayland_seat->touch_master)->emulating_touch;
+      GDK_WAYLAND_DEVICE (wayland_seat->touch_master)->emulating_touch = NULL;
+      emulate_touch_crossing (touch->window, NULL,
+                              wayland_seat->touch_master, wayland_seat->touch,
+                              touch, GDK_LEAVE_NOTIFY, GDK_CROSSING_NORMAL,
+                              GDK_CURRENT_TIME);
+    }
+
+  g_hash_table_iter_init (&iter, wayland_seat->touches);
 
   while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &touch))
     {
-      event = _create_touch_event (device, touch, GDK_TOUCH_CANCEL,
+      event = _create_touch_event (wayland_seat, touch, GDK_TOUCH_CANCEL,
                                    GDK_CURRENT_TIME);
-      _gdk_wayland_display_deliver_event (device->display, event);
-
+      _gdk_wayland_display_deliver_event (wayland_seat->display, event);
       g_hash_table_iter_remove (&iter);
     }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]