[gtk+] wayland: Improve creation of windowing surface roles



commit a33aefc281bc91b6c4b8e055df2fb12234c302c3
Author: Carlos Garnacho <carlosg gnome org>
Date:   Wed Dec 9 12:56:26 2015 +0100

    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 3836d6e..7afc30f 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 53ecbef..9d3b817 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 0c56c2e..753aac5 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_;
 }
 
 /**


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