[gtk/wip/carlosg/for-master] gtkwindow: Ensure to revert focus to a parent on hide()




commit 38547120b2ea2cb1c525a2d015051b09489ba099
Author: Carlos Garnacho <carlosg gnome org>
Date:   Thu Oct 1 16:54:10 2020 +0200

    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

 gtk/gtkwindow.c | 24 ++++++++++--------------
 1 file changed, 10 insertions(+), 14 deletions(-)
---
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index 947b178f76..6bdb06931b 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -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_IS_NATIVE (widget))
-            new_focus = gtk_widget_get_parent (widget);
-          else
-            new_focus = NULL;
+          if (_gtk_widget_get_visible (parent))
+            {
+              gtk_widget_grab_focus (parent);
+              break;
+            }
 
-         gtk_window_set_focus (GTK_WINDOW (window), new_focus);
+          parent = gtk_widget_get_parent (parent);
         }
     }
       


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]