columnviewrowwidget: Handle left/right arrow keys
authorBenjamin Otte <otte@redhat.com>
Tue, 21 Mar 2023 13:08:14 +0000 (14:08 +0100)
committerBenjamin Otte <otte@redhat.com>
Thu, 23 Mar 2023 03:45:03 +0000 (04:45 +0100)
Make it move focus just like GtkWindow would.

Otherwise the listview will (try to) handle it and move focus between
cells - which doesn't do anything for lists and only works with grids.

gtk/gtkcolumnviewrowwidget.c

index e3b9db6c1a2694f1c97f50e8aa65351b7bd3416f..b4f4ef9fa7bb7e0a28b492132a8511cda39ef573 100644 (file)
@@ -353,6 +353,31 @@ gtk_column_view_row_widget_allocate (GtkWidget *widget,
     }
 }
 
+static void
+add_arrow_bindings (GtkWidgetClass   *widget_class,
+                   guint             keysym,
+                   GtkDirectionType  direction)
+{
+  guint keypad_keysym = keysym - GDK_KEY_Left + GDK_KEY_KP_Left;
+
+  gtk_widget_class_add_binding_signal (widget_class, keysym, 0,
+                                       "move-focus",
+                                       "(i)",
+                                       direction);
+  gtk_widget_class_add_binding_signal (widget_class, keysym, GDK_CONTROL_MASK,
+                                       "move-focus",
+                                       "(i)",
+                                       direction);
+  gtk_widget_class_add_binding_signal (widget_class, keypad_keysym, 0,
+                                       "move-focus",
+                                       "(i)",
+                                       direction);
+  gtk_widget_class_add_binding_signal (widget_class, keypad_keysym, GDK_CONTROL_MASK,
+                                       "move-focus",
+                                       "(i)",
+                                       direction);
+}
+
 static void
 gtk_column_view_row_widget_class_init (GtkColumnViewRowWidgetClass *klass)
 {
@@ -360,6 +385,7 @@ gtk_column_view_row_widget_class_init (GtkColumnViewRowWidgetClass *klass)
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
   base_class->update = gtk_column_view_row_widget_update;
+
   widget_class->focus = gtk_column_view_row_widget_focus;
   widget_class->grab_focus = gtk_column_view_row_widget_grab_focus;
   widget_class->measure = gtk_column_view_row_widget_measure;
@@ -367,6 +393,9 @@ gtk_column_view_row_widget_class_init (GtkColumnViewRowWidgetClass *klass)
   widget_class->root = gtk_column_view_row_widget_root;
   widget_class->unroot = gtk_column_view_row_widget_unroot;
 
+  add_arrow_bindings (widget_class, GDK_KEY_Left, GTK_DIR_LEFT);
+  add_arrow_bindings (widget_class, GDK_KEY_Right, GTK_DIR_RIGHT);
+
   /* This gets overwritten by gtk_column_view_row_widget_new() but better safe than sorry */
   gtk_widget_class_set_css_name (widget_class, g_intern_static_string ("row"));
   gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_ROW);