diff options
author | Benjamin Otte <otte@redhat.com> | 2023-03-21 13:43:35 +0100 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2023-03-23 04:45:03 +0100 |
commit | 7285830dfb21a385e146400b36a1f5b7963a2c9f (patch) | |
tree | 5ec5e5eaf7fccacdae8e9b0e4eb6993f001dc84f /gtk/gtkcolumnviewrowwidget.c | |
parent | 817732ded954893b3f7e83f7fa3613717552704c (diff) | |
download | gtk+-7285830dfb21a385e146400b36a1f5b7963a2c9f.tar.gz |
columnviewrow: Handle focus movement properly
Handle backwards tab properly and deal with left right arrows.
Diffstat (limited to 'gtk/gtkcolumnviewrowwidget.c')
-rw-r--r-- | gtk/gtkcolumnviewrowwidget.c | 49 |
1 files changed, 46 insertions, 3 deletions
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; |