From: John Darrington Date: Tue, 8 Oct 2013 13:43:49 +0000 (+0200) Subject: Remove old signal handlers when target widgets are destroyed X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e0d27941839de65b98f3b9ec982e225c88cf661e;p=pspp Remove old signal handlers when target widgets are destroyed --- diff --git a/src/ui/gui/psppire-dialog.c b/src/ui/gui/psppire-dialog.c index 9c854a699e..2f5087f245 100644 --- a/src/ui/gui/psppire-dialog.c +++ b/src/ui/gui/psppire-dialog.c @@ -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); diff --git a/src/ui/gui/psppire-selector.c b/src/ui/gui/psppire-selector.c index 3b1bfe00ab..82e2139976 100644 --- a/src/ui/gui/psppire-selector.c +++ b/src/ui/gui/psppire-selector.c @@ -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;