[gnome-settings-daemon/gnome-3-4] keyboard: Prevent potential infinite loop
- From: Bastien Nocera <hadess src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-settings-daemon/gnome-3-4] keyboard: Prevent potential infinite loop
- Date: Wed, 7 Nov 2012 09:07:57 +0000 (UTC)
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]