diff options
author | Jasper St. Pierre <jstpierre@mecheye.net> | 2014-07-25 09:20:47 -0400 |
---|---|---|
committer | Jasper St. Pierre <jstpierre@mecheye.net> | 2014-07-25 09:25:01 -0400 |
commit | 4f55e16fe9d0f1cda6e8c70aec87dbafade4ffbc (patch) | |
tree | 88bedb56bb818aa78c4351655677b9471e4132af | |
parent | c30ef668deff2693043d01833390a2834612682f (diff) | |
download | mutter-4f55e16fe9d0f1cda6e8c70aec87dbafade4ffbc.tar.gz |
wayland-keyboard: Add support for the repeat_info event in Wayland v4
-rw-r--r-- | src/wayland/meta-wayland-keyboard.c | 64 | ||||
-rw-r--r-- | src/wayland/meta-wayland-keyboard.h | 2 | ||||
-rw-r--r-- | src/wayland/meta-wayland-versions.h | 4 |
3 files changed, 68 insertions, 2 deletions
diff --git a/src/wayland/meta-wayland-keyboard.c b/src/wayland/meta-wayland-keyboard.c index 53d980917..20f77c99e 100644 --- a/src/wayland/meta-wayland-keyboard.c +++ b/src/wayland/meta-wayland-keyboard.c @@ -290,6 +290,62 @@ meta_wayland_keyboard_update_xkb_state (MetaWaylandKeyboard *keyboard) xkb_state_serialize_layout (xkb_info->state, XKB_STATE_LAYOUT_EFFECTIVE)); } +static void +notify_key_repeat_for_resource (MetaWaylandKeyboard *keyboard, + struct wl_resource *keyboard_resource) +{ + if (wl_resource_get_version (keyboard_resource) >= WL_KEYBOARD_REPEAT_INFO_SINCE_VERSION) + { + gboolean repeat; + unsigned int delay, rate; + + repeat = g_settings_get_boolean (keyboard->settings, "repeat"); + + if (repeat) + { + unsigned int interval; + interval = g_settings_get_uint (keyboard->settings, "repeat-interval"); + /* Our setting is in the milliseconds between keys. "rate" is the number + * of keys per second. */ + rate = (1000 / interval); + delay = g_settings_get_uint (keyboard->settings, "delay"); + } + else + { + rate = 0; + delay = 0; + } + + wl_keyboard_send_repeat_info (keyboard_resource, rate, delay); + } +} + +static void +notify_key_repeat (MetaWaylandKeyboard *keyboard) +{ + struct wl_resource *keyboard_resource; + + wl_resource_for_each (keyboard_resource, &keyboard->resource_list) + { + notify_key_repeat_for_resource (keyboard, keyboard_resource); + } + + wl_resource_for_each (keyboard_resource, &keyboard->focus_resource_list) + { + notify_key_repeat_for_resource (keyboard, keyboard_resource); + } +} + +static void +settings_changed (GSettings *settings, + const char *key, + gpointer data) +{ + MetaWaylandKeyboard *keyboard = data; + + notify_key_repeat (keyboard); +} + void meta_wayland_keyboard_init (MetaWaylandKeyboard *keyboard, struct wl_display *display) @@ -315,6 +371,10 @@ meta_wayland_keyboard_init (MetaWaylandKeyboard *keyboard, "evdev", "pc105", "us", "", "", 0); + + keyboard->settings = g_settings_new ("org.gnome.settings-daemon.peripherals.keyboard"); + g_signal_connect (keyboard->settings, "changed", + G_CALLBACK (settings_changed), keyboard); } static void @@ -338,6 +398,8 @@ meta_wayland_keyboard_release (MetaWaylandKeyboard *keyboard) /* XXX: What about keyboard->resource_list? */ wl_array_release (&keyboard->keys); + + g_object_unref (keyboard->settings); } static void @@ -589,6 +651,8 @@ meta_wayland_keyboard_create_new_resource (MetaWaylandKeyboard *keyboard, keyboard->xkb_info.keymap_fd, keyboard->xkb_info.keymap_size); + notify_key_repeat_for_resource (keyboard, cr); + if (keyboard->focus_surface && wl_resource_get_client (keyboard->focus_surface->resource) == client) meta_wayland_keyboard_set_focus (keyboard, keyboard->focus_surface); } diff --git a/src/wayland/meta-wayland-keyboard.h b/src/wayland/meta-wayland-keyboard.h index ded287dfe..77bfff1bc 100644 --- a/src/wayland/meta-wayland-keyboard.h +++ b/src/wayland/meta-wayland-keyboard.h @@ -73,6 +73,8 @@ struct _MetaWaylandKeyboard struct xkb_context *xkb_context; MetaWaylandXkbInfo xkb_info; + + GSettings *settings; }; void meta_wayland_keyboard_init (MetaWaylandKeyboard *keyboard, diff --git a/src/wayland/meta-wayland-versions.h b/src/wayland/meta-wayland-versions.h index d1301af78..2152b1597 100644 --- a/src/wayland/meta-wayland-versions.h +++ b/src/wayland/meta-wayland-versions.h @@ -39,7 +39,7 @@ #define META_WL_DATA_DEVICE_MANAGER_VERSION 1 #define META_XDG_SHELL_VERSION 1 #define META_WL_SHELL_VERSION 1 -#define META_WL_SEAT_VERSION 3 +#define META_WL_SEAT_VERSION 4 #define META_WL_OUTPUT_VERSION 2 #define META_XSERVER_VERSION 1 #define META_GTK_SHELL_VERSION 1 @@ -51,7 +51,7 @@ #define META_WL_DATA_DEVICE_VERSION 1 /* from wl_data_device_manager */ #define META_WL_SURFACE_VERSION 3 /* from wl_compositor */ #define META_WL_POINTER_VERSION 3 /* from wl_seat */ -#define META_WL_KEYBOARD_VERSION 3 /* from wl_seat */ +#define META_WL_KEYBOARD_VERSION 4 /* from wl_seat */ #define META_WL_TOUCH_VERSION 3 /* from wl_seat */ #define META_WL_REGION_VERSION 1 /* from wl_compositor */ #define META_XDG_SURFACE_VERSION 1 /* from xdg_shell */ |