summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2021-01-26 23:43:11 -0500
committerMatthias Clasen <mclasen@redhat.com>2021-01-26 23:45:06 -0500
commit8ef1d6a49ca2955d152e67012f79b9ad5cc73a37 (patch)
tree452e6396a9a58c30a98fa3071f04c485fd0836ee
parentec9159f98356d005c08e11e6d2599a2f76e4b96e (diff)
downloadgtk+-8ef1d6a49ca2955d152e67012f79b9ad5cc73a37.tar.gz
widget: Fix can-focus
Setting can-focus to FALSE on a widget is supposed to prevent focus from entering the entire subtree. So when we grab focus directly to a widget, we need to check the can-focus flag not just of the widget itself, but all its ancestors. Fixes: #3610
-rw-r--r--gtk/gtkwidget.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index 0daeef7a6d..0186968bd7 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -4391,12 +4391,26 @@ gtk_widget_can_activate (GtkWidget *self)
}
static gboolean
+get_effective_can_focus (GtkWidget *widget)
+{
+ GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
+
+ if (!priv->can_focus)
+ return FALSE;
+
+ if (priv->parent)
+ return get_effective_can_focus (priv->parent);
+
+ return TRUE;
+}
+
+static gboolean
gtk_widget_real_mnemonic_activate (GtkWidget *widget,
gboolean group_cycling)
{
if (!group_cycling && gtk_widget_can_activate (widget))
gtk_widget_activate (widget);
- else if (gtk_widget_get_can_focus (widget))
+ else if (get_effective_can_focus (widget))
return gtk_widget_grab_focus (widget);
else
{
@@ -4782,7 +4796,7 @@ gtk_widget_grab_focus (GtkWidget *widget)
g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
if (!gtk_widget_is_sensitive (widget) ||
- !gtk_widget_get_can_focus (widget) ||
+ !get_effective_can_focus (widget) ||
widget->priv->root == NULL)
return FALSE;