forked from AuroraMiddleware/gtk
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:
parent
aaab461c27
commit
38547120b2
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user