From 61f0ed80a1fb91bb356e8083672044b851ffdb3e Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Fri, 25 Jul 2014 09:37:06 -0400 Subject: [PATCH] wayland-device: Upgrade to v4 of seat Get our keyboard repeat info from the server. --- gdk/wayland/gdkdevice-wayland.c | 51 ++++++++++++++++++++++++++------ gdk/wayland/gdkdisplay-wayland.c | 2 +- 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/gdk/wayland/gdkdevice-wayland.c b/gdk/wayland/gdkdevice-wayland.c index 96c5ebfe06..5e99e2e992 100644 --- a/gdk/wayland/gdkdevice-wayland.c +++ b/gdk/wayland/gdkdevice-wayland.c @@ -82,6 +82,9 @@ struct _GdkWaylandDeviceData uint32_t button_press_serial; GdkWindow *pointer_grab_window; uint32_t pointer_grab_time; + gboolean have_server_repeat; + uint32_t server_repeat_rate; + uint32_t server_repeat_delay; guint32 repeat_timer; guint32 repeat_key; guint32 repeat_count; @@ -1111,19 +1114,35 @@ get_key_repeat (GdkWaylandDeviceData *device, { gboolean repeat; - GSettings *keyboard_settings = get_keyboard_settings (device); - - if (keyboard_settings) + if (device->have_server_repeat) { - repeat = g_settings_get_boolean (keyboard_settings, "repeat"); - *delay = g_settings_get_uint (keyboard_settings, "delay"); - *interval = g_settings_get_uint (keyboard_settings, "repeat-interval"); + if (device->server_repeat_rate > 0) + { + repeat = TRUE; + *delay = device->server_repeat_delay; + *interval = (1000 / device->server_repeat_rate); + } + else + { + repeat = FALSE; + } } else { - repeat = TRUE; - *delay = 400; - *interval = 80; + GSettings *keyboard_settings = get_keyboard_settings (device); + + if (keyboard_settings) + { + repeat = g_settings_get_boolean (keyboard_settings, "repeat"); + *delay = g_settings_get_uint (keyboard_settings, "delay"); + *interval = g_settings_get_uint (keyboard_settings, "repeat-interval"); + } + else + { + repeat = TRUE; + *delay = 400; + *interval = 80; + } } return repeat; @@ -1270,6 +1289,19 @@ keyboard_handle_modifiers (void *data, g_signal_emit_by_name (keymap, "direction-changed"); } +static void +keyboard_handle_repeat_info (void *data, + struct wl_keyboard *keyboard, + uint32_t rate, + uint32_t delay) +{ + GdkWaylandDeviceData *device = data; + + device->have_server_repeat = TRUE; + device->server_repeat_rate = rate; + device->server_repeat_delay = delay; +} + static GdkWaylandTouchData * _device_manager_add_touch (GdkWaylandDeviceData *device, uint32_t id, @@ -1452,6 +1484,7 @@ static const struct wl_keyboard_listener keyboard_listener = { keyboard_handle_leave, keyboard_handle_key, keyboard_handle_modifiers, + keyboard_handle_repeat_info, }; static const struct wl_touch_listener touch_listener = { diff --git a/gdk/wayland/gdkdisplay-wayland.c b/gdk/wayland/gdkdisplay-wayland.c index e8c03e3415..1d62160f79 100644 --- a/gdk/wayland/gdkdisplay-wayland.c +++ b/gdk/wayland/gdkdisplay-wayland.c @@ -171,7 +171,7 @@ gdk_registry_handle_global(void *data, struct wl_registry *registry, uint32_t id wl_registry_bind(display_wayland->wl_registry, id, &wl_output_interface, MIN (version, 2)); _gdk_wayland_screen_add_output(display_wayland->screen, id, output, MIN (version, 2)); } else if (strcmp(interface, "wl_seat") == 0) { - seat = wl_registry_bind(display_wayland->wl_registry, id, &wl_seat_interface, 3); + seat = wl_registry_bind(display_wayland->wl_registry, id, &wl_seat_interface, 4); _gdk_wayland_device_manager_add_seat (gdk_display->device_manager, id, seat); } else if (strcmp(interface, "wl_data_device_manager") == 0) { display_wayland->data_device_manager =