[goffice] Canvas: properly disconnect signals from widgets.



commit 47d81aecbcd094942c1951a54414728466af99bb
Author: Morten Welinder <terra gnome org>
Date:   Wed Mar 27 14:07:09 2013 -0400

    Canvas: properly disconnect signals from widgets.

 ChangeLog                   |    6 ++++++
 goffice/canvas/goc-widget.c |   36 ++++++++++++++++++++++--------------
 2 files changed, 28 insertions(+), 14 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index e3919fe..2e296c1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2013-03-27  Morten Welinder  <terra gnome org>
+
+       * goffice/canvas/goc-widget.c (goc_widget_connect_signals): Plug
+       leak.
+       (goc_widget_set_widget): Properly disconnect signals.
+
 2013-03-27  Jean Brefort  <jean brefort normalesup org>
 
        * goffice/canvas/goc-widget.c (goc_widget_connect_signals),
diff --git a/goffice/canvas/goc-widget.c b/goffice/canvas/goc-widget.c
index f5cac2d..eacdf7a 100644
--- a/goffice/canvas/goc-widget.c
+++ b/goffice/canvas/goc-widget.c
@@ -576,19 +576,30 @@ cb_canvas_changed (GocWidget *item, G_GNUC_UNUSED GParamSpec *pspec,
 }
 
 static void
-goc_widget_connect_signals (GtkWidget *widget, GocWidget *item)
+goc_widget_connect_signals (GtkWidget *widget, GocWidget *item,
+                           gboolean do_connect)
 {
                if (GTK_IS_CONTAINER (widget)) {
-                       GList *ptr = gtk_container_get_children (GTK_CONTAINER (widget));
-                       while (ptr && ptr->data) {
-                               goc_widget_connect_signals (ptr->data, item);
-                               ptr = ptr->next;
+                       GList *children = gtk_container_get_children (GTK_CONTAINER (widget));
+                       GList *ptr;
+                       for (ptr = children; ptr; ptr = ptr->next) {
+                               GtkWidget *child = ptr->data;
+                               goc_widget_connect_signals (child, item, do_connect);
                        }
+                       g_list_free (children);
+               }
+
+               if (do_connect) {
+                       g_signal_connect (widget, "enter-notify-event",
+                                         G_CALLBACK (enter_notify_cb), item);
+                       g_signal_connect (widget, "button-press-event",
+                                         G_CALLBACK (button_press_cb), item);
+               } else {
+                       g_signal_handlers_disconnect_by_func
+                               (item->ofbox, G_CALLBACK (enter_notify_cb), item);
+                       g_signal_handlers_disconnect_by_func
+                               (item->ofbox, G_CALLBACK (button_press_cb), item);
                }
-               g_signal_connect (widget, "enter-notify-event",
-                                 G_CALLBACK (enter_notify_cb), item);
-               g_signal_connect (widget, "button-press-event",
-                                 G_CALLBACK (button_press_cb), item);
 }
 
 static void
@@ -600,10 +611,7 @@ goc_widget_set_widget (GocWidget *item, GtkWidget *widget)
        if (item->ofbox) {
                GtkWidget *parent = gtk_widget_get_parent (item->ofbox);
 
-               g_signal_handlers_disconnect_by_func
-                       (item->ofbox, G_CALLBACK (enter_notify_cb), item);
-               g_signal_handlers_disconnect_by_func
-                       (item->ofbox, G_CALLBACK (button_press_cb), item);
+               goc_widget_connect_signals (widget, item, FALSE);
 
                if (parent)
                        gtk_container_remove (GTK_CONTAINER (parent),
@@ -628,7 +636,7 @@ goc_widget_set_widget (GocWidget *item, GtkWidget *widget)
                                        item->ofbox, item->x, item->y);
                goc_widget_notify_scrolled (GOC_ITEM (item));
                /* we need to propagate some signals to the parent item */
-               goc_widget_connect_signals (widget, item);
+               goc_widget_connect_signals (widget, item, TRUE);
        }
 }
 


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