[mutter] backend-native: Handle keyboard repeat settings



commit fa58752276dd1400089cf6345b1a0c008b2962dc
Author: Rui Matos <tiagomatos gmail com>
Date:   Fri Sep 19 17:25:22 2014 +0200

    backend-native: Handle keyboard repeat settings
    
    We need to tell clutter's evdev backend about the desktop's key repeat
    settings so that our own key bindings event processing and
    gnome-shell's chrome widgets get their fake key events for continuous
    key press as they expect.
    
    Note that the wayland frontend filters out these events and thus
    wayland clients do not see them as specced.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=728055

 src/backends/native/meta-backend-native.c |   47 +++++++++++++++++++++++++++++
 1 files changed, 47 insertions(+), 0 deletions(-)
---
diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c
index 6e2741b..269695f 100644
--- a/src/backends/native/meta-backend-native.c
+++ b/src/backends/native/meta-backend-native.c
@@ -36,11 +36,24 @@
 struct _MetaBackendNativePrivate
 {
   MetaLauncher *launcher;
+
+  GSettings *keyboard_settings;
 };
 typedef struct _MetaBackendNativePrivate MetaBackendNativePrivate;
 
 G_DEFINE_TYPE_WITH_PRIVATE (MetaBackendNative, meta_backend_native, META_TYPE_BACKEND);
 
+static void
+meta_backend_native_finalize (GObject *object)
+{
+  MetaBackendNative *native = META_BACKEND_NATIVE (object);
+  MetaBackendNativePrivate *priv = meta_backend_native_get_instance_private (native);
+
+  g_clear_object (&priv->keyboard_settings);
+
+  G_OBJECT_CLASS (meta_backend_native_parent_class)->finalize (object);
+}
+
 /*
  * The pointer constrain code is mostly a rip-off of the XRandR code from Xorg.
  * (from xserver/randr/rrcrtc.c, RRConstrainCursorHarder)
@@ -143,14 +156,45 @@ pointer_constrain_callback (ClutterInputDevice *device,
 }
 
 static void
+set_keyboard_repeat (MetaBackendNative *native)
+{
+  MetaBackendNativePrivate *priv = meta_backend_native_get_instance_private (native);
+  ClutterDeviceManager *manager = clutter_device_manager_get_default ();
+  gboolean repeat;
+  unsigned int delay, interval;
+
+  repeat = g_settings_get_boolean (priv->keyboard_settings, "repeat");
+  delay = g_settings_get_uint (priv->keyboard_settings, "delay");
+  interval = g_settings_get_uint (priv->keyboard_settings, "repeat-interval");
+
+  clutter_evdev_set_keyboard_repeat (manager, repeat, delay, interval);
+}
+
+static void
+keyboard_settings_changed (GSettings           *settings,
+                           const char          *key,
+                           gpointer             data)
+{
+  MetaBackendNative *native = data;
+  set_keyboard_repeat (native);
+}
+
+static void
 meta_backend_native_post_init (MetaBackend *backend)
 {
+  MetaBackendNative *native = META_BACKEND_NATIVE (backend);
+  MetaBackendNativePrivate *priv = meta_backend_native_get_instance_private (native);
   ClutterDeviceManager *manager = clutter_device_manager_get_default ();
 
   META_BACKEND_CLASS (meta_backend_native_parent_class)->post_init (backend);
 
   clutter_evdev_set_pointer_constrain_callback (manager, pointer_constrain_callback,
                                                 NULL, NULL);
+
+  priv->keyboard_settings = g_settings_new ("org.gnome.settings-daemon.peripherals.keyboard");
+  g_signal_connect (priv->keyboard_settings, "changed",
+                    G_CALLBACK (keyboard_settings_changed), native);
+  set_keyboard_repeat (native);
 }
 
 static MetaIdleMonitor *
@@ -236,6 +280,9 @@ static void
 meta_backend_native_class_init (MetaBackendNativeClass *klass)
 {
   MetaBackendClass *backend_class = META_BACKEND_CLASS (klass);
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->finalize = meta_backend_native_finalize;
 
   backend_class->post_init = meta_backend_native_post_init;
   backend_class->create_idle_monitor = meta_backend_native_create_idle_monitor;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]