From 3a83de295db4c5a3fc3e460498f6ac8a3a73fde5 Mon Sep 17 00:00:00 2001 From: Jason Gerecke Date: Fri, 23 Jun 2017 11:17:53 -0700 Subject: [PATCH] wayland: Get implicit grab serial information from tablet devices 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 | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/gdk/wayland/gdkdevice-wayland.c b/gdk/wayland/gdkdevice-wayland.c index 33ecf404a7..04562b9645 100644 --- a/gdk/wayland/gdkdevice-wayland.c +++ b/gdk/wayland/gdkdevice-wayland.c @@ -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)