[mutter] compositor: Use direct access to disconnect top window actor signal



commit b850f5a732c9438b8246eeec7a18bb6e9065a9f2
Author: Marco Trevisan (TreviƱo) <mail 3v1n0 net>
Date:   Fri Jun 28 19:33:40 2019 +0200

    compositor: Use direct access to disconnect top window actor signal
    
    Everytime the top window changes we connect/disconnect to the actor's destroy
    signal, although as explained in commit ba8f5a11 this might be slower in case
    the window actor has many other signal connections.
    
    So, just track this using an ID.
    
    https://gitlab.gnome.org/GNOME/mutter/merge_requests/660

 src/compositor/compositor-private.h |  1 +
 src/compositor/compositor.c         | 22 +++++++++++++---------
 2 files changed, 14 insertions(+), 9 deletions(-)
---
diff --git a/src/compositor/compositor-private.h b/src/compositor/compositor-private.h
index 2bd7d696b..07fbf5119 100644
--- a/src/compositor/compositor-private.h
+++ b/src/compositor/compositor-private.h
@@ -33,6 +33,7 @@ struct _MetaCompositor
   CoglContext           *context;
 
   MetaWindowActor       *top_window_actor;
+  gulong                 top_window_actor_destroy_id;
 
   /* Used for unredirecting fullscreen windows */
   guint                  disable_unredirect_count;
diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c
index 95a1de8ea..1ec31d338 100644
--- a/src/compositor/compositor.c
+++ b/src/compositor/compositor.c
@@ -149,10 +149,10 @@ meta_compositor_destroy (MetaCompositor *compositor)
 
   if (compositor->top_window_actor)
     {
-      g_signal_handlers_disconnect_by_func (compositor->top_window_actor,
-                                            on_top_window_actor_destroyed,
-                                            compositor);
+      g_signal_handler_disconnect (compositor->top_window_actor,
+                                   compositor->top_window_actor_destroy_id);
       compositor->top_window_actor = NULL;
+      compositor->top_window_actor_destroy_id = 0;
     }
 
   g_clear_pointer (&compositor->window_group, clutter_actor_destroy);
@@ -1025,6 +1025,7 @@ on_top_window_actor_destroyed (MetaWindowActor *window_actor,
                                MetaCompositor  *compositor)
 {
   compositor->top_window_actor = NULL;
+  compositor->top_window_actor_destroy_id = 0;
   compositor->windows = g_list_remove (compositor->windows, window_actor);
 
   meta_stack_tracker_queue_sync_stack (compositor->display->stack_tracker);
@@ -1124,16 +1125,19 @@ meta_compositor_sync_stack (MetaCompositor  *compositor,
     return;
 
   if (compositor->top_window_actor)
-    g_signal_handlers_disconnect_by_func (compositor->top_window_actor,
-                                          on_top_window_actor_destroyed,
-                                          compositor);
+    {
+      g_signal_handler_disconnect (compositor->top_window_actor,
+                                   compositor->top_window_actor_destroy_id);
+      compositor->top_window_actor_destroy_id = 0;
+    }
 
   compositor->top_window_actor = top_window_actor;
 
   if (compositor->top_window_actor)
-    g_signal_connect (compositor->top_window_actor, "destroy",
-                      G_CALLBACK (on_top_window_actor_destroyed),
-                      compositor);
+    compositor->top_window_actor_destroy_id =
+      g_signal_connect (compositor->top_window_actor, "destroy",
+                        G_CALLBACK (on_top_window_actor_destroyed),
+                        compositor);
 }
 
 void


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