[goffice] Canvas: properly disconnect signals from widgets.
- From: Morten Welinder <mortenw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [goffice] Canvas: properly disconnect signals from widgets.
- Date: Wed, 27 Mar 2013 18:07:28 +0000 (UTC)
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]