From 4569b49bedfc4f42188a6d16f053a343867ee7af Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 23 Jan 2009 05:57:36 +0000 Subject: [PATCH] Keep GtkPlug in sync with the global list of toplevels. Patch by Federico Mena Quintero * gtk/gtkwindow.h: * gtk/gtkwindow.c (_gtk_window_set_is_toplevel): New internal function used when a GtkPlug parents/unparents itself by an in-process GtkSocket. This keeps the plug's GTK_TOPLEVEL flag in sync with the global toplevel_list. * gtk/gtkplug.c (gtk_plug_set_is_child): Call _gtk_window_set_is_toplevel() to keep the toplevel list updated, instead of just setting/unsetting the GTK_TOPLEVEL flag. svn path=/trunk/; revision=22191 --- ChangeLog | 17 +++++++++++++++++ gtk/gtkplug.c | 4 ++-- gtk/gtkwindow.c | 35 +++++++++++++++++++++++++++++++++++ gtk/gtkwindow.h | 3 +++ 4 files changed, 57 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9cce823706..54422d1add 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2009-01-23 Matthias Clasen + + Bug 536965 – GtkPlug: crash on theme change + + Keep GtkPlug in sync with the global list of toplevels. + Patch by Federico Mena Quintero + + * gtk/gtkwindow.h: + * gtk/gtkwindow.c (_gtk_window_set_is_toplevel): New internal + function used when a GtkPlug parents/unparents itself by an + in-process GtkSocket. This keeps the plug's GTK_TOPLEVEL flag in + sync with the global toplevel_list. + + * gtk/gtkplug.c (gtk_plug_set_is_child): Call + _gtk_window_set_is_toplevel() to keep the toplevel list updated, + instead of just setting/unsetting the GTK_TOPLEVEL flag. + 2009-01-23 Matthias Clasen Bug 568744 – Spellfixes in GtkTreeView's documentation diff --git a/gtk/gtkplug.c b/gtk/gtkplug.c index a692de8be3..4c31ea70d6 100644 --- a/gtk/gtkplug.c +++ b/gtk/gtkplug.c @@ -220,7 +220,7 @@ gtk_plug_set_is_child (GtkPlug *plug, if (GTK_WIDGET_MAPPED (plug)) gtk_widget_unmap (GTK_WIDGET (plug)); - GTK_WIDGET_UNSET_FLAGS (plug, GTK_TOPLEVEL); + _gtk_window_set_is_toplevel (GTK_WINDOW (plug), FALSE); gtk_container_set_resize_mode (GTK_CONTAINER (plug), GTK_RESIZE_PARENT); _gtk_widget_propagate_hierarchy_changed (GTK_WIDGET (plug), GTK_WIDGET (plug)); @@ -235,7 +235,7 @@ gtk_plug_set_is_child (GtkPlug *plug, plug->modality_group = gtk_window_group_new (); gtk_window_group_add_window (plug->modality_group, GTK_WINDOW (plug)); - GTK_WIDGET_SET_FLAGS (plug, GTK_TOPLEVEL); + _gtk_window_set_is_toplevel (GTK_WINDOW (plug), TRUE); gtk_container_set_resize_mode (GTK_CONTAINER (plug), GTK_RESIZE_QUEUE); _gtk_widget_propagate_hierarchy_changed (GTK_WIDGET (plug), NULL); diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index 095a11a796..90153ad5bf 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -8295,6 +8295,41 @@ _gtk_window_set_is_active (GtkWindow *window, } } +/** + * _gtk_windwo_set_is_toplevel: + * @window: a #GtkWindow + * @is_toplevel: %TRUE if the window is still a real toplevel (nominally a + * parent of the root window); %FALSE if it is not (for example, for an + * in-process, parented GtkPlug) + * + * Internal function used by #GtkPlug when it gets parented/unparented by a + * #GtkSocket. This keeps the @window's #GTK_TOPLEVEL flag in sync with the + * global list of toplevel windows. + */ +void +_gtk_window_set_is_toplevel (GtkWindow *window, + gboolean is_toplevel) +{ + if (GTK_WIDGET_TOPLEVEL (window)) + g_assert (g_list_find (toplevel_list, window) != NULL); + else + g_assert (g_list_find (toplevel_list, window) == NULL); + + if (is_toplevel == GTK_WIDGET_TOPLEVEL (window)) + return; + + if (is_toplevel) + { + GTK_WIDGET_SET_FLAGS (window, GTK_TOPLEVEL); + toplevel_list = g_slist_prepend (toplevel_list, window); + } + else + { + GTK_WIDGET_UNSET_FLAGS (window, GTK_TOPLEVEL); + toplevel_list = g_slist_remove (toplevel_list, window); + } +} + /** * _gtk_window_set_has_toplevel_focus: * @window: a #GtkWindow diff --git a/gtk/gtkwindow.h b/gtk/gtkwindow.h index e166befc89..243dbdc6bd 100644 --- a/gtk/gtkwindow.h +++ b/gtk/gtkwindow.h @@ -420,6 +420,9 @@ void _gtk_window_unset_focus_and_default (GtkWindow *window, void _gtk_window_set_is_active (GtkWindow *window, gboolean is_active); +void _gtk_window_set_is_toplevel (GtkWindow *window, + gboolean is_toplevel); + typedef void (*GtkWindowKeysForeachFunc) (GtkWindow *window, guint keyval, GdkModifierType modifiers,