Keyboard backlight level toggles to wrong state
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, it 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.
Here are the added debug messages to check the procedure.
--- plugins/power/gsd-power-manager.c 2018-03-01 03:00:25.000000000 +0800
+++ ../gsd-power-manager.c.debug 2018-04-23 13:23:30.227428568 +0800
@@ -1177,6 +1177,8 @@
if (manager->priv->kbd_brightness_old >= 0) {
g_debug ("keyboard toggle off");
+ g_warning("%s: keyboard toggle off kbd_brightness_old: %d, kbd_brightness_now: %d\n",
+ __func__, manager->priv->kbd_brightness_old, manager->priv->kbd_brightness_now);
ret = upower_kbd_set_brightness (manager,
manager->priv->kbd_brightness_old,
error);
@@ -1187,6 +1189,8 @@
}
} else {
g_debug ("keyboard toggle on");
+ g_warning("%s: keyboard toggle on kbd_brightness_old: %d, kbd_brightness_now: %d\n",
+ __func__, manager->priv->kbd_brightness_old, manager->priv->kbd_brightness_now);
/* save the current value to restore later when untoggling */
manager->priv->kbd_brightness_old = manager->priv->kbd_brightness_now;
ret = upower_kbd_set_brightness (manager, 0, error);
@@ -1387,6 +1391,7 @@
if (manager->priv->connection == NULL)
return;
+ g_warning("%s, set properties\n", __func__);
params = g_variant_new_parsed ("(%s, [{'Brightness', <%i>}], @as [])", interface_name,
value);
g_dbus_connection_emit_signal (manager->priv->connection,
@@ -1399,6 +1404,7 @@
if (!source)
return;
+ g_warning("%s: %s value: %d\n", __func__, GSD_POWER_DBUS_INTERFACE_KEYBOARD, value);
g_dbus_connection_emit_signal (manager->priv->connection,
NULL,
GSD_POWER_DBUS_PATH,
@@ -2829,21 +2835,29 @@
guint percentage;
GError *error = NULL;
+ g_warning("%s: method_name: %s, kbd_max_brightness:%d\n",
+ __func__, method_name, manager->priv->kbd_brightness_max);
if (g_strcmp0 (method_name, "StepUp") == 0) {
g_debug ("keyboard step up");
step = BRIGHTNESS_STEP_AMOUNT (manager->priv->kbd_brightness_max);
value = MIN (manager->priv->kbd_brightness_now + step,
manager->priv->kbd_brightness_max);
+ g_warning("\tkbd_brightness now: %d, new value: %d\n",
+ manager->priv->kbd_brightness_now, value);
ret = upower_kbd_set_brightness (manager, value, &error);
} else if (g_strcmp0 (method_name, "StepDown") == 0) {
g_debug ("keyboard step down");
step = BRIGHTNESS_STEP_AMOUNT (manager->priv->kbd_brightness_max);
value = MAX (manager->priv->kbd_brightness_now - step, 0);
+ g_warning("\tkbd_brightness now: %d, new value: %d\n",
+ manager->priv->kbd_brightness_now, value);
ret = upower_kbd_set_brightness (manager, value, &error);
} else if (g_strcmp0 (method_name, "Toggle") == 0) {
value = upower_kbd_toggle (manager, &error);
+ g_warning("\tkbd_brightness now: %d, new value: %d\n",
+ manager->priv->kbd_brightness_now, value);
ret = (value >= 0);
} else {
After rebuild and reboot, press the keyboard back light setting keys and investigate journal.
Apr 23 11:40:02 endless gsd-power[1586]: handle_method_call_keyboard: method_name: StepUp, kbd_max_brightness:3
Apr 23 11:40:02 endless gsd-power[1586]: kbd_brightness now: 2, new value: 3
Apr 23 11:40:02 endless gsd-power[1586]: backlight_iface_emit_changed, set properties
Apr 23 11:40:02 endless gsd-power[1586]: backlight_iface_emit_changed: org.gnome.SettingsDaemon.Power.Keyboard value: 100
Apr 23 11:40:02 endless gsd-power[1586]: handle_method_call_keyboard: method_name: Toggle, kbd_max_brightness:3
Apr 23 11:40:02 endless gsd-power[1586]: upower_kbd_toggle: keyboard toggle off kbd_brightness_old: 3, kbd_brightness_now: 3
Apr 23 11:40:02 endless gsd-power[1586]: kbd_brightness now: 3, new value: 0
Apr 23 11:40:02 endless gsd-power[1586]: backlight_iface_emit_changed, set properties
Apr 23 11:40:02 endless gsd-power[1586]: backlight_iface_emit_changed: org.gnome.SettingsDaemon.Power.Keyboard value: 0
Apr 23 11:40:03 endless gsd-power[1586]: handle_method_call_keyboard: method_name: Toggle, kbd_max_brightness:3
Apr 23 11:40:03 endless gsd-power[1586]: upower_kbd_toggle: keyboard toggle on kbd_brightness_old: -1, kbd_brightness_now: 3
Apr 23 11:40:03 endless gsd-power[1586]: kbd_brightness now: 0, new value: 0
Apr 23 11:40:03 endless gsd-power[1586]: backlight_iface_emit_changed, set properties
Apr 23 11:40:03 endless gsd-power[1586]: backlight_iface_emit_changed: org.gnome.SettingsDaemon.Power.Keyboard value: 0
Apr 23 11:40:04 endless gsd-power[1586]: handle_method_call_keyboard: method_name: StepUp, kbd_max_brightness:3
Apr 23 11:40:04 endless gsd-power[1586]: kbd_brightness now: 0, new value: 1
Apr 23 11:40:04 endless gsd-power[1586]: backlight_iface_emit_changed, set properties
Apr 23 11:40:04 endless gsd-power[1586]: backlight_iface_emit_changed: org.gnome.SettingsDaemon.Power.Keyboard value: 33
Apr 23 11:40:05 endless gsd-power[1586]: handle_method_call_keyboard: method_name: StepUp, kbd_max_brightness:3
Apr 23 11:40:05 endless gsd-power[1586]: kbd_brightness now: 1, new value: 2
Apr 23 11:40:05 endless gsd-power[1586]: backlight_iface_emit_changed, set properties
Apr 23 11:40:05 endless gsd-power[1586]: backlight_iface_emit_changed: org.gnome.SettingsDaemon.Power.Keyboard value: 66
Apr 23 11:40:05 endless gsd-power[1586]: handle_method_call_keyboard: method_name: StepUp, kbd_max_brightness:3
Apr 23 11:40:05 endless gsd-power[1586]: kbd_brightness now: 2, new value: 3
Apr 23 11:40:05 endless gsd-power[1586]: backlight_iface_emit_changed, set properties
Apr 23 11:40:05 endless gsd-power[1586]: backlight_iface_emit_changed: org.gnome.SettingsDaemon.Power.Keyboard value: 100