[gtk/inspector-menu-fix] menus: Fix menus on non-default displays



commit 0a424a270af96286a4809ad2e83fea4063cc1955
Author: Matthias Clasen <mclasen redhat com>
Date:   Wed May 1 20:41:59 2019 +0000

    menus: Fix menus on non-default displays
    
    Currently, we sometimes emit display-changed
    when the display changed, and sometimes we don't
    since the display is changed via gtk_widget_root.
    
    Listen for notify::root as well and update our
    display. This is a temporary fix - all display
    changes should go through gtk_widget_root,
    eventually.

 gtk/gtkmenu.c | 27 ++++++++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)
---
diff --git a/gtk/gtkmenu.c b/gtk/gtkmenu.c
index 820fcdd9c7..deeee12ca9 100644
--- a/gtk/gtkmenu.c
+++ b/gtk/gtkmenu.c
@@ -1054,6 +1054,18 @@ attach_widget_display_changed (GtkWidget  *attach_widget,
     menu_change_display (menu, gtk_widget_get_display (attach_widget));
 }
 
+static void
+attach_widget_root_changed (GObject    *object,
+                            GParamSpec *pspec,
+                            gpointer    data)
+{
+  GtkWidget *attach_widget = object;
+  GtkMenu *menu = data;
+
+  if (!g_object_get_data (G_OBJECT (menu), "gtk-menu-explicit-display"))
+    menu_change_display (menu, gtk_widget_get_display (attach_widget));
+}
+
 static void
 menu_toplevel_attached_to (GtkWindow *toplevel, GParamSpec *pspec, GtkMenu *menu)
 {
@@ -1109,6 +1121,8 @@ gtk_menu_attach_to_widget (GtkMenu           *menu,
 
   g_signal_connect (attach_widget, "display-changed",
                     G_CALLBACK (attach_widget_display_changed), menu);
+  g_signal_connect (attach_widget, "notify::root",
+                    G_CALLBACK (attach_widget_root_changed), menu);
   attach_widget_display_changed (attach_widget, NULL, menu);
 
   data->detacher = detacher;
@@ -1191,6 +1205,9 @@ gtk_menu_detach (GtkMenu *menu)
   g_signal_handlers_disconnect_by_func (data->attach_widget,
                                         (gpointer) attach_widget_display_changed,
                                         menu);
+  g_signal_handlers_disconnect_by_func (data->attach_widget,
+                                        (gpointer) attach_widget_root_changed,
+                                        menu);
 
   if (data->detacher)
     data->detacher (data->attach_widget, menu);
@@ -1266,6 +1283,8 @@ popup_grab_on_surface (GdkSurface *surface,
   GdkGrabStatus status;
   GdkSeat *seat;
 
+  g_return_val_if_fail (gdk_surface_get_display (surface) == gdk_device_get_display (pointer), FALSE);
+
   seat = gdk_device_get_seat (pointer);
   status = gdk_seat_grab (seat, surface,
                           GDK_SEAT_CAPABILITY_ALL, TRUE,
@@ -1321,7 +1340,11 @@ gtk_menu_popup_internal (GtkMenu             *menu,
     device = NULL;
 
   if (device == NULL)
-    device = gdk_seat_get_pointer (gdk_display_get_default_seat (display));
+    {
+      device = gdk_seat_get_pointer (gdk_display_get_default_seat (display));
+      g_return_if_fail (gdk_device_get_display (device) == display);
+    }
+
 
   widget = GTK_WIDGET (menu);
   menu_shell = GTK_MENU_SHELL (menu);
@@ -1331,6 +1354,8 @@ gtk_menu_popup_internal (GtkMenu             *menu,
   else
     pointer = device;
 
+  g_return_if_fail (gdk_device_get_display (pointer) == display);
+
   menu_shell->priv->parent_menu_shell = parent_menu_shell;
 
   /* Find the last viewable ancestor, and make an X grab on it


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