gtkwindow: Ensure to revert focus to a parent on hide()

When a widget is hidden, check harder for the keyboard focus being
contained in that widget, in order to reset it. Portions of the
focus child hierarchy may be outdated at the time, so it is more
reliable to check GtkRoot::focus (i.e. the property we intend to
update here).

Fixes: https://gitlab.gnome.org/GNOME/gtk/-/issues/3214
This commit is contained in:
Carlos Garnacho 2020-10-01 16:54:10 +02:00
parent aaab461c27
commit 38547120b2

View File

@ -5206,28 +5206,24 @@ _gtk_window_unset_focus_and_default (GtkWindow *window,
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 = gtk_root_get_focus (GTK_ROOT (window));
if (focus && (focus == widget || gtk_widget_is_ancestor (focus, widget)))
{
child = priv->focus_widget;
while (child && child != widget)
child = _gtk_widget_get_parent (child);
if (child == widget)
while (parent)
{
GtkWidget *new_focus;
if (_gtk_widget_get_visible (parent))
{
gtk_widget_grab_focus (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);
}
}