From 166392f8a1e8f892e655698b449677f6f2f4e831 Mon Sep 17 00:00:00 2001 From: Jian-Hong Pan Date: Sat, 5 May 2018 16:12:54 +0800 Subject: [PATCH] gsd: Fix keyboard backlight toggle state machines Some laptops like ASUS UX550GE has a hotkey (Fn+F7) for keyboard backlight toggle. In this UX550GE, the hotkey not only switches on/off the keyboard backlight, but also increments the level of brightness from 1 to max 3. In this case, it will trigger the keyboard backlight StepUp and Toggle events and execute the handle_method_call_keyboard function of gsd_power_manager.c in GNOME settings daemon when the hotkey is pressed. The ideal scenario of pressing hotkey should trigger the events like: .. StepUp -> Toggle -> StepUp -> StepUp -> StepUp -> Toggle -> StepUp .. However, we noticed the actual processes are: .. StepUp -> Toggle -> Toggle -> StepUp -> StepUp -> StepUp -> Toggle .. It triggers Toggle event two times between StepUp events. We check the upower_kbd_toggle function called in handle_method_call_keyboard when the event is Toggle, and find out it checks only the state of old brightness without current brightness. That misses some other states changing. So, here is the list of the Toggle Method's state machines: 1. brightness_now: 0, brightness_old: 1 ~ max level of brightness -> toggle to old brightness 2. brightness_now: 0, brightness_old: -1 or 0 -> toggle to max brightness 3. brightness_now: 1 ~ max level of brightness, brightness_old: all -> toggle to 0 brightness This commit fixes and implements the state machines. Closes #41 Signed-off-by: Jian-Hong Pan --- plugins/power/gsd-power-manager.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/plugins/power/gsd-power-manager.c b/plugins/power/gsd-power-manager.c index 67d475cff..b68169e2f 100644 --- a/plugins/power/gsd-power-manager.c +++ b/plugins/power/gsd-power-manager.c @@ -1197,6 +1197,8 @@ upower_kbd_set_brightness (GsdPowerManager *manager, guint value, GError **error if (retval == NULL) return FALSE; + /* save old brightness */ + manager->priv->kbd_brightness_old = manager->priv->kbd_brightness_now; /* save new value */ manager->priv->kbd_brightness_now = value; g_variant_unref (retval); @@ -1210,20 +1212,27 @@ upower_kbd_toggle (GsdPowerManager *manager, gboolean ret; int value = -1; - if (manager->priv->kbd_brightness_old >= 0) { - g_debug ("keyboard toggle off"); + if (manager->priv->kbd_brightness_now == 0 && + manager->priv->kbd_brightness_old > 0) { + g_debug ("keyboard toggle off to old brightness"); ret = upower_kbd_set_brightness (manager, manager->priv->kbd_brightness_old, error); - if (ret) { - /* succeeded, set to -1 since now no old value */ + if (ret) + value = 0; + } else if (manager->priv->kbd_brightness_now == 0) { + g_debug ("keyboard toggle off to max brightness"); + ret = upower_kbd_set_brightness (manager, + manager->priv->kbd_brightness_max, + error); + if (!ret) { + /* failed, reset back to -1 */ manager->priv->kbd_brightness_old = -1; + } else { value = 0; } - } else { - g_debug ("keyboard toggle on"); - /* save the current value to restore later when untoggling */ - manager->priv->kbd_brightness_old = manager->priv->kbd_brightness_now; + } else { + g_debug ("keyboard toggle on to off"); ret = upower_kbd_set_brightness (manager, 0, error); if (!ret) { /* failed, reset back to -1 */ @@ -1635,7 +1644,7 @@ idle_set_mode (GsdPowerManager *manager, GsdPowerIdleMode mode) /* only toggle keyboard if present and not already toggled */ if (manager->priv->upower_kbd_proxy && - manager->priv->kbd_brightness_old == -1) { + manager->priv->kbd_brightness_now > 0) { if (upower_kbd_toggle (manager, &error) < 0) { g_warning ("failed to turn the kbd backlight off: %s", error->message); @@ -1677,7 +1686,7 @@ idle_set_mode (GsdPowerManager *manager, GsdPowerIdleMode mode) /* only toggle keyboard if present and already toggled off */ if (manager->priv->upower_kbd_proxy && - manager->priv->kbd_brightness_old != -1) { + manager->priv->kbd_brightness_now == 0) { if (upower_kbd_toggle (manager, &error) < 0) { g_warning ("failed to turn the kbd backlight on: %s", error->message); -- GitLab