wayland: Get implicit grab serial information from tablet devices
authorJason Gerecke <killertofu@gmail.com>
Fri, 23 Jun 2017 18:17:53 +0000 (11:17 -0700)
committerCarlos Garnacho <carlosg@gnome.org>
Thu, 20 Jul 2017 10:23:15 +0000 (12:23 +0200)
If a tablet device is used to perform actions like window moving or resizing,
GTK must provide the correct implicit grab serial number over Wayland to Mutter
in order for the action to succeed. This commit adds tablet support to the
implicit serial getters.

https://bugzilla.gnome.org/show_bug.cgi?id=777333

gdk/wayland/gdkdevice-wayland.c

index 33ecf404a7d13533608a83d798e768c4ae8d463b..04562b96452254a6f4427b9c47d33f605abd24a4 100644 (file)
@@ -5075,9 +5075,25 @@ _gdk_wayland_device_get_implicit_grab_serial (GdkWaylandDevice *device,
   if (sequence)
     touch = gdk_wayland_seat_get_touch (GDK_WAYLAND_SEAT (seat),
                                         GDK_EVENT_SEQUENCE_TO_SLOT (sequence));
+
   if (touch)
     return touch->touch_down_serial;
-  else
+
+  if (event)
+    {
+      GdkDevice *source = gdk_event_get_source_device (event);
+      GdkWaylandSeat *wayland_seat = GDK_WAYLAND_SEAT (seat);
+      GList *l;
+
+      for (l = wayland_seat->tablets; l; l = l->next)
+        {
+          GdkWaylandTabletData *tablet = l->data;
+
+          if (tablet->current_device == source)
+            return tablet->pointer_info.press_serial;
+        }
+    }
+
     return GDK_WAYLAND_SEAT (seat)->pointer_info.press_serial;
 }
 
@@ -5088,6 +5104,7 @@ _gdk_wayland_seat_get_last_implicit_grab_serial (GdkSeat           *seat,
   GdkWaylandSeat *wayland_seat;
   GdkWaylandTouchData *touch;
   GHashTableIter iter;
+  GList *l;
   uint32_t serial;
 
   wayland_seat = GDK_WAYLAND_SEAT (seat);
@@ -5101,6 +5118,14 @@ _gdk_wayland_seat_get_last_implicit_grab_serial (GdkSeat           *seat,
   if (wayland_seat->pointer_info.press_serial > serial)
     serial = wayland_seat->pointer_info.press_serial;
 
+  for (l = wayland_seat->tablets; l; l = l->next)
+    {
+      GdkWaylandTabletData *tablet = l->data;
+
+      if (tablet->pointer_info.press_serial > serial)
+        serial = tablet->pointer_info.press_serial;
+    }
+
   while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &touch))
     {
       if (touch->touch_down_serial > serial)