summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Davis <christopherdavis@gnome.org>2022-02-12 17:49:06 -0800
committerGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2022-02-13 13:33:25 +0000
commitcd4dd18f52679f5797e1c13d7ba3f8de1c30880e (patch)
treeeaa842efb8243f24b77b6e844a953ed5a2c7e258
parent1a3971fdbefb4763a4df3c31852354ae743b65a2 (diff)
downloadgnome-control-center-cd4dd18f52679f5797e1c13d7ba3f8de1c30880e.tar.gz
keyboard: Handle `keynav-failed` on input source list
Fixes keynav with arrows between the input list group and other groups.
-rw-r--r--panels/keyboard/cc-input-list-box.c18
-rw-r--r--panels/keyboard/cc-input-list-box.ui1
2 files changed, 19 insertions, 0 deletions
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>