[gtk/wip/matthiasc/shortcut: 105/106] popover: Add keynav keybindings
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/matthiasc/shortcut: 105/106] popover: Add keynav keybindings
- Date: Wed, 18 Mar 2020 00:08:04 +0000 (UTC)
commit 5a357e79bbea1545ecef982861eb23e050235cb2
Author: Matthias Clasen <mclasen redhat com>
Date: Tue Mar 17 17:24:09 2020 -0400
popover: Add keynav keybindings
The shortcut controllers are limited to same-native,
so we need to duplicate the Tab and arrow key bindings
for focus handling, as well as the Enter bindings for
activation.
gtk/gtkpopover.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 61 insertions(+)
---
diff --git a/gtk/gtkpopover.c b/gtk/gtkpopover.c
index b054cbccda..77ad223f36 100644
--- a/gtk/gtkpopover.c
+++ b/gtk/gtkpopover.c
@@ -119,6 +119,7 @@
#include "gtkcsscolorvalueprivate.h"
#include "gtkcssnumbervalueprivate.h"
#include "gtksnapshot.h"
+#include "gtkshortcuttrigger.h"
#include "gtkrender.h"
#include "gtkstylecontextprivate.h"
@@ -1442,6 +1443,49 @@ gtk_popover_remove (GtkContainer *container,
gtk_widget_unparent (child);
}
+static void
+add_tab_bindings (GtkWidgetClass *widget_class,
+ GdkModifierType modifiers,
+ GtkDirectionType direction)
+{
+ GtkShortcut *shortcut;
+
+ shortcut = gtk_shortcut_new_with_arguments (
+ gtk_alternative_trigger_new (gtk_keyval_trigger_new (GDK_KEY_Tab, modifiers),
+ gtk_keyval_trigger_new (GDK_KEY_KP_Tab, modifiers)),
+ gtk_signal_action_new ("move-focus"),
+ "(i)", direction);
+
+ gtk_widget_class_add_shortcut (widget_class, shortcut);
+
+ g_object_unref (shortcut);
+}
+
+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_popover_class_init (GtkPopoverClass *klass)
{
@@ -1526,6 +1570,23 @@ gtk_popover_class_init (GtkPopoverClass *klass)
G_TYPE_NONE,
0);
+ add_arrow_bindings (widget_class, GDK_KEY_Up, GTK_DIR_UP);
+ add_arrow_bindings (widget_class, GDK_KEY_Down, GTK_DIR_DOWN);
+ add_arrow_bindings (widget_class, GDK_KEY_Left, GTK_DIR_LEFT);
+ add_arrow_bindings (widget_class, GDK_KEY_Right, GTK_DIR_RIGHT);
+
+ add_tab_bindings (widget_class, 0, GTK_DIR_TAB_FORWARD);
+ add_tab_bindings (widget_class, GDK_CONTROL_MASK, GTK_DIR_TAB_FORWARD);
+ add_tab_bindings (widget_class, GDK_SHIFT_MASK, GTK_DIR_TAB_BACKWARD);
+ add_tab_bindings (widget_class, GDK_CONTROL_MASK | GDK_SHIFT_MASK, GTK_DIR_TAB_BACKWARD);
+
+ gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_Return, 0,
+ "activate-default", NULL);
+ gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_ISO_Enter, 0,
+ "activate-default", NULL);
+ gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_KP_Enter, 0,
+ "activate-default", NULL);
+
gtk_widget_class_set_css_name (widget_class, "popover");
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]