From: Benjamin Otte Date: Tue, 21 Mar 2023 12:43:35 +0000 (+0100) Subject: columnviewrow: Handle focus movement properly X-Git-Tag: archive/raspbian/4.12.3+ds-1+rpi1~1^2^2^2~22^2~1^2~514^2~4 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=7285830dfb21a385e146400b36a1f5b7963a2c9f;p=gtk4.git columnviewrow: Handle focus movement properly Handle backwards tab properly and deal with left right arrows. --- diff --git a/gtk/gtkcolumnviewrowwidget.c b/gtk/gtkcolumnviewrowwidget.c index 2bd47337aa..e3b9db6c1a 100644 --- a/gtk/gtkcolumnviewrowwidget.c +++ b/gtk/gtkcolumnviewrowwidget.c @@ -91,6 +91,50 @@ gtk_column_view_row_widget_update (GtkListItemBase *base, gtk_list_factory_widget_set_activatable (fw, activatable); } +static GtkWidget * +gtk_column_view_next_focus_widget (GtkWidget *widget, + GtkWidget *child, + GtkDirectionType direction) +{ + gboolean forward; + + switch (direction) + { + case GTK_DIR_TAB_FORWARD: + forward = TRUE; + break; + case GTK_DIR_TAB_BACKWARD: + forward = FALSE; + break; + case GTK_DIR_LEFT: + forward = gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL; + break; + case GTK_DIR_RIGHT: + forward = gtk_widget_get_direction (widget) != GTK_TEXT_DIR_RTL; + break; + case GTK_DIR_UP: + case GTK_DIR_DOWN: + return NULL; + default: + g_return_val_if_reached (NULL); + } + + if (forward) + { + if (child) + return gtk_widget_get_next_sibling (child); + else + return gtk_widget_get_first_child (widget); + } + else + { + if (child) + return gtk_widget_get_prev_sibling (child); + else + return gtk_widget_get_last_child (widget); + } +} + static gboolean gtk_column_view_row_widget_focus (GtkWidget *widget, GtkDirectionType direction) @@ -112,10 +156,9 @@ gtk_column_view_row_widget_focus (GtkWidget *widget, if (focus_child && gtk_widget_child_focus (focus_child, direction)) return TRUE; - for (child = focus_child ? gtk_widget_get_next_sibling (focus_child) - : gtk_widget_get_first_child (widget); + for (child = gtk_column_view_next_focus_widget (widget, focus_child, direction); child; - child = gtk_widget_get_next_sibling (child)) + child = gtk_column_view_next_focus_widget (widget, child, direction)) { if (gtk_widget_child_focus (child, direction)) return TRUE;