[mutter] compositor: Disconnect from stage signals on destruction



commit 3ba79961fed2c70df3201b3e588990c92aadcd7f
Author: Marco Trevisan (TreviƱo) <mail 3v1n0 net>
Date:   Mon Apr 29 15:02:18 2019 -0500

    compositor: Disconnect from stage signals on destruction
    
    From this point there's not any need for the compositor to listen to signals
    so we can disconnect from the stage ones we are connected to.
    
    https://gitlab.gnome.org/GNOME/mutter/merge_requests/556

 src/compositor/compositor-private.h |  3 +++
 src/compositor/compositor.c         | 21 ++++++++++++++++-----
 2 files changed, 19 insertions(+), 5 deletions(-)
---
diff --git a/src/compositor/compositor-private.h b/src/compositor/compositor-private.h
index 0f92d42da..6ab33416c 100644
--- a/src/compositor/compositor-private.h
+++ b/src/compositor/compositor-private.h
@@ -18,6 +18,9 @@ struct _MetaCompositor
   guint           pre_paint_func_id;
   guint           post_paint_func_id;
 
+  guint           stage_presented_id;
+  guint           stage_after_paint_id;
+
   gint64          server_time_query_time;
   gint64          server_time_offset;
 
diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c
index f47889f43..2a2c8fb3b 100644
--- a/src/compositor/compositor.c
+++ b/src/compositor/compositor.c
@@ -135,6 +135,15 @@ meta_switch_workspace_completed (MetaCompositor *compositor)
 void
 meta_compositor_destroy (MetaCompositor *compositor)
 {
+  g_signal_handler_disconnect (compositor->stage,
+                               compositor->stage_after_paint_id);
+  g_signal_handler_disconnect (compositor->stage,
+                               compositor->stage_presented_id);
+
+  compositor->stage_after_paint_id = 0;
+  compositor->stage_presented_id = 0;
+  compositor->stage = NULL;
+
   clutter_threads_remove_repaint_func (compositor->pre_paint_func_id);
   clutter_threads_remove_repaint_func (compositor->post_paint_func_id);
 
@@ -520,9 +529,10 @@ meta_compositor_manage (MetaCompositor *compositor)
 
   compositor->stage = meta_backend_get_stage (backend);
 
-  g_signal_connect (compositor->stage, "presented",
-                    G_CALLBACK (on_presented),
-                    compositor);
+  compositor->stage_presented_id =
+    g_signal_connect (compositor->stage, "presented",
+                      G_CALLBACK (on_presented),
+                                                     compositor);
 
   /* We use connect_after() here to accomodate code in GNOME Shell that,
    * when benchmarking drawing performance, connects to ::after-paint
@@ -532,8 +542,9 @@ meta_compositor_manage (MetaCompositor *compositor)
    * connections to ::after-paint, connect() vs. connect_after() doesn't
    * matter.
    */
-  g_signal_connect_after (CLUTTER_STAGE (compositor->stage), "after-paint",
-                          G_CALLBACK (after_stage_paint), compositor);
+  compositor->stage_after_paint_id =
+    g_signal_connect_after (compositor->stage, "after-paint",
+                            G_CALLBACK (after_stage_paint), compositor);
 
   clutter_stage_set_sync_delay (CLUTTER_STAGE (compositor->stage), META_SYNC_DELAY);
 


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