widget: Don't grab focus when can-focus == false
authorBenjamin Otte <otte@redhat.com>
Tue, 15 Oct 2019 14:30:46 +0000 (16:30 +0200)
committerBenjamin Otte <otte@redhat.com>
Tue, 15 Oct 2019 14:33:05 +0000 (16:33 +0200)
... inside the default vfunc.

Instead, walk the children until we find the first widget that can be
focused. If no child can be focused, return FALSE from grab_focus.

gtk/gtkwidget.c

index c3e0e288d2477fa12eec144a05c948de556eef23..0b8e4a07e27b0f71faff53d882e90956eccef1c7 100644 (file)
@@ -5436,9 +5436,23 @@ static gboolean
 gtk_widget_real_grab_focus (GtkWidget *focus_widget)
 {
   GtkWidgetPrivate *priv = gtk_widget_get_instance_private (focus_widget);
+  GtkWidget *child;
 
-  gtk_root_set_focus (priv->root, focus_widget);
-  return TRUE;
+  if (priv->can_focus)
+    {
+      gtk_root_set_focus (priv->root, focus_widget);
+      return TRUE;
+    }
+
+  for (child = _gtk_widget_get_first_child (focus_widget);
+       child != NULL;
+       child = _gtk_widget_get_next_sibling (child))
+    {
+      if (gtk_widget_grab_focus (child))
+        return TRUE;
+    }
+
+  return FALSE;
 }
 
 static gboolean