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.
This commit is contained in:
Tristan Van Berkom 2011-01-04 00:55:04 +09:00
parent b8c8f2ccb1
commit a28295a742
2 changed files with 7 additions and 11 deletions

View File

@ -9236,13 +9236,15 @@ _gtk_window_set_is_toplevel (GtkWindow *window,
if (is_toplevel) if (is_toplevel)
{ {
gboolean was_visible = gtk_widget_get_visible (widget);
/* Pass through regular pathways of an embedded toplevel /* Pass through regular pathways of an embedded toplevel
* to go through unmapping and hiding the widget before * to go through unmapping and hiding the widget before
* becomming a toplevel again. * 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 /* Save the toplevel this widget was previously anchored into before
@ -9266,13 +9268,6 @@ _gtk_window_set_is_toplevel (GtkWindow *window,
_gtk_widget_propagate_hierarchy_changed (widget, toplevel); _gtk_widget_propagate_hierarchy_changed (widget, toplevel);
toplevel_list = g_slist_prepend (toplevel_list, window); 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 else
{ {

View File

@ -9,6 +9,7 @@ remove_notebook_page (GtkWidget *button,
GtkWidget *toplevel) GtkWidget *toplevel)
{ {
gtk_container_remove (GTK_CONTAINER (notebook), toplevel); gtk_container_remove (GTK_CONTAINER (notebook), toplevel);
gtk_widget_show (toplevel);
} }
GtkWidget * GtkWidget *