[gnome-control-center] display: Clean up signal handling when finalized



commit f33080ac1bfaec8e27c7d5315a2148af2ccca5ae
Author: Bastien Nocera <hadess hadess net>
Date:   Thu Sep 1 13:53:45 2011 +0100

    display: Clean up signal handling when finalized
    
    Otherwise we might crash if the display panel was opened
    and the window focus changes.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=657919

 panels/display/cc-display-panel.c |   12 ++++++++++--
 1 files changed, 10 insertions(+), 2 deletions(-)
---
diff --git a/panels/display/cc-display-panel.c b/panels/display/cc-display-panel.c
index 498f34b..217224f 100644
--- a/panels/display/cc-display-panel.c
+++ b/panels/display/cc-display-panel.c
@@ -74,6 +74,7 @@ struct _CcDisplayPanelPrivate
 
   GSettings      *clock_settings;
   GtkBuilder     *builder;
+  guint           focus_id;
 
   GtkWidget      *panel;
   GtkWidget      *current_monitor_event_box;
@@ -157,6 +158,8 @@ static void
 cc_display_panel_finalize (GObject *object)
 {
   CcDisplayPanel *self;
+  CcShell *shell;
+  GtkWidget *toplevel;
 
   self = CC_DISPLAY_PANEL (object);
 
@@ -166,6 +169,11 @@ cc_display_panel_finalize (GObject *object)
   if (self->priv->clock_settings != NULL)
     g_object_unref (self->priv->clock_settings);
 
+  shell = cc_panel_get_shell (CC_PANEL (self));
+  toplevel = cc_shell_get_toplevel (shell);
+  g_signal_handler_disconnect (G_OBJECT (toplevel),
+                               self->priv->focus_id);
+
   gnome_rr_labeler_hide (self->priv->labeler);
   g_object_unref (self->priv->labeler);
 
@@ -2613,8 +2621,8 @@ cc_display_panel_constructor (GType                  gtype,
 
   shell = cc_panel_get_shell (CC_PANEL (self));
   toplevel = cc_shell_get_toplevel (shell);
-  g_signal_connect (toplevel, "notify::has-toplevel-focus",
-                    G_CALLBACK (dialog_toplevel_focus_changed), self);
+  self->priv->focus_id = g_signal_connect (toplevel, "notify::has-toplevel-focus",
+                                           G_CALLBACK (dialog_toplevel_focus_changed), self);
 
   self->priv->panel = WID ("display-panel");
   g_signal_connect_after (self->priv->panel, "show",



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