summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/gsd-enums.h7
-rw-r--r--data/org.gnome.settings-daemon.peripherals.gschema.xml.in.in38
-rw-r--r--plugins/keyboard/Makefile.am3
-rw-r--r--plugins/keyboard/gsd-keyboard-manager.c169
4 files changed, 117 insertions, 100 deletions
diff --git a/data/gsd-enums.h b/data/gsd-enums.h
index 80d235a4..d68a333e 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 c3970d97..f08a4c7d 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 47287927..827a179b 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 75300315..d9c5a5ca 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 */