forked from AuroraMiddleware/gtk
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.
This commit is contained in:
parent
8fab4ceebb
commit
6eb848f0e0
@ -1444,12 +1444,47 @@ gtk_popover_remove (GtkContainer *container,
|
|||||||
gtk_widget_unparent (child);
|
gtk_widget_unparent (child);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
add_tab_bindings (GtkBindingSet *binding_set,
|
||||||
|
GdkModifierType modifiers,
|
||||||
|
GtkDirectionType direction)
|
||||||
|
{
|
||||||
|
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Tab, modifiers,
|
||||||
|
"move-focus", 1,
|
||||||
|
GTK_TYPE_DIRECTION_TYPE, direction);
|
||||||
|
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Tab, modifiers,
|
||||||
|
"move-focus", 1,
|
||||||
|
GTK_TYPE_DIRECTION_TYPE, direction);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
add_arrow_bindings (GtkBindingSet *binding_set,
|
||||||
|
guint keysym,
|
||||||
|
GtkDirectionType direction)
|
||||||
|
{
|
||||||
|
guint keypad_keysym = keysym - GDK_KEY_Left + GDK_KEY_KP_Left;
|
||||||
|
|
||||||
|
gtk_binding_entry_add_signal (binding_set, keysym, 0,
|
||||||
|
"move-focus", 1,
|
||||||
|
GTK_TYPE_DIRECTION_TYPE, direction);
|
||||||
|
gtk_binding_entry_add_signal (binding_set, keysym, GDK_CONTROL_MASK,
|
||||||
|
"move-focus", 1,
|
||||||
|
GTK_TYPE_DIRECTION_TYPE, direction);
|
||||||
|
gtk_binding_entry_add_signal (binding_set, keypad_keysym, 0,
|
||||||
|
"move-focus", 1,
|
||||||
|
GTK_TYPE_DIRECTION_TYPE, direction);
|
||||||
|
gtk_binding_entry_add_signal (binding_set, keypad_keysym, GDK_CONTROL_MASK,
|
||||||
|
"move-focus", 1,
|
||||||
|
GTK_TYPE_DIRECTION_TYPE, direction);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gtk_popover_class_init (GtkPopoverClass *klass)
|
gtk_popover_class_init (GtkPopoverClass *klass)
|
||||||
{
|
{
|
||||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||||
GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
|
GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
|
||||||
|
GtkBindingSet *binding_set;
|
||||||
|
|
||||||
object_class->dispose = gtk_popover_dispose;
|
object_class->dispose = gtk_popover_dispose;
|
||||||
object_class->finalize = gtk_popover_finalize;
|
object_class->finalize = gtk_popover_finalize;
|
||||||
@ -1528,6 +1563,25 @@ gtk_popover_class_init (GtkPopoverClass *klass)
|
|||||||
G_TYPE_NONE,
|
G_TYPE_NONE,
|
||||||
0);
|
0);
|
||||||
|
|
||||||
|
binding_set = gtk_binding_set_by_class (klass);
|
||||||
|
|
||||||
|
add_arrow_bindings (binding_set, GDK_KEY_Up, GTK_DIR_UP);
|
||||||
|
add_arrow_bindings (binding_set, GDK_KEY_Down, GTK_DIR_DOWN);
|
||||||
|
add_arrow_bindings (binding_set, GDK_KEY_Left, GTK_DIR_LEFT);
|
||||||
|
add_arrow_bindings (binding_set, GDK_KEY_Right, GTK_DIR_RIGHT);
|
||||||
|
|
||||||
|
add_tab_bindings (binding_set, 0, GTK_DIR_TAB_FORWARD);
|
||||||
|
add_tab_bindings (binding_set, GDK_CONTROL_MASK, GTK_DIR_TAB_FORWARD);
|
||||||
|
add_tab_bindings (binding_set, GDK_SHIFT_MASK, GTK_DIR_TAB_BACKWARD);
|
||||||
|
add_tab_bindings (binding_set, GDK_CONTROL_MASK | GDK_SHIFT_MASK, GTK_DIR_TAB_BACKWARD);
|
||||||
|
|
||||||
|
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Return, 0,
|
||||||
|
"activate-default", 0);
|
||||||
|
gtk_binding_entry_add_signal (binding_set, GDK_KEY_ISO_Enter, 0,
|
||||||
|
"activate-default", 0);
|
||||||
|
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Enter, 0,
|
||||||
|
"activate-default", 0);
|
||||||
|
|
||||||
gtk_widget_class_set_css_name (widget_class, "popover");
|
gtk_widget_class_set_css_name (widget_class, "popover");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user