[network-manager-applet] connection-editor: Fix reparenting of GtkBuilder widgets



commit a4c70065de6244eb236464bb1437cda0ea4cab79
Author: Dan Winship <danw gnome org>
Date:   Wed Mar 7 08:08:18 2012 -0500

    connection-editor: Fix reparenting of GtkBuilder widgets
    
    Don't use gtk_widget_unparent(); it's only meant to be used as part of
    a gtk_container_remove() implementation. Calling it on someone else's
    child leaves the parent in a confused state (where it still thinks the
    widget is its child, but it isn't holding a ref on it).

 src/connection-editor/nm-connection-editor.c   |    6 ++++--
 src/connection-editor/page-wired-security.c    |    5 ++++-
 src/connection-editor/page-wireless-security.c |    6 ++++--
 3 files changed, 12 insertions(+), 5 deletions(-)
---
diff --git a/src/connection-editor/nm-connection-editor.c b/src/connection-editor/nm-connection-editor.c
index 26b59fe..1f54ae4 100644
--- a/src/connection-editor/nm-connection-editor.c
+++ b/src/connection-editor/nm-connection-editor.c
@@ -566,7 +566,7 @@ static void
 page_initialized (CEPage *page, GError *error, gpointer user_data)
 {
 	NMConnectionEditor *editor = NM_CONNECTION_EDITOR (user_data);
-	GtkWidget *widget;
+	GtkWidget *widget, *parent;
 	GtkNotebook *notebook;
 	GtkWidget *label;
 
@@ -580,7 +580,9 @@ page_initialized (CEPage *page, GError *error, gpointer user_data)
 	notebook = GTK_NOTEBOOK (gtk_builder_get_object (editor->builder, "notebook"));
 	label = gtk_label_new (ce_page_get_title (page));
 	widget = ce_page_get_page (page);
-	gtk_widget_unparent (widget);
+	parent = gtk_widget_get_parent (widget);
+	if (parent)
+		gtk_container_remove (GTK_CONTAINER (parent), widget);
 	gtk_notebook_append_page (notebook, widget, label);
 
 	/* Move the page from the initializing list to the main page list */
diff --git a/src/connection-editor/page-wired-security.c b/src/connection-editor/page-wired-security.c
index 7bec62e..3e20ff1 100644
--- a/src/connection-editor/page-wired-security.c
+++ b/src/connection-editor/page-wired-security.c
@@ -73,6 +73,7 @@ finish_setup (CEPageWiredSecurity *self, gpointer unused, GError *error, gpointe
 {
 	CEPage *parent = CE_PAGE (self);
 	CEPageWiredSecurityPrivate *priv = CE_PAGE_WIRED_SECURITY_GET_PRIVATE (self);
+	GtkWidget *parent_container;
 
 	if (error)
 		return;
@@ -85,7 +86,9 @@ finish_setup (CEPageWiredSecurity *self, gpointer unused, GError *error, gpointe
 
 	wireless_security_set_changed_notify (priv->security, stuff_changed, self);
 	priv->security_widget = wireless_security_get_widget (priv->security);
-	gtk_widget_unparent (priv->security_widget);
+	parent_container = gtk_widget_get_parent (priv->security_widget);
+	if (parent_container)
+		gtk_container_remove (GTK_CONTAINER (parent_container), priv->security_widget);
 
 	gtk_toggle_button_set_active (priv->enabled, priv->initial_have_8021x);
 	g_signal_connect (priv->enabled, "toggled", G_CALLBACK (enable_toggled), self);
diff --git a/src/connection-editor/page-wireless-security.c b/src/connection-editor/page-wireless-security.c
index 90426cf..839e166 100644
--- a/src/connection-editor/page-wireless-security.c
+++ b/src/connection-editor/page-wireless-security.c
@@ -155,11 +155,13 @@ wireless_security_combo_changed (GtkComboBox *combo,
 	sec = wireless_security_combo_get_active (self);
 	if (sec) {
 		GtkWidget *sec_widget;
-		GtkWidget *widget;
+		GtkWidget *widget, *parent;
 
 		sec_widget = wireless_security_get_widget (sec);
 		g_assert (sec_widget);
-		gtk_widget_unparent (sec_widget);
+		parent = gtk_widget_get_parent (sec_widget);
+		if (parent)
+			gtk_container_remove (GTK_CONTAINER (parent), sec_widget);
 
 		widget = GTK_WIDGET (gtk_builder_get_object (CE_PAGE (self)->builder, "wireless_security_combo_label"));
 		gtk_size_group_add_widget (self->group, widget);



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