diff options
author | Matthias Clasen <mclasen@redhat.com> | 2021-01-26 23:43:11 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2021-01-26 23:45:06 -0500 |
commit | 8ef1d6a49ca2955d152e67012f79b9ad5cc73a37 (patch) | |
tree | 452e6396a9a58c30a98fa3071f04c485fd0836ee | |
parent | ec9159f98356d005c08e11e6d2599a2f76e4b96e (diff) | |
download | gtk+-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.c | 18 |
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; |