[gnome-settings-daemon] keyboard: Split up keyboard settings application



commit b3f95aa6f25edeff5b73c5b9ee14e6e688798863
Author: Bastien Nocera <hadess hadess net>
Date:   Mon Sep 17 12:22:54 2012 +0100

    keyboard: Split up keyboard settings application
    
    To avoid changing unrelated keyboard settings on hotplug or
    when changing a single value, split up the settings applications.
    
    This might help with Num-Lock settings CPU loop.
    
    See https://bugzilla.gnome.org/show_bug.cgi?id=679151

 plugins/keyboard/gsd-keyboard-manager.c |  140 ++++++++++++++++++++++++-------
 1 files changed, 109 insertions(+), 31 deletions(-)
---
diff --git a/plugins/keyboard/gsd-keyboard-manager.c b/plugins/keyboard/gsd-keyboard-manager.c
index eaf375b..c433b9b 100644
--- a/plugins/keyboard/gsd-keyboard-manager.c
+++ b/plugins/keyboard/gsd-keyboard-manager.c
@@ -63,6 +63,7 @@
 #define KEY_INTERVAL       "repeat-interval"
 #define KEY_DELAY          "delay"
 #define KEY_CLICK_VOLUME   "click-volume"
+#define KEY_REMEMBER_NUMLOCK_STATE "remember-numlock-state"
 #define KEY_NUMLOCK_STATE  "numlock-state"
 
 #define KEY_BELL_VOLUME    "bell-volume"
@@ -473,6 +474,21 @@ numlock_set_xkb_state (GsdNumLockState new_state)
         XkbLockModifiers (dpy, XkbUseCoreKbd, num_mask, new_state == GSD_NUM_LOCK_STATE_ON ? num_mask : 0);
 }
 
+static const char *
+num_lock_state_to_string (GsdNumLockState numlock_state)
+{
+	switch (numlock_state) {
+	case GSD_NUM_LOCK_STATE_UNKNOWN:
+		return "GSD_NUM_LOCK_STATE_UNKNOWN";
+	case GSD_NUM_LOCK_STATE_ON:
+		return "GSD_NUM_LOCK_STATE_ON";
+	case GSD_NUM_LOCK_STATE_OFF:
+		return "GSD_NUM_LOCK_STATE_OFF";
+	default:
+		return "UNKNOWN";
+	}
+}
+
 static GdkFilterReturn
 xkb_events_filter (GdkXEvent *xev_,
 		   GdkEvent  *gdkev_,
@@ -494,6 +510,9 @@ xkb_events_filter (GdkXEvent *xev_,
 		numlock_state = (num_mask & locked_mods) ? GSD_NUM_LOCK_STATE_ON : GSD_NUM_LOCK_STATE_OFF;
 
 		if (numlock_state != manager->priv->old_state) {
+			g_debug ("New num-lock state '%s' != Old num-lock state '%s'",
+				 num_lock_state_to_string (numlock_state),
+				 num_lock_state_to_string (manager->priv->old_state));
 			g_settings_set_enum (manager->priv->settings,
 					     KEY_NUMLOCK_STATE,
 					     numlock_state);
@@ -878,50 +897,27 @@ apply_input_sources_settings (GSettings          *settings,
 }
 
 static void
-apply_settings (GSettings          *settings,
-                const char         *key,
-                GsdKeyboardManager *manager)
+apply_bell (GsdKeyboardManager *manager)
 {
+	GSettings       *settings;
         XKeyboardControl kbdcontrol;
-        gboolean         repeat;
         gboolean         click;
-        guint            interval;
-        guint            delay;
-        int              click_volume;
         int              bell_volume;
         int              bell_pitch;
         int              bell_duration;
         GsdBellMode      bell_mode;
-        gboolean         rnumlock;
+        int              click_volume;
 
-        repeat        = g_settings_get_boolean  (settings, KEY_REPEAT);
+	settings      = manager->priv->settings;
         click         = g_settings_get_boolean  (settings, KEY_CLICK);
-        interval      = g_settings_get_uint  (settings, KEY_INTERVAL);
-        delay         = g_settings_get_uint  (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);
 
         bell_mode = g_settings_get_enum (settings, KEY_BELL_MODE);
         bell_volume   = (bell_mode == GSD_BELL_MODE_ON) ? 50 : 0;
 
-        rnumlock      = g_settings_get_boolean  (settings, "remember-numlock-state");
-
-        gdk_error_trap_push ();
-        if (repeat) {
-                gboolean rate_set = FALSE;
-
-                XAutoRepeatOn (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
-                /* Use XKB in preference */
-                rate_set = xkb_set_keyboard_autorepeat_rate (delay, interval);
-
-                if (!rate_set)
-                        g_warning ("Neither XKeyboard not Xfree86's keyboard extensions are available,\n"
-                                   "no way to support keyboard autorepeat rate settings");
-        } else {
-                XAutoRepeatOff (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
-        }
-
         /* as percentage from 0..100 inclusive */
         if (click_volume < 0) {
                 click_volume = 0;
@@ -932,12 +928,27 @@ apply_settings (GSettings          *settings,
         kbdcontrol.bell_percent = bell_volume;
         kbdcontrol.bell_pitch = bell_pitch;
         kbdcontrol.bell_duration = bell_duration;
+
+        gdk_error_trap_push ();
         XChangeKeyboardControl (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
                                 KBKeyClickPercent | KBBellPercent | KBBellPitch | KBBellDuration,
                                 &kbdcontrol);
 
+        XSync (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), FALSE);
+        gdk_error_trap_pop_ignored ();
+}
+
+static void
+apply_numlock (GsdKeyboardManager *manager)
+{
+	GSettings *settings;
+        gboolean rnumlock;
+
+	settings      = manager->priv->settings;
+        rnumlock = g_settings_get_boolean  (settings, KEY_REMEMBER_NUMLOCK_STATE);
         manager->priv->old_state = g_settings_get_enum (manager->priv->settings, KEY_NUMLOCK_STATE);
 
+        gdk_error_trap_push ();
         if (rnumlock)
                 numlock_set_xkb_state (manager->priv->old_state);
 
@@ -946,6 +957,73 @@ apply_settings (GSettings          *settings,
 }
 
 static void
+apply_repeat (GsdKeyboardManager *manager)
+{
+	GSettings       *settings;
+        gboolean         repeat;
+        guint            interval;
+        guint            delay;
+
+	settings      = manager->priv->settings;
+        repeat        = g_settings_get_boolean  (settings, KEY_REPEAT);
+        interval      = g_settings_get_uint  (settings, KEY_INTERVAL);
+        delay         = g_settings_get_uint  (settings, KEY_DELAY);
+
+        gdk_error_trap_push ();
+        if (repeat) {
+                gboolean rate_set = FALSE;
+
+                XAutoRepeatOn (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
+                /* Use XKB in preference */
+                rate_set = xkb_set_keyboard_autorepeat_rate (delay, interval);
+
+                if (!rate_set)
+                        g_warning ("Neither XKeyboard not Xfree86's keyboard extensions are available,\n"
+                                   "no way to support keyboard autorepeat rate settings");
+        } else {
+                XAutoRepeatOff (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
+        }
+
+        XSync (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), FALSE);
+        gdk_error_trap_pop_ignored ();
+}
+
+static void
+apply_all_settings (GsdKeyboardManager *manager)
+{
+	apply_repeat (manager);
+	apply_bell (manager);
+	apply_numlock (manager);
+}
+
+static void
+settings_changed (GSettings          *settings,
+                  const char         *key,
+                  GsdKeyboardManager *manager)
+{
+	if (g_strcmp0 (key, KEY_CLICK) == 0||
+	    g_strcmp0 (key, KEY_CLICK_VOLUME) == 0 ||
+	    g_strcmp0 (key, KEY_BELL_PITCH) == 0 ||
+	    g_strcmp0 (key, KEY_BELL_DURATION) == 0 ||
+	    g_strcmp0 (key, KEY_BELL_MODE) == 0) {
+		g_debug ("Bell setting '%s' changed, applying bell settings", key);
+		apply_bell (manager);
+	} else if (g_strcmp0 (key, KEY_REMEMBER_NUMLOCK_STATE) == 0 ||
+		 g_strcmp0 (key, KEY_NUMLOCK_STATE) == 0) {
+		g_debug ("Num-Lock state '%s' changed, applying num-lock state settings", key);
+		apply_numlock (manager);
+	} else if (g_strcmp0 (key, KEY_REPEAT) == 0 ||
+		 g_strcmp0 (key, KEY_INTERVAL) == 0 ||
+		 g_strcmp0 (key, KEY_DELAY) == 0) {
+		g_debug ("Key repeat setting '%s' changed, applying key repeat settings", key);
+		apply_repeat (manager);
+	} else {
+		g_warning ("Unhandled settings change, key '%s'", key);
+	}
+
+}
+
+static void
 device_added_cb (GdkDeviceManager   *device_manager,
                  GdkDevice          *device,
                  GsdKeyboardManager *manager)
@@ -954,7 +1032,7 @@ device_added_cb (GdkDeviceManager   *device_manager,
 
         source = gdk_device_get_source (device);
         if (source == GDK_SOURCE_KEYBOARD) {
-                apply_settings (manager->priv->settings, NULL, manager);
+                apply_all_settings (manager);
                 apply_input_sources_settings (manager->priv->input_sources_settings, NULL, 0, manager);
                 run_custom_command (device, COMMAND_DEVICE_ADDED);
         }
@@ -1017,10 +1095,10 @@ start_keyboard_idle_cb (GsdKeyboardManager *manager)
         apply_input_sources_settings (manager->priv->input_sources_settings, NULL, 0, manager);
 #endif
         /* apply current settings before we install the callback */
-        apply_settings (manager->priv->settings, NULL, manager);
+        apply_all_settings (manager);
 
         g_signal_connect (G_OBJECT (manager->priv->settings), "changed",
-                          G_CALLBACK (apply_settings), manager);
+                          G_CALLBACK (settings_changed), manager);
         g_signal_connect (G_OBJECT (manager->priv->input_sources_settings), "change-event",
                           G_CALLBACK (apply_input_sources_settings), manager);
 



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