[gnome-settings-daemon/gnome-3-4] keyboard: Prevent potential infinite loop



commit ff5b65349a9e377d17946ccb29b764f19c3bef7e
Author: Bastien Nocera <hadess hadess net>
Date:   Tue Nov 6 19:13:12 2012 +0100

    keyboard: Prevent potential infinite loop
    
    XKB would notify us in the same way if the lockedMods
    changed because of a programmatic, or a physical/human change.
    
    This causes us changing the Num-Lock state generating another
    event on top of the one we just processed, and might cause
    infinite loops and 100% CPU usage.
    
    Instead, we now only apply the settings:
    - on startup
    - when remember-num-lock is changed to true
    
    https://bugzilla.gnome.org/show_bug.cgi?id=679151
    
    Conflicts:
    	plugins/keyboard/gsd-keyboard-manager.c

 plugins/keyboard/gsd-keyboard-manager.c |   15 ++++++++++-----
 1 files changed, 10 insertions(+), 5 deletions(-)
---
diff --git a/plugins/keyboard/gsd-keyboard-manager.c b/plugins/keyboard/gsd-keyboard-manager.c
index a33460c..d387514 100644
--- a/plugins/keyboard/gsd-keyboard-manager.c
+++ b/plugins/keyboard/gsd-keyboard-manager.c
@@ -209,6 +209,9 @@ apply_settings (GSettings          *settings,
         GsdBellMode      bell_mode;
         gboolean         rnumlock;
 
+        if (g_strcmp0 (key, KEY_NUMLOCK_STATE) == 0)
+                return;
+
         repeat        = g_settings_get_boolean  (settings, KEY_REPEAT);
         click         = g_settings_get_boolean  (settings, KEY_CLICK);
         interval      = _gsd_settings_get_uint  (settings, KEY_INTERVAL);
@@ -220,8 +223,6 @@ apply_settings (GSettings          *settings,
         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;
@@ -251,10 +252,14 @@ apply_settings (GSettings          *settings,
                                 KBKeyClickPercent | KBBellPercent | KBBellPitch | KBBellDuration,
                                 &kbdcontrol);
 
-        manager->priv->old_state = g_settings_get_enum (manager->priv->settings, KEY_NUMLOCK_STATE);
+	if (g_strcmp0 (key, "remember-numlock-state") == 0 || key == NULL) {
+		rnumlock      = g_settings_get_boolean  (settings, "remember-numlock-state");
 
-        if (manager->priv->have_xkb && rnumlock)
-                numlock_set_xkb_state (manager->priv->old_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]