From 32305b453d23b6af331f18a792b0866220784d5f Mon Sep 17 00:00:00 2001 From: Olivier Fourdan Date: Thu, 12 Oct 2017 16:55:53 +0200 Subject: [PATCH] clutter: add hooks for kbd a11y configuration Use a set of bitwise enum flags to set different keyboard accessibility features and the necessary vfunc hooks in clutter input device so that keyboard preferences can be passed to different input device implementations. The idea is to be able to configure either the clutter own implementation of keyboard accessibility for evdev, or eventually configure AccessX from the X11 clutter input device using the same mechanism. https://bugzilla.gnome.org/show_bug.cgi?id=788564 --- clutter/clutter/clutter-device-manager.c | 43 ++++++++++++++++++++++++ clutter/clutter/clutter-device-manager.h | 30 ++++++++++++++++- clutter/clutter/clutter-enums.h | 37 ++++++++++++++++++++ 3 files changed, 109 insertions(+), 1 deletion(-) diff --git a/clutter/clutter/clutter-device-manager.c b/clutter/clutter/clutter-device-manager.c index 92badd8a5..812e7e296 100644 --- a/clutter/clutter/clutter-device-manager.c +++ b/clutter/clutter/clutter-device-manager.c @@ -54,6 +54,9 @@ struct _ClutterDeviceManagerPrivate { /* back-pointer to the backend */ ClutterBackend *backend; + + /* Keyboard a11y */ + ClutterKbdA11ySettings kbd_a11y_settings; }; enum @@ -487,3 +490,43 @@ _clutter_device_manager_compress_motion (ClutterDeviceManager *device_manager, manager_class->compress_motion (device_manager, event, to_discard); } + +static gboolean +are_kbd_a11y_settings_equal (ClutterKbdA11ySettings *a, + ClutterKbdA11ySettings *b) +{ + return (a->controls == b->controls && + a->slowkeys_delay == b->slowkeys_delay && + a->debounce_delay == b->debounce_delay && + a->timeout_delay == b->timeout_delay && + a->mousekeys_init_delay == b->mousekeys_init_delay && + a->mousekeys_max_speed == b->mousekeys_max_speed && + a->mousekeys_accel_time == b->mousekeys_accel_time); +} + +void +clutter_device_manager_set_kbd_a11y_settings (ClutterDeviceManager *device_manager, + ClutterKbdA11ySettings *settings) +{ + ClutterDeviceManagerClass *manager_class; + + g_return_if_fail (CLUTTER_IS_DEVICE_MANAGER (device_manager)); + + if (are_kbd_a11y_settings_equal (&device_manager->priv->kbd_a11y_settings, settings)) + return; + + device_manager->priv->kbd_a11y_settings = *settings; + + manager_class = CLUTTER_DEVICE_MANAGER_GET_CLASS (device_manager); + if (manager_class->apply_kbd_a11y_settings) + manager_class->apply_kbd_a11y_settings (device_manager, settings); +} + +void +clutter_device_manager_get_kbd_a11y_settings (ClutterDeviceManager *device_manager, + ClutterKbdA11ySettings *settings) +{ + g_return_if_fail (CLUTTER_IS_DEVICE_MANAGER (device_manager)); + + *settings = device_manager->priv->kbd_a11y_settings; +} diff --git a/clutter/clutter/clutter-device-manager.h b/clutter/clutter/clutter-device-manager.h index 84f8f0bda..2a152c932 100644 --- a/clutter/clutter/clutter-device-manager.h +++ b/clutter/clutter/clutter-device-manager.h @@ -44,6 +44,25 @@ typedef struct _ClutterDeviceManager ClutterDeviceManager; typedef struct _ClutterDeviceManagerPrivate ClutterDeviceManagerPrivate; typedef struct _ClutterDeviceManagerClass ClutterDeviceManagerClass; + +/** + * ClutterKbdA11ySettings: + * + * The #ClutterKbdA11ySettings structure contains keyboard accessibility + * settings + * + */ +typedef struct _ClutterKbdA11ySettings +{ + ClutterKeyboardA11yFlags controls; + gint slowkeys_delay; + gint debounce_delay; + gint timeout_delay; + gint mousekeys_init_delay; + gint mousekeys_max_speed; + gint mousekeys_accel_time; +} ClutterKbdA11ySettings; + /** * ClutterDeviceManager: * @@ -88,7 +107,9 @@ struct _ClutterDeviceManagerClass void (* compress_motion) (ClutterDeviceManager *device_manger, ClutterEvent *event, const ClutterEvent *to_discard); - + /* Keyboard accessbility */ + void (* apply_kbd_a11y_settings) (ClutterDeviceManager *device_manger, + ClutterKbdA11ySettings *settings); /* padding */ gpointer _padding[6]; }; @@ -114,6 +135,13 @@ CLUTTER_AVAILABLE_IN_ALL ClutterVirtualInputDevice *clutter_device_manager_create_virtual_device (ClutterDeviceManager *device_manager, ClutterInputDeviceType device_type); +CLUTTER_AVAILABLE_IN_ALL +void clutter_device_manager_set_kbd_a11y_settings (ClutterDeviceManager *device_manager, + ClutterKbdA11ySettings *settings); +CLUTTER_AVAILABLE_IN_ALL +void clutter_device_manager_get_kbd_a11y_settings (ClutterDeviceManager *device_manager, + ClutterKbdA11ySettings *settings); + G_END_DECLS #endif /* __CLUTTER_DEVICE_MANAGER_H__ */ diff --git a/clutter/clutter/clutter-enums.h b/clutter/clutter/clutter-enums.h index 03c0395db..38a142d0f 100644 --- a/clutter/clutter/clutter-enums.h +++ b/clutter/clutter/clutter-enums.h @@ -396,6 +396,43 @@ typedef enum { CLUTTER_MODIFIER_MASK = 0x5c001fff } ClutterModifierType; +/** + * ClutterKeyboardA11yFlags: + * @CLUTTER_A11Y_KEYBOARD_ENABLED: + * @CLUTTER_A11Y_TIMEOUT_ENABLED: + * @CLUTTER_A11Y_MOUSE_KEYS_ENABLED: + * @CLUTTER_A11Y_SLOW_KEYS_ENABLED: + * @CLUTTER_A11Y_SLOW_KEYS_BEEP_PRESS: + * @CLUTTER_A11Y_SLOW_KEYS_BEEP_ACCEPT: + * @CLUTTER_A11Y_SLOW_KEYS_BEEP_REJECT: + * @CLUTTER_A11Y_BOUNCE_KEYS_ENABLED: + * @CLUTTER_A11Y_BOUNCE_KEYS_BEEP_REJECT: + * @CLUTTER_A11Y_TOGGLE_KEYS_ENABLED: + * @CLUTTER_A11Y_STICKY_KEYS_ENABLED: + * @CLUTTER_A11Y_STICKY_KEYS_TWO_KEY_OFF: + * @CLUTTER_A11Y_STICKY_KEYS_BEEP: + * @CLUTTER_A11Y_FEATURE_STATE_CHANGE_BEEP: + * + * Keyboard accessibility features applied to a ClutterInputDevice keyboard. + * + */ +typedef enum { + CLUTTER_A11Y_KEYBOARD_ENABLED = 1 << 0, + CLUTTER_A11Y_TIMEOUT_ENABLED = 1 << 1, + CLUTTER_A11Y_MOUSE_KEYS_ENABLED = 1 << 2, + CLUTTER_A11Y_SLOW_KEYS_ENABLED = 1 << 3, + CLUTTER_A11Y_SLOW_KEYS_BEEP_PRESS = 1 << 4, + CLUTTER_A11Y_SLOW_KEYS_BEEP_ACCEPT = 1 << 5, + CLUTTER_A11Y_SLOW_KEYS_BEEP_REJECT = 1 << 6, + CLUTTER_A11Y_BOUNCE_KEYS_ENABLED = 1 << 7, + CLUTTER_A11Y_BOUNCE_KEYS_BEEP_REJECT = 1 << 8, + CLUTTER_A11Y_TOGGLE_KEYS_ENABLED = 1 << 9, + CLUTTER_A11Y_STICKY_KEYS_ENABLED = 1 << 10, + CLUTTER_A11Y_STICKY_KEYS_TWO_KEY_OFF = 1 << 11, + CLUTTER_A11Y_STICKY_KEYS_BEEP = 1 << 12, + CLUTTER_A11Y_FEATURE_STATE_CHANGE_BEEP = 1 << 13, +} ClutterKeyboardA11yFlags; + /** * ClutterActorFlags: * @CLUTTER_ACTOR_MAPPED: the actor will be painted (is visible, and inside