summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTristan Van Berkom <tristan.van.berkom@gmail.com>2010-12-24 12:01:43 +0900
committerTristan Van Berkom <tristan.van.berkom@gmail.com>2010-12-29 18:22:39 +0900
commit3630b63b9cf5c4337121d21e366fb615acf9603b (patch)
treedee03f83cbf17dd5d273ce6ed0efc750322d9ec0
parent0435071747f6c8a541f57e16628cee277564cc12 (diff)
downloadgtk+-3630b63b9cf5c4337121d21e366fb615acf9603b.tar.gz
Fixed issues with "hierarchy-changed" signal.
GtkFileChooserDefault watches the toplevel and montitors "set-focus" signal on it... however the connection needs to be remade when the GtkFileChooserDialog is in an embedded toplevel. Measure's taken: GtkWindow propagates hierarchy changes when _gtk_window_set_is_toplevel() is called, gtk_widget_unparent() unsets the widget's parent window earlier in the function so that the possible hierarchy change is still able to properly access the hierarchy. GtkFileChooserDefault checks if the "new" toplevel is indeed gtk_widget_is_toplevel() but not the old one, GtkRange has been updated to use gtk_widget_is_toplevel() inside it's hierarhcy_changed vfunc, other classes already do this properly.
-rw-r--r--gtk/gtkfilechooserdefault.c2
-rw-r--r--gtk/gtkrange.c2
-rw-r--r--gtk/gtkwidget.c9
-rw-r--r--gtk/gtkwindow.c9
4 files changed, 19 insertions, 3 deletions
diff --git a/gtk/gtkfilechooserdefault.c b/gtk/gtkfilechooserdefault.c
index 42ced3fb46..9c36b8a334 100644
--- a/gtk/gtkfilechooserdefault.c
+++ b/gtk/gtkfilechooserdefault.c
@@ -5601,7 +5601,7 @@ gtk_file_chooser_default_hierarchy_changed (GtkWidget *widget,
g_assert (impl->toplevel_set_focus_id == 0);
toplevel = gtk_widget_get_toplevel (widget);
- if (GTK_IS_WINDOW (toplevel))
+ if (gtk_widget_is_toplevel (toplevel))
{
impl->toplevel_set_focus_id = g_signal_connect (toplevel, "set-focus",
G_CALLBACK (toplevel_set_focus_cb), impl);
diff --git a/gtk/gtkrange.c b/gtk/gtkrange.c
index c2409afb3f..77e713f93e 100644
--- a/gtk/gtkrange.c
+++ b/gtk/gtkrange.c
@@ -1725,7 +1725,7 @@ gtk_range_hierarchy_changed (GtkWidget *widget,
G_CALLBACK (resize_grip_visible_changed),
widget);
window = gtk_widget_get_toplevel (widget);
- if (GTK_IS_WINDOW (window))
+ if (gtk_widget_is_toplevel (window))
g_signal_connect (window, "notify::resize-grip-visible",
G_CALLBACK (resize_grip_visible_changed), widget);
}
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index 3fcda6a18c..b43e30b4a0 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -3712,9 +3712,17 @@ gtk_widget_unparent (GtkWidget *widget)
g_object_freeze_notify (G_OBJECT (widget));
nqueue = g_object_notify_queue_freeze (G_OBJECT (widget), _gtk_widget_child_property_notify_context);
+ /* Need to unset the parent window early, this can result in
+ * an additional "hierarchy-changed" propagation if we are removing
+ * a parented GtkWindow from the hierarchy.
+ */
+ gtk_widget_set_parent_window (widget, NULL);
+
toplevel = gtk_widget_get_toplevel (widget);
if (gtk_widget_is_toplevel (toplevel))
_gtk_window_unset_focus_and_default (GTK_WINDOW (toplevel), widget);
+ else
+ toplevel = NULL;
if (gtk_container_get_focus_child (GTK_CONTAINER (priv->parent)) == widget)
gtk_container_set_focus_child (GTK_CONTAINER (priv->parent), NULL);
@@ -3753,7 +3761,6 @@ gtk_widget_unparent (GtkWidget *widget)
old_parent = priv->parent;
priv->parent = NULL;
- gtk_widget_set_parent_window (widget, NULL);
/* parent may no longer expand if the removed
* child was expand=TRUE and could therefore
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index e960bd6cf9..b1a14cc7ba 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -9222,6 +9222,7 @@ _gtk_window_set_is_toplevel (GtkWindow *window,
gboolean is_toplevel)
{
GtkWidget *widget;
+ GtkWidget *toplevel;
widget = GTK_WIDGET (window);
@@ -9235,6 +9236,12 @@ _gtk_window_set_is_toplevel (GtkWindow *window,
if (is_toplevel)
{
+ toplevel = gtk_widget_get_toplevel (widget);
+ if (!gtk_widget_is_toplevel (toplevel))
+ toplevel = NULL;
+
+ _gtk_widget_propagate_hierarchy_changed (widget, toplevel);
+
_gtk_widget_set_is_toplevel (widget, TRUE);
toplevel_list = g_slist_prepend (toplevel_list, window);
}
@@ -9242,6 +9249,8 @@ _gtk_window_set_is_toplevel (GtkWindow *window,
{
_gtk_widget_set_is_toplevel (widget, FALSE);
toplevel_list = g_slist_remove (toplevel_list, window);
+
+ _gtk_widget_propagate_hierarchy_changed (widget, widget);
}
}