From a33aefc281bc91b6c4b8e055df2fb12234c302c3 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Wed, 9 Dec 2015 12:56:26 +0100 Subject: [PATCH] wayland: Improve creation of windowing surface roles We no longer need a grabbed seat, instead we'll just use the default seat if this happens, not without first warning and recommending gdk_seat_grab() for the operation. https://bugzilla.gnome.org/show_bug.cgi?id=759309 --- gdk/wayland/gdkdevice-wayland.c | 17 ++--------- gdk/wayland/gdkprivate-wayland.h | 6 ++-- gdk/wayland/gdkwindow-wayland.c | 52 ++++++++++++++++++-------------- 3 files changed, 34 insertions(+), 41 deletions(-) diff --git a/gdk/wayland/gdkdevice-wayland.c b/gdk/wayland/gdkdevice-wayland.c index 3836d6ef6a..7afc30fc65 100644 --- a/gdk/wayland/gdkdevice-wayland.c +++ b/gdk/wayland/gdkdevice-wayland.c @@ -535,16 +535,7 @@ gdk_wayland_device_grab (GdkDevice *device, wayland_device->pointer_grab_window = window; wayland_device->pointer_grab_time = time_; - - /* FIXME: This probably breaks if you end up with multiple grabs - * on the same window - but we need to know the input device for - * when we are asked to map a popup window so that the grab can - * be managed by the compositor. - */ - _gdk_wayland_window_set_device_grabbed (window, - device, - wayland_device->wl_seat, - time_); + _gdk_wayland_window_set_grab_seat (window, GDK_SEAT (wayland_device)); g_clear_object (&wayland_device->cursor); @@ -591,10 +582,8 @@ gdk_wayland_device_ungrab (GdkDevice *device, gdk_wayland_device_update_window_cursor (wayland_device); if (wayland_device->pointer_grab_window) - _gdk_wayland_window_set_device_grabbed (wayland_device->pointer_grab_window, - NULL, - NULL, - 0); + _gdk_wayland_window_set_grab_seat (wayland_device->pointer_grab_window, + NULL); } } diff --git a/gdk/wayland/gdkprivate-wayland.h b/gdk/wayland/gdkprivate-wayland.h index 53ecbefcae..9d3b817ffd 100644 --- a/gdk/wayland/gdkprivate-wayland.h +++ b/gdk/wayland/gdkprivate-wayland.h @@ -220,10 +220,8 @@ struct wl_output *_gdk_wayland_screen_get_wl_output (GdkScreen *screen, void _gdk_wayland_screen_set_has_gtk_shell (GdkScreen *screen); -void _gdk_wayland_window_set_device_grabbed (GdkWindow *window, - GdkDevice *device, - struct wl_seat *seat, - guint32 time_); +void _gdk_wayland_window_set_grab_seat (GdkWindow *window, + GdkSeat *seat); guint32 _gdk_wayland_display_get_serial (GdkWaylandDisplay *wayland_display); void _gdk_wayland_display_update_serial (GdkWaylandDisplay *wayland_display, guint32 serial); diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c index 0c56c2e5df..753aac58ec 100644 --- a/gdk/wayland/gdkwindow-wayland.c +++ b/gdk/wayland/gdkwindow-wayland.c @@ -140,9 +140,7 @@ struct _GdkWindowImplWayland GdkGeometry geometry_hints; GdkWindowHints geometry_mask; - guint32 grab_time; - GdkDevice *grab_device; - struct wl_seat *grab_input_seat; + GdkSeat *grab_input_seat; gint64 pending_frame_counter; guint32 scale; @@ -1173,7 +1171,7 @@ find_grab_input_seat (GdkWindow *window, GdkWindow *transient_for) * grab before showing the popup window. */ if (impl->grab_input_seat) - return impl->grab_input_seat; + return gdk_wayland_seat_get_wl_seat (impl->grab_input_seat); /* HACK: GtkMenu grabs a special window known as the "grab transfer window" * and then transfers the grab over to the correct window later. Look for @@ -1186,7 +1184,7 @@ find_grab_input_seat (GdkWindow *window, GdkWindow *transient_for) { tmp_impl = GDK_WINDOW_IMPL_WAYLAND (attached_grab_window->impl); if (tmp_impl->grab_input_seat) - return tmp_impl->grab_input_seat; + return gdk_wayland_seat_get_wl_seat (tmp_impl->grab_input_seat); } while (transient_for) @@ -1194,7 +1192,7 @@ find_grab_input_seat (GdkWindow *window, GdkWindow *transient_for) tmp_impl = GDK_WINDOW_IMPL_WAYLAND (transient_for->impl); if (tmp_impl->grab_input_seat) - return tmp_impl->grab_input_seat; + return gdk_wayland_seat_get_wl_seat (tmp_impl->grab_input_seat); transient_for = tmp_impl->transient_for; } @@ -1202,6 +1200,18 @@ find_grab_input_seat (GdkWindow *window, GdkWindow *transient_for) return NULL; } +static struct wl_seat * +find_default_input_seat (GdkWindow *window) +{ + GdkDisplay *display; + GdkSeat *seat; + + display = gdk_window_get_display (window); + seat = gdk_display_get_default_seat (display); + + return gdk_wayland_seat_get_wl_seat (seat); +} + static gboolean should_be_mapped (GdkWindow *window) { @@ -1318,7 +1328,7 @@ gdk_wayland_window_map (GdkWindow *window) */ if (!impl->transient_for && impl->hint == GDK_WINDOW_TYPE_HINT_POPUP_MENU) { - GdkDevice *grab_device; + GdkDevice *grab_device = NULL; /* The popup menu window is not the grabbed window. This may mean * that a "transfer window" (see gtkmenu.c) is used, and we need @@ -1326,7 +1336,7 @@ gdk_wayland_window_map (GdkWindow *window) * the "transfer window" can be retrieved via the * "gdk-attached-grab-window" associated data field. */ - if (!impl->grab_device) + if (!impl->grab_input_seat) { GdkWindow *attached_grab_window = g_object_get_data (G_OBJECT (window), @@ -1335,7 +1345,7 @@ gdk_wayland_window_map (GdkWindow *window) { GdkWindowImplWayland *attached_impl = GDK_WINDOW_IMPL_WAYLAND (attached_grab_window->impl); - grab_device = attached_impl->grab_device; + grab_device = gdk_seat_get_pointer (attached_impl->grab_input_seat); transient_for = gdk_device_get_window_at_position (grab_device, NULL, NULL); @@ -1343,7 +1353,7 @@ gdk_wayland_window_map (GdkWindow *window) } else { - grab_device = impl->grab_device; + grab_device = gdk_seat_get_pointer (impl->grab_input_seat); transient_for = gdk_device_get_window_at_position (grab_device, NULL, NULL); } @@ -1354,9 +1364,8 @@ gdk_wayland_window_map (GdkWindow *window) /* If the position was not explicitly set, start the popup at the * position of the device that holds the grab. */ - if (!impl->position_set) - gdk_window_get_device_position (transient_for, - impl->grab_device, + if (!impl->position_set && grab_device) + gdk_window_get_device_position (transient_for, grab_device, &window->x, &window->y, NULL); } else @@ -1375,10 +1384,12 @@ gdk_wayland_window_map (GdkWindow *window) if (!grab_input_seat) { - g_warning ("Couldn't map window %p as popup because no grabbed seat found", + g_warning ("No grabbed seat found, using the default one in " + "order to map popup window %p. You may find oddities " + "ahead, gdk_seat_grab() should be used to " + "simultaneously grab input and show this popup", window); - - create_fallback = TRUE; + grab_input_seat = find_default_input_seat (window); } } @@ -2535,20 +2546,15 @@ _gdk_window_impl_wayland_class_init (GdkWindowImplWaylandClass *klass) } void -_gdk_wayland_window_set_device_grabbed (GdkWindow *window, - GdkDevice *device, - struct wl_seat *seat, - guint32 time_) +_gdk_wayland_window_set_grab_seat (GdkWindow *window, + GdkSeat *seat) { GdkWindowImplWayland *impl; g_return_if_fail (window != NULL); impl = GDK_WINDOW_IMPL_WAYLAND (window->impl); - - impl->grab_device = device; impl->grab_input_seat = seat; - impl->grab_time = time_; } /**