[gnome-settings-daemon] keyboard: Don't save num-lock when caps-lock changes



commit 89b476ec6196aaad5c65804c8ceade3a92d33e29
Author: Bastien Nocera <hadess hadess net>
Date:   Mon Jan 23 18:56:07 2012 +0000

    keyboard: Don't save num-lock when caps-lock changes
    
    The code would write the num-lock state even if it didn't change.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=668525

 plugins/keyboard/gsd-keyboard-manager.c |   40 +++++++++++++++++++++----------
 1 files changed, 27 insertions(+), 13 deletions(-)
---
diff --git a/plugins/keyboard/gsd-keyboard-manager.c b/plugins/keyboard/gsd-keyboard-manager.c
index f4a7dad..b9cc406 100644
--- a/plugins/keyboard/gsd-keyboard-manager.c
+++ b/plugins/keyboard/gsd-keyboard-manager.c
@@ -72,6 +72,7 @@ struct GsdKeyboardManagerPrivate
         GSettings *settings;
         gboolean   have_xkb;
         gint       xkb_event_base;
+        GsdNumLockState old_state;
 };
 
 static void     gsd_keyboard_manager_class_init  (GsdKeyboardManagerClass *klass);
@@ -143,18 +144,30 @@ numlock_xkb_callback (GdkXEvent *xev_,
                       gpointer   user_data)
 {
         XEvent *xev = (XEvent *) xev_;
+	XkbEvent *xkbev = (XkbEvent *) xev;
         GsdKeyboardManager *manager = (GsdKeyboardManager *) user_data;
 
-        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);
-                        g_settings_set_enum (manager->priv->settings, KEY_NUMLOCK_STATE, numlock_state);
-                }
-        }
+        if (xev->type != manager->priv->xkb_event_base)
+		return GDK_FILTER_CONTINUE;
+
+	if (xkbev->any.xkb_type != XkbStateNotify)
+		return GDK_FILTER_CONTINUE;
+
+	if (xkbev->state.changed & XkbModifierLockMask) {
+		unsigned num_mask = numlock_NumLock_modifier_mask ();
+		unsigned locked_mods = xkbev->state.locked_mods;
+		GsdNumLockState numlock_state;
+
+		numlock_state = (num_mask & locked_mods) ? GSD_NUM_LOCK_STATE_ON : GSD_NUM_LOCK_STATE_OFF;
+
+		if (numlock_state != manager->priv->old_state) {
+			g_settings_set_enum (manager->priv->settings,
+					     KEY_NUMLOCK_STATE,
+					     numlock_state);
+			manager->priv->old_state = numlock_state;
+		}
+	}
+
         return GDK_FILTER_CONTINUE;
 }
 
@@ -238,9 +251,10 @@ apply_settings (GSettings          *settings,
                                 KBKeyClickPercent | KBBellPercent | KBBellPitch | KBBellDuration,
                                 &kbdcontrol);
 
-        if (manager->priv->have_xkb && rnumlock) {
-                numlock_set_xkb_state (g_settings_get_enum (manager->priv->settings, KEY_NUMLOCK_STATE));
-        }
+        manager->priv->old_state = g_settings_get_enum (manager->priv->settings, KEY_NUMLOCK_STATE);
+
+        if (manager->priv->have_xkb && rnumlock)
+                numlock_set_xkb_state (manager->priv->old_state);
 
         XSync (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), FALSE);
         gdk_error_trap_pop_ignored ();



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