diff options
author | Owen Taylor <owt1@cornell.edu> | 1998-04-08 21:40:45 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 1998-04-08 21:40:45 +0000 |
commit | 520fd17eca6e2ad8de2261a6553f59b8368d3bdb (patch) | |
tree | 1598a9710267467da7efef4debcd8b59f62c34f3 /gtk | |
parent | 09d32399abfccb7d7c42ea60463baf1956e432c4 (diff) | |
download | gtk+-520fd17eca6e2ad8de2261a6553f59b8368d3bdb.tar.gz |
Make sure widgets get removed from the resize queue before the connection
Wed Apr 8 17:27:40 1998 Owen Taylor <owt1@cornell.edu>
* gtk/gtkwidget.c (gtk_widget_unparent): Make sure
widgets get removed from the resize queue before the
connection between them and the resize queue is broken
by unparenting their parent.
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/gtkwidget.c | 40 |
1 files changed, 36 insertions, 4 deletions
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 8c7d0b4ce9..866d66cc7c 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -1129,6 +1129,7 @@ gtk_widget_unparent (GtkWidget *widget) GtkWidget *toplevel; GtkWidget *child; GtkWidget *old_parent; + GSList *tmp_list, *prev_list; g_return_if_fail (widget != NULL); if (widget->parent == NULL) @@ -1149,11 +1150,42 @@ gtk_widget_unparent (GtkWidget *widget) gtk_window_set_focus (GTK_WINDOW (toplevel), NULL); } - if (GTK_WIDGET_RESIZE_NEEDED (widget)) + /* Remove the widget and all its children from toplevel->resize_widgets + */ + + /* Three ways to make this prettier: + * Write a g_slist_conditional_remove (GSList, gboolean (*)(gpointer)) + * Change resize_widgets to a GList + * Just bite the bullet and use g_slist_remove + */ + tmp_list = GTK_CONTAINER (toplevel)->resize_widgets; + prev_list = NULL; + while (tmp_list) { - GTK_CONTAINER (toplevel)->resize_widgets = - g_slist_remove (GTK_CONTAINER (toplevel)->resize_widgets, widget); - GTK_PRIVATE_UNSET_FLAG (widget, GTK_RESIZE_NEEDED); + GSList *tmp = tmp_list; + GtkWidget *child = (GtkWidget *)tmp->data; + GtkWidget *parent = child; + + tmp_list = tmp_list->next; + + while (parent && (parent != widget)) + parent = parent->parent; + + if (parent == widget) + { + GTK_PRIVATE_UNSET_FLAG (child, GTK_RESIZE_NEEDED); + + if (prev_list) + prev_list->next = tmp_list; + else + GTK_CONTAINER (toplevel)->resize_widgets = tmp_list; + + tmp->next = NULL; + + g_slist_free_1 (tmp); + } + else + prev_list = tmp; } if (widget->window && |