diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index 7377502371..52e74e82be 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -5206,55 +5206,52 @@ gtk_window_css_changed (GtkWidget *widget, } } -/** +/* * _gtk_window_unset_focus_and_default: * @window: a #GtkWindow * @widget: a widget inside of @window - * + * * Checks whether the focus and default widgets of @window are * @widget or a descendent of @widget, and if so, unset them. - **/ + */ void _gtk_window_unset_focus_and_default (GtkWindow *window, - GtkWidget *widget) + GtkWidget *widget) { GtkWindowPrivate *priv = gtk_window_get_instance_private (window); GtkWidget *child; GtkWidget *parent; + GtkWidget *focus; g_object_ref (window); g_object_ref (widget); - parent = _gtk_widget_get_parent (widget); - if (gtk_widget_get_focus_child (parent) == widget) + focus = priv->focus_widget; + if (focus && (focus == widget || gtk_widget_is_ancestor (focus, widget))) { - child = priv->focus_widget; - - while (child && child != widget) - child = _gtk_widget_get_parent (child); + parent = _gtk_widget_get_parent (widget); - if (child == widget) + while (parent) { - GtkWidget *new_focus; + if (_gtk_widget_get_visible (parent)) + { + gtk_window_set_focus (window, parent); + break; + } - if (GTK_IS_NATIVE (widget)) - new_focus = gtk_widget_get_parent (widget); - else - new_focus = NULL; - - gtk_window_set_focus (GTK_WINDOW (window), new_focus); + parent = gtk_widget_get_parent (parent); } } - + child = priv->default_widget; - + while (child && child != widget) child = _gtk_widget_get_parent (child); if (child == widget) gtk_window_set_default_widget (window, NULL); - + g_object_unref (widget); g_object_unref (window); }