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);