[gnome-settings-daemon] Port keyboard plugin to GSettings



commit 31a9b8c638d56149ff840aac7b594752c404fa3a
Author: Bastien Nocera <hadess hadess net>
Date:   Mon Oct 11 16:44:14 2010 +0100

    Port keyboard plugin to GSettings
    
    The per-hostname num-lock save is disabled for now, as GSettings
    doesn't like it when reading from a key that doesn't exist.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=631502

 data/gsd-enums.h                                   |    7 +
 ...e.settings-daemon.peripherals.gschema.xml.in.in |   38 +++++
 plugins/keyboard/Makefile.am                       |    3 +-
 plugins/keyboard/gsd-keyboard-manager.c            |  169 ++++++++------------
 4 files changed, 117 insertions(+), 100 deletions(-)
---
diff --git a/data/gsd-enums.h b/data/gsd-enums.h
index 80d235a..d68a333 100644
--- a/data/gsd-enums.h
+++ b/data/gsd-enums.h
@@ -61,4 +61,11 @@ typedef enum
   GSD_TOUCHPAD_SCROLL_METHOD_TWO_FINGER_SCROLLING
 } GsdTouchpadScrollMethod;
 
+typedef enum
+{
+  GSD_BELL_MODE_ON,
+  GSD_BELL_MODE_OFF,
+  GSD_BELL_MODE_CUSTOM
+} GsdBellMode;
+
 #endif /* __gsd_enums_h__ */
diff --git a/data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in b/data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in
index c3970d9..f08a4c7 100644
--- a/data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in
+++ b/data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in
@@ -2,6 +2,7 @@
   <schema gettext-domain="@GETTEXT_PACKAGE@" id="org.gnome.settings-daemon.peripherals" path="/apps/gnome-settings-daemon/peripherals/">
     <child name="smartcard" schema="org.gnome.settings-daemon.peripherals.smartcard"/>
     <child name="touchpad" schema="org.gnome.settings-daemon.peripherals.touchpad"/>
+    <child name="keyboard" schema="org.gnome.settings-daemon.peripherals.keyboard"/>
   </schema>
   <schema gettext-domain="@GETTEXT_PACKAGE@" id="org.gnome.settings-daemon.peripherals.smartcard" path="/apps/gnome-settings-daemon/peripherals/smartcard/">
     <key name="removal-action" enum="org.gnome.settings-daemon.GsdSmartcardRemovalAction">
@@ -37,4 +38,41 @@
       <_description>Set this to TRUE to enable all touchpads.</_description>
     </key>
   </schema>
+  <schema gettext-domain="@GETTEXT_PACKAGE@" id="org.gnome.settings-daemon.peripherals.keyboard" path="/apps/gnome-settings-daemon/peripherals/keyboard/">
+    <key name="repeat" type="b">
+      <default>true</default>
+    </key>
+    <key name="click" type="b">
+      <default>true</default>
+    </key>
+    <key name="rate" type="i">
+      <default>30</default>
+    </key>
+    <key name="delay" type="i">
+      <default>500</default>
+    </key>
+    <key name="click-volume" type="i">
+      <default>0</default>
+    </key>
+    <key name="bell-mode" enum="org.gnome.settings-daemon.GsdBellMode">
+      <default>'on'</default>
+      <description>Possible values are "on", "off", and "custom".</description>
+    </key>
+    <key name="bell-pitch" type="i">
+      <default>400</default>
+    </key>
+    <key name="bell-duration" type="i">
+      <default>100</default>
+    </key>
+    <key name="bell-custom-file" type="s">
+      <default>''</default>
+      <summary>Keyboard Bell Custom Filename</summary>
+      <description>File name of the bell sound to be played.</description>
+    </key>
+    <key name="remember-numlock-state" type="b">
+      <default>true</default>
+      <summary>Remember NumLock state</summary>
+      <description>When set to true, GNOME will remember the state of the NumLock LED between sessions.</description>
+    </key>
+  </schema>
 </schemalist>
diff --git a/plugins/keyboard/Makefile.am b/plugins/keyboard/Makefile.am
index 4728792..827a179 100644
--- a/plugins/keyboard/Makefile.am
+++ b/plugins/keyboard/Makefile.am
@@ -31,7 +31,8 @@ libkeyboard_la_SOURCES = 	\
 
 libkeyboard_la_CPPFLAGS = \
 	-I$(top_srcdir)/gnome-settings-daemon		\
-	-DDATADIR=\""$(pkgdatadir)"\"	\
+	-I$(top_srcdir)/data				\
+	-DDATADIR=\""$(pkgdatadir)"\"			\
 	-DGNOME_SETTINGS_LOCALEDIR=\""$(datadir)/locale"\" \
 	$(AM_CPPFLAGS)
 
diff --git a/plugins/keyboard/gsd-keyboard-manager.c b/plugins/keyboard/gsd-keyboard-manager.c
index 7530031..d9c5a5c 100644
--- a/plugins/keyboard/gsd-keyboard-manager.c
+++ b/plugins/keyboard/gsd-keyboard-manager.c
@@ -47,6 +47,7 @@
 
 #include "gnome-settings-profile.h"
 #include "gsd-keyboard-manager.h"
+#include "gsd-enums.h"
 
 #include "gsd-keyboard-xkb.h"
 #include "gsd-xmodmap.h"
@@ -57,24 +58,24 @@
 #  define HOST_NAME_MAX 255
 #endif
 
-#define GSD_KEYBOARD_KEY "/desktop/gnome/peripherals/keyboard"
+#define GSD_KEYBOARD_DIR "org.gnome.settings-daemon.peripherals.keyboard"
 
-#define KEY_REPEAT        GSD_KEYBOARD_KEY "/repeat"
-#define KEY_CLICK         GSD_KEYBOARD_KEY "/click"
-#define KEY_RATE          GSD_KEYBOARD_KEY "/rate"
-#define KEY_DELAY         GSD_KEYBOARD_KEY "/delay"
-#define KEY_CLICK_VOLUME  GSD_KEYBOARD_KEY "/click_volume"
+#define KEY_REPEAT         "repeat"
+#define KEY_CLICK          "click"
+#define KEY_RATE           "rate"
+#define KEY_DELAY          "delay"
+#define KEY_CLICK_VOLUME   "click-volume"
 
-#define KEY_BELL_VOLUME   GSD_KEYBOARD_KEY "/bell_volume"
-#define KEY_BELL_PITCH    GSD_KEYBOARD_KEY "/bell_pitch"
-#define KEY_BELL_DURATION GSD_KEYBOARD_KEY "/bell_duration"
-#define KEY_BELL_MODE     GSD_KEYBOARD_KEY "/bell_mode"
+#define KEY_BELL_VOLUME    "bell-volume"
+#define KEY_BELL_PITCH     "bell-pitch"
+#define KEY_BELL_DURATION  "bell-duration"
+#define KEY_BELL_MODE      "bell-mode"
 
 struct GsdKeyboardManagerPrivate
 {
-        gboolean have_xkb;
-        gint     xkb_event_base;
-        guint    notify;
+        GSettings *settings;
+        gboolean   have_xkb;
+        gint       xkb_event_base;
 };
 
 static void     gsd_keyboard_manager_class_init  (GsdKeyboardManagerClass *klass);
@@ -126,27 +127,31 @@ xkb_set_keyboard_autorepeat_rate (int delay, int rate)
 #endif
 
 static char *
-gsd_keyboard_get_hostname_key (const char *subkey)
+gsd_keyboard_get_hostname_key (void)
 {
-        char hostname[HOST_NAME_MAX + 1];
+        /* FIXME disabled for now, as we need GSettingsList support:
+         * https://bugzilla.gnome.org/show_bug.cgi?id=622126 */
+#if 0
+        const char *hostname;
+
+        hostname = g_get_host_name ();
 
-        if (gethostname (hostname, sizeof (hostname)) == 0 &&
-            strcmp (hostname, "localhost") != 0 &&
-            strcmp (hostname, "localhost.localdomain") != 0) {
+        if (g_str_equal (hostname, "localhost") == FALSE &&
+            g_str_equal (hostname, "localhost.localdomain") == FALSE) {
                 char *escaped;
                 char *key;
 
-                escaped = gconf_escape_key (hostname, -1);
-                key = g_strconcat (GSD_KEYBOARD_KEY
-                                   "/host-",
-                                   escaped,
-                                   "/0/",
-                                   subkey,
-                                   NULL);
+                /* FIXME, really escape? */
+                escaped = g_strdup (hostname);
+                key = g_strdup_printf ("host-%s-0-numlock-on", escaped);
                 g_free (escaped);
                 return key;
-        } else
+        } else {
+                g_message ("NumLock remembering disabled because hostname is set to \"localhost\"");
                 return NULL;
+        }
+#endif
+        return NULL;
 }
 
 #ifdef HAVE_X11_EXTENSIONS_XKB_H
@@ -203,40 +208,26 @@ numlock_set_xkb_state (NumLockState new_state)
         XkbLockModifiers (dpy, XkbUseCoreKbd, num_mask, new_state ? num_mask : 0);
 }
 
-static char *
-numlock_gconf_state_key (void)
-{
-        char *key = gsd_keyboard_get_hostname_key ("numlock_on");
-        if (!key) {
-                g_message ("NumLock remembering disabled because hostname is set to \"localhost\"");
-        }
-        return key;
-}
-
 static NumLockState
-numlock_get_gconf_state (GConfClient *client)
+numlock_get_gsettings_state (GSettings *settings)
 {
-        int          curr_state;
-        GError      *err = NULL;
-        char        *key = numlock_gconf_state_key ();
+        int   curr_state;
+        char *key;
 
-        if (!key) {
+        key = gsd_keyboard_get_hostname_key ();
+        if (!key)
                 return NUMLOCK_STATE_UNKNOWN;
-        }
 
-        curr_state = gconf_client_get_bool (client, key, &err);
-        if (err) {
-                curr_state = NUMLOCK_STATE_UNKNOWN;
-                g_error_free (err);
-        }
+        curr_state = g_settings_get_boolean (settings, key);
 
         g_free (key);
+
         return curr_state;
 }
 
 static void
-numlock_set_gconf_state (GConfClient *client,
-                         NumLockState new_state)
+numlock_set_gsettings_state (GSettings   *settings,
+                             NumLockState new_state)
 {
         char *key;
 
@@ -244,30 +235,29 @@ numlock_set_gconf_state (GConfClient *client,
                 return;
         }
 
-        key = numlock_gconf_state_key ();
+        key = gsd_keyboard_get_hostname_key ();
         if (key) {
-                gconf_client_set_bool (client, key, new_state, NULL);
+                g_settings_set_boolean (settings, key, new_state);
                 g_free (key);
         }
 }
 
 static GdkFilterReturn
 numlock_xkb_callback (GdkXEvent *xev_,
-                      GdkEvent *gdkev_,
-                      gpointer xkb_event_code)
+                      GdkEvent  *gdkev_,
+                      gpointer   user_data)
 {
         XEvent *xev = (XEvent *) xev_;
+        GsdKeyboardManager *manager = (GsdKeyboardManager *) user_data;
 
-        if (xev->type == GPOINTER_TO_INT (xkb_event_code)) {
+        if (xev->type == manager->priv->xkb_event_base) {
                 XkbEvent *xkbev = (XkbEvent *)xev;
                 if (xkbev->any.xkb_type == XkbStateNotify)
                 if (xkbev->state.changed & XkbModifierLockMask) {
                         unsigned num_mask = numlock_NumLock_modifier_mask ();
                         unsigned locked_mods = xkbev->state.locked_mods;
                         int numlock_state = !! (num_mask & locked_mods);
-                        GConfClient *client = gconf_client_get_default ();
-                        numlock_set_gconf_state (client, numlock_state);
-                        g_object_unref (client);
+                        numlock_set_gsettings_state (manager->priv->settings, numlock_state);
                 }
         }
         return GDK_FILTER_CONTINUE;
@@ -281,15 +271,14 @@ numlock_install_xkb_callback (GsdKeyboardManager *manager)
 
         gdk_window_add_filter (NULL,
                                numlock_xkb_callback,
-                               GINT_TO_POINTER (manager->priv->xkb_event_base));
+                               manager);
 }
 
 #endif /* HAVE_X11_EXTENSIONS_XKB_H */
 
 static void
-apply_settings (GConfClient        *client,
-                guint               cnxn_id,
-                GConfEntry         *entry,
+apply_settings (GSettings          *settings,
+                const char         *key,
                 GsdKeyboardManager *manager)
 {
         XKeyboardControl kbdcontrol;
@@ -301,28 +290,24 @@ apply_settings (GConfClient        *client,
         int              bell_volume;
         int              bell_pitch;
         int              bell_duration;
-        char            *volume_string;
+        GsdBellMode      bell_mode;
 #ifdef HAVE_X11_EXTENSIONS_XKB_H
         gboolean         rnumlock;
 #endif /* HAVE_X11_EXTENSIONS_XKB_H */
 
-        repeat        = gconf_client_get_bool  (client, KEY_REPEAT, NULL);
-        click         = gconf_client_get_bool  (client, KEY_CLICK, NULL);
-        rate          = gconf_client_get_int   (client, KEY_RATE, NULL);
-        delay         = gconf_client_get_int   (client, KEY_DELAY, NULL);
-        click_volume  = gconf_client_get_int   (client, KEY_CLICK_VOLUME, NULL);
-#if 0
-        bell_volume   = gconf_client_get_int   (client, KEY_BELL_VOLUME, NULL);
-#endif
-        bell_pitch    = gconf_client_get_int   (client, KEY_BELL_PITCH, NULL);
-        bell_duration = gconf_client_get_int   (client, KEY_BELL_DURATION, NULL);
+        repeat        = g_settings_get_boolean  (settings, KEY_REPEAT);
+        click         = g_settings_get_boolean  (settings, KEY_CLICK);
+        rate          = g_settings_get_int   (settings, KEY_RATE);
+        delay         = g_settings_get_int   (settings, KEY_DELAY);
+        click_volume  = g_settings_get_int   (settings, KEY_CLICK_VOLUME);
+        bell_pitch    = g_settings_get_int   (settings, KEY_BELL_PITCH);
+        bell_duration = g_settings_get_int   (settings, KEY_BELL_DURATION);
 
-        volume_string = gconf_client_get_string (client, KEY_BELL_MODE, NULL);
-        bell_volume   = (volume_string && !strcmp (volume_string, "on")) ? 50 : 0;
-        g_free (volume_string);
+        bell_mode = g_settings_get_enum (settings, KEY_BELL_MODE);
+        bell_volume   = (bell_mode == GSD_BELL_MODE_ON) ? 50 : 0;
 
 #ifdef HAVE_X11_EXTENSIONS_XKB_H
-        rnumlock      = gconf_client_get_bool  (client, GSD_KEYBOARD_KEY "/remember_numlock_state", NULL);
+        rnumlock      = g_settings_get_boolean  (settings, "remember-numlock-state");
 #endif /* HAVE_X11_EXTENSIONS_XKB_H */
 
         gdk_error_trap_push ();
@@ -361,7 +346,7 @@ apply_settings (GConfClient        *client,
 
 #ifdef HAVE_X11_EXTENSIONS_XKB_H
         if (manager->priv->have_xkb && rnumlock) {
-                numlock_set_xkb_state (numlock_get_gconf_state (client));
+                numlock_set_xkb_state (numlock_get_gsettings_state (manager->priv->settings));
         }
 #endif /* HAVE_X11_EXTENSIONS_XKB_H */
 
@@ -372,26 +357,18 @@ apply_settings (GConfClient        *client,
 void
 gsd_keyboard_manager_apply_settings (GsdKeyboardManager *manager)
 {
-        GConfClient *client;
-
-        client = gconf_client_get_default ();
-        apply_settings (client, 0, NULL, manager);
-        g_object_unref (client);
+        apply_settings (manager->priv->settings, NULL, manager);
 }
 
 static gboolean
 start_keyboard_idle_cb (GsdKeyboardManager *manager)
 {
-        GConfClient *client;
-
         gnome_settings_profile_start (NULL);
 
         g_debug ("Starting keyboard manager");
 
         manager->priv->have_xkb = 0;
-        client = gconf_client_get_default ();
-
-        gconf_client_add_dir (client, GSD_KEYBOARD_KEY, GCONF_CLIENT_PRELOAD_RECURSIVE, NULL);
+        manager->priv->settings = g_settings_new (GSD_KEYBOARD_DIR);
 
         /* Essential - xkb initialization should happen before */
         gsd_keyboard_xkb_set_post_activation_callback ((PostActivationCallback) gsd_load_modmap_files, NULL);
@@ -404,11 +381,8 @@ start_keyboard_idle_cb (GsdKeyboardManager *manager)
         /* apply current settings before we install the callback */
         gsd_keyboard_manager_apply_settings (manager);
 
-        manager->priv->notify = gconf_client_notify_add (client, GSD_KEYBOARD_KEY,
-                                                         (GConfClientNotifyFunc) apply_settings, manager,
-                                                         NULL, NULL);
-
-        g_object_unref (client);
+        g_signal_connect (G_OBJECT (manager->priv->settings), "changed",
+                          G_CALLBACK (apply_settings), manager);
 
 #ifdef HAVE_X11_EXTENSIONS_XKB_H
         numlock_install_xkb_callback (manager);
@@ -439,19 +413,16 @@ gsd_keyboard_manager_stop (GsdKeyboardManager *manager)
 
         g_debug ("Stopping keyboard manager");
 
-        if (p->notify != 0) {
-                GConfClient *client = gconf_client_get_default ();
-                gconf_client_remove_dir (client, GSD_KEYBOARD_KEY, NULL);
-                gconf_client_notify_remove (client, p->notify);
-                g_object_unref (client);
-                p->notify = 0;
+        if (p->settings != NULL) {
+                g_object_unref (p->settings);
+                p->settings = NULL;
         }
 
 #if HAVE_X11_EXTENSIONS_XKB_H
         if (p->have_xkb) {
                 gdk_window_remove_filter (NULL,
                                           numlock_xkb_callback,
-                                          GINT_TO_POINTER (p->xkb_event_base));
+                                          manager);
         }
 #endif /* HAVE_X11_EXTENSIONS_XKB_H */
 



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