summaryrefslogtreecommitdiff
path: root/gtk/gtkcolumnviewrowwidget.c
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2023-03-21 13:43:35 +0100
committerBenjamin Otte <otte@redhat.com>2023-03-23 04:45:03 +0100
commit7285830dfb21a385e146400b36a1f5b7963a2c9f (patch)
tree5ec5e5eaf7fccacdae8e9b0e4eb6993f001dc84f /gtk/gtkcolumnviewrowwidget.c
parent817732ded954893b3f7e83f7fa3613717552704c (diff)
downloadgtk+-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.c49
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;