x11: Directly notify surfaces of monitor changes
authorBenjamin Otte <otte@redhat.com>
Sun, 17 May 2020 03:35:14 +0000 (05:35 +0200)
committerBenjamin Otte <otte@redhat.com>
Sun, 17 May 2020 05:10:34 +0000 (07:10 +0200)
Do not use signals.

gdk/x11/gdkscreen-x11.c
gdk/x11/gdksurface-x11.c
gdk/x11/gdksurface-x11.h

index 37182d8c2c726df810e595c0e90d0eee2d74b888..61f255b3b6caf263f122894e00cb8b42f6e6b058 100644 (file)
@@ -385,6 +385,26 @@ gdk_x11_screen_get_screen_number (GdkX11Screen *screen)
   return screen->screen_num;
 }
 
+static void
+notify_surface_monitor_change (GdkX11Display *display,
+                               GdkMonitor    *monitor)
+{
+  GHashTableIter iter;
+  GdkSurface *surface;
+
+  /* We iterate the surfaces via the hash table here because it's the only
+   * thing that contains all the surfaces.
+   */
+  if (display->xid_ht == NULL)
+    return;
+
+  g_hash_table_iter_init (&iter, display->xid_ht);
+  while (g_hash_table_iter_next (&iter, NULL, (gpointer *)&surface))
+    {
+      gdk_x11_surface_check_monitor (surface, monitor);
+    }
+}
+
 static GdkX11Monitor *
 find_monitor_by_output (GdkX11Display *x11_display, XID output)
 {
@@ -590,6 +610,7 @@ init_randr15 (GdkX11Screen *x11_screen)
   for (i = g_list_model_get_n_items (G_LIST_MODEL (x11_display->monitors)) - 1; i >= 0; i--)
     {
       GdkX11Monitor *monitor = g_list_model_get_item (G_LIST_MODEL (x11_display->monitors), i);
+      notify_surface_monitor_change (x11_display, GDK_MONITOR (monitor));
       if (monitor->add)
         {
           gdk_display_monitor_added (display, GDK_MONITOR (monitor));
@@ -744,6 +765,7 @@ init_randr13 (GdkX11Screen *x11_screen)
   for (i = g_list_model_get_n_items (G_LIST_MODEL (x11_display->monitors)) - 1; i >= 0; i--)
     {
       GdkX11Monitor *monitor = g_list_model_get_item (G_LIST_MODEL (x11_display->monitors), i);
+      notify_surface_monitor_change (x11_display, GDK_MONITOR (monitor));
       if (monitor->add)
         {
           gdk_display_monitor_added (display, GDK_MONITOR (monitor));
@@ -835,6 +857,7 @@ init_no_multihead (GdkX11Screen *x11_screen)
   for (i = g_list_model_get_n_items (G_LIST_MODEL (x11_display->monitors)) - 1; i >= 0; i--)
     {
       monitor = g_list_model_get_item (G_LIST_MODEL (x11_display->monitors), i);
+      notify_surface_monitor_change (x11_display, GDK_MONITOR (monitor));
       if (monitor->add)
         {
           gdk_display_monitor_added (GDK_DISPLAY (x11_display), GDK_MONITOR (monitor));
index 3ad63bfa0ad4a7f0e74d53117add62cd2d2d02c5..6b6f08df45a71ead75a5ca26f1eeb3e6b8557f6b 100644 (file)
@@ -106,10 +106,6 @@ static void     set_wm_name                       (GdkDisplay  *display,
                                                   const gchar *name);
 static void     move_to_current_desktop           (GdkSurface *surface);
 static void     gdk_x11_toplevel_state_callback   (GdkSurface *surface);
-static void     gdk_x11_surface_on_monitor_added   (GdkSurface *surface,
-                                                    GdkMonitor *monitor);
-static void     gdk_x11_surface_on_monitor_removed (GdkSurface *surface,
-                                                    GdkMonitor *monitor);
 
 /* Return whether time1 is considered later than time2 as far as xserver
  * time is concerned.  Accounts for wraparound.
@@ -463,13 +459,6 @@ gdk_x11_surface_finalize (GObject *object)
       _gdk_x11_display_remove_window (display, impl->xid);
       if (impl->toplevel && impl->toplevel->focus_window)
         _gdk_x11_display_remove_window (display, impl->toplevel->focus_window);
-
-      g_signal_handlers_disconnect_by_func (display,
-                                            gdk_x11_surface_on_monitor_added,
-                                            GDK_SURFACE (object));
-      g_signal_handlers_disconnect_by_func (display,
-                                            gdk_x11_surface_on_monitor_removed,
-                                            GDK_SURFACE (object));
     }
 
   g_clear_pointer (&impl->surface_is_on_monitor, g_list_free);
@@ -984,13 +973,6 @@ _gdk_x11_display_create_surface (GdkDisplay     *display,
 
   gdk_surface_freeze_updates (surface);
 
-  g_signal_connect_swapped (surface->display, "monitor-added",
-                            G_CALLBACK (gdk_x11_surface_on_monitor_added),
-                            surface);
-  g_signal_connect_swapped (surface->display, "monitor-removed",
-                            G_CALLBACK (gdk_x11_surface_on_monitor_removed),
-                            surface);
-
   return surface;
 }
 
@@ -1597,7 +1579,7 @@ gdk_x11_surface_set_is_on_monitor (GdkSurface *surface,
     }
 }
 
-static void
+void
 gdk_x11_surface_check_monitor (GdkSurface *surface,
                                GdkMonitor *monitor)
 {
@@ -1633,26 +1615,6 @@ gdk_x11_surface_enter_leave_monitors (GdkSurface *surface)
     }
 }
 
-static void
-gdk_x11_surface_on_monitor_added (GdkSurface *surface,
-                                  GdkMonitor *monitor)
-{
-  gdk_x11_surface_check_monitor (surface, monitor);
-  g_signal_connect_swapped (G_OBJECT (monitor), "notify::geometry",
-                            G_CALLBACK (gdk_x11_surface_check_monitor),
-                            surface);
-}
-
-static void
-gdk_x11_surface_on_monitor_removed (GdkSurface *surface,
-                                    GdkMonitor *monitor)
-{
-  gdk_x11_surface_check_monitor (surface, monitor);
-  g_signal_handlers_disconnect_by_func (G_OBJECT (monitor),
-                                        gdk_x11_surface_check_monitor,
-                                        monitor);
-}
-
 static void gdk_x11_surface_set_geometry_hints (GdkSurface         *surface,
                                                 const GdkGeometry *geometry,
                                                 GdkSurfaceHints     geom_mask);
index 627864b3d6cfba66c341ef50ac3c0b7abab110bc..8d8e255a36afe8a2a80668bb38872ff04dbb092c 100644 (file)
@@ -182,6 +182,8 @@ void            gdk_x11_surface_pre_damage           (GdkSurface *surface);
 void            gdk_x11_surface_move                 (GdkSurface *surface,
                                                       gint        x,
                                                       gint        y);
+void            gdk_x11_surface_check_monitor        (GdkSurface *surface,
+                                                      GdkMonitor *monitor);
 
 G_END_DECLS