From a28295a742d6492a03c92413e3570724406ca3e1 Mon Sep 17 00:00:00 2001 From: Tristan Van Berkom Date: Tue, 4 Jan 2011 00:55:04 +0900 Subject: [PATCH] Dont show the GtkWindow when removing it from a parent and becomming a toplevel Showing the window causes it to try to grab focus, this causes problems when embedded toplevels run through dispose cycles. --- gtk/gtkwindow.c | 17 ++++++----------- tests/testtoplevelembed.c | 1 + 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index 09879cecad..e69c0185bd 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -9236,14 +9236,16 @@ _gtk_window_set_is_toplevel (GtkWindow *window, if (is_toplevel) { - gboolean was_visible = gtk_widget_get_visible (widget); - /* Pass through regular pathways of an embedded toplevel * to go through unmapping and hiding the widget before * becomming a toplevel again. + * + * We remain hidden after becomming toplevel in order to + * avoid problems during an embedded toplevel's dispose cycle + * (When a toplevel window is shown it tries to grab focus again, + * this causes problems while disposing). */ - if (was_visible) - gtk_widget_hide (widget); + gtk_widget_hide (widget); /* Save the toplevel this widget was previously anchored into before * propagating a hierarchy-changed. @@ -9266,13 +9268,6 @@ _gtk_window_set_is_toplevel (GtkWindow *window, _gtk_widget_propagate_hierarchy_changed (widget, toplevel); toplevel_list = g_slist_prepend (toplevel_list, window); - - /* If an embedded toplevel gets removed from the hierarchy - * and is still in a visible state, we need to show it again - * so it will be realized as a real toplevel again. - */ - if (was_visible) - gtk_widget_show (widget); } else { diff --git a/tests/testtoplevelembed.c b/tests/testtoplevelembed.c index 12a79b2a42..c698252acb 100644 --- a/tests/testtoplevelembed.c +++ b/tests/testtoplevelembed.c @@ -9,6 +9,7 @@ remove_notebook_page (GtkWidget *button, GtkWidget *toplevel) { gtk_container_remove (GTK_CONTAINER (notebook), toplevel); + gtk_widget_show (toplevel); } GtkWidget *