Remove old signal handlers when target widgets are destroyed 20131009030508/pspp
authorJohn Darrington <john@darrington.wattle.id.au>
Tue, 8 Oct 2013 13:43:49 +0000 (15:43 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Tue, 8 Oct 2013 19:38:30 +0000 (21:38 +0200)
src/ui/gui/psppire-dialog.c
src/ui/gui/psppire-selector.c

index 9c854a699e66f153ef878cc8faa4867d780b3b33..2f5087f245d3c0e277e5f9f4c6154336b4ae860b 100644 (file)
@@ -353,6 +353,13 @@ psppire_dialog_notify_change (PsppireDialog *dialog)
 }
 
 
+static void
+remove_notify_handlers (PsppireDialog *dialog, GObject *sel)
+{
+  g_signal_handlers_disconnect_by_data (sel, dialog);
+}
+
+
 /* Descend the widget tree, connecting appropriate signals to the
    psppire_dialog_notify_change callback */
 static void
@@ -427,19 +434,22 @@ connect_notify_signal (GtkWidget *w, gpointer data)
 
       if ( model)
        {
-      g_signal_connect_swapped (model, "row-changed",
-                               G_CALLBACK (psppire_dialog_notify_change),
-                               dialog);
+         g_signal_connect_swapped (model, "row-changed",
+                                   G_CALLBACK (psppire_dialog_notify_change),
+                                   dialog);
 
-      g_signal_connect_swapped (model, "row-deleted",
-                               G_CALLBACK (psppire_dialog_notify_change),
-                               dialog);
+         g_signal_connect_swapped (model, "row-deleted",
+                                   G_CALLBACK (psppire_dialog_notify_change),
+                                   dialog);
 
-      g_signal_connect_swapped (model, "row-inserted",
-                               G_CALLBACK (psppire_dialog_notify_change),
-                               dialog);
-       }
+         g_signal_connect_swapped (model, "row-inserted",
+                                   G_CALLBACK (psppire_dialog_notify_change),
+                                   dialog);
 
+         g_signal_connect (dialog, "destroy", G_CALLBACK (remove_notify_handlers),
+                           model);
+       }
+      
       g_signal_connect_swapped (selection, "changed",
                                G_CALLBACK (psppire_dialog_notify_change),
                                dialog);
index 3b1bfe00abd41d208d6a924f00da269d0a118901..82e21399768a05548cef4fc7b59e25fa4acf8ae3 100644 (file)
@@ -883,6 +883,12 @@ on_dest_data_delete (GtkTreeModel *tree_model,
 }
 
 
+static void
+remove_selector_handlers (PsppireSelector *selector, GObject *sel)
+{
+  g_signal_handlers_disconnect_by_data (sel, selector);
+}
+
 static void
 on_dest_model_changed (PsppireSelector *selector)
 {
@@ -896,6 +902,8 @@ on_dest_model_changed (PsppireSelector *selector)
   
   g_signal_connect (model, "row-deleted", G_CALLBACK (on_dest_data_delete),
                    selector);
+
+  g_signal_connect (selector, "destroy", G_CALLBACK (remove_selector_handlers), model);
   
   if ( selector->selecting ) return;