[gnome-control-center] keyboard: Handle `keynav-failed` on input source list



commit cd4dd18f52679f5797e1c13d7ba3f8de1c30880e
Author: Christopher Davis <christopherdavis gnome org>
Date:   Sat Feb 12 17:49:06 2022 -0800

    keyboard: Handle `keynav-failed` on input source list
    
    Fixes keynav with arrows between the input list
    group and other groups.

 panels/keyboard/cc-input-list-box.c  | 18 ++++++++++++++++++
 panels/keyboard/cc-input-list-box.ui |  1 +
 2 files changed, 19 insertions(+)
---
diff --git a/panels/keyboard/cc-input-list-box.c b/panels/keyboard/cc-input-list-box.c
index 2d7aa581c..1253af71c 100644
--- a/panels/keyboard/cc-input-list-box.c
+++ b/panels/keyboard/cc-input-list-box.c
@@ -182,6 +182,23 @@ maybe_start_ibus (void)
 
 #endif
 
+static gboolean
+keynav_failed_cb (CcInputListBox   *self,
+                  GtkDirectionType  direction,
+                  GtkWidget        *list)
+{
+  GtkWidget *toplevel = GTK_WIDGET (gtk_widget_get_root (GTK_WIDGET (self)));
+
+  if (!toplevel)
+    return FALSE;
+
+  if (direction != GTK_DIR_UP && direction != GTK_DIR_DOWN)
+    return FALSE;
+
+  return gtk_widget_child_focus (toplevel, direction == GTK_DIR_UP ?
+                                 GTK_DIR_TAB_BACKWARD : GTK_DIR_TAB_FORWARD);
+}
+
 static void
 row_settings_cb (CcInputListBox *self,
                  CcInputRow    *row)
@@ -735,6 +752,7 @@ cc_input_list_box_class_init (CcInputListBoxClass *klass)
   gtk_widget_class_bind_template_child (widget_class, CcInputListBox, no_inputs_row);
 
   gtk_widget_class_bind_template_callback (widget_class, input_row_activated_cb);
+  gtk_widget_class_bind_template_callback (widget_class, keynav_failed_cb);
 }
 
 static void
diff --git a/panels/keyboard/cc-input-list-box.ui b/panels/keyboard/cc-input-list-box.ui
index e50bfde54..036cca423 100644
--- a/panels/keyboard/cc-input-list-box.ui
+++ b/panels/keyboard/cc-input-list-box.ui
@@ -9,6 +9,7 @@
         <property name="vexpand">True</property>
         <property name="selection-mode">none</property>
         <signal name="row_activated" handler="input_row_activated_cb" object="CcInputListBox" swapped="yes"/>
+        <signal name="keynav_failed" handler="keynav_failed_cb" object="CcInputListBox" swapped="yes"/>
         <style>
           <class name="boxed-list"/>
         </style>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]