diff -up gnome-settings-daemon-3.3.4/plugins/keyboard/gsd-keyboard-manager.c.jx gnome-settings-daemon-3.3.4/plugins/keyboard/gsd-keyboard-manager.c
--- gnome-settings-daemon-3.3.4/plugins/keyboard/gsd-keyboard-manager.c.jx	2012-01-12 06:27:18.000000000 -0500
+++ gnome-settings-daemon-3.3.4/plugins/keyboard/gsd-keyboard-manager.c	2012-01-23 12:49:36.124225333 -0500
@@ -143,18 +143,28 @@ 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;
+		int numlock_state = !! (num_mask & locked_mods);
+		int old_state = g_settings_get_enum (manager->priv->settings,
+						     KEY_NUMLOCK_STATE);
+
+		if (numlock_state != old_state)
+			g_settings_set_enum (manager->priv->settings,
+					     KEY_NUMLOCK_STATE,
+					     numlock_state);
+	}
+
         return GDK_FILTER_CONTINUE;
 }
 
