Merge lp:~3v1n0/unity-settings-daemon/kbd-brightness-update into lp:unity-settings-daemon

Proposed by Marco Trevisan (Treviño)
Status: Merged
Approved by: Sebastien Bacher
Approved revision: 4136
Merged at revision: 4137
Proposed branch: lp:~3v1n0/unity-settings-daemon/kbd-brightness-update
Merge into: lp:unity-settings-daemon
Prerequisite: lp:~3v1n0/unity-settings-daemon/keep-cached-kbd-backlight-updated
Diff against target: 207 lines (+45/-52)
1 file modified
plugins/power/gsd-power-manager.c (+45/-52)
To merge this branch: bzr merge lp:~3v1n0/unity-settings-daemon/kbd-brightness-update
Reviewer Review Type Date Requested Status
Sebastien Bacher Approve
Review via email: mp+295000@code.launchpad.net

Commit message

GsdPowerManager: don't cache kbd backlight current value

Keyboard backlight is now always fetched from UPower, without keeping
a cached value around.

This allows to properly Toggle and save/restore the backlight keyboard even
in hardwired configurations, where no ACPI events are emitted to request
a keyboard backlight change (and the bios handles the change silently).

Description of the change

This needs upower patched with the patch I've pushed at https://bugs.freedesktop.org/show_bug.cgi?id=95457

To post a comment you must log in.
4136. By Marco Trevisan (Treviño)

GsdPowerManager: always update current kbd brightness value before evaluating it

Revision history for this message
Sebastien Bacher (seb128) wrote :

what would happen if that landed/was used without the upower patch? if the patch is needed to avoid a regression we need to wait for upower to be uploaded and update the depends

review: Needs Fixing
Revision history for this message
Marco Trevisan (Treviño) (3v1n0) wrote :

> what would happen if that landed/was used without the upower patch? if the
> patch is needed to avoid a regression we need to wait for upower to be
> uploaded and update the depends

Simply nothing.

If the upower change doesn't land or is delayed, the fix just doesn't work since upower will always return the cached brightness value on upower_kbd_update_brightness call, then this patch is quite useless (but not dangerous) in that case.

So, there's not much need of bumping the required versions, although this could ensure the fix will land alltogether.
Just let me know what you prefer.

Revision history for this message
Sebastien Bacher (seb128) wrote :

if there is no regression no reason to enforce the patched upower version

review: Approve
4137. By Marco Trevisan (Treviño)

Merging with lp:~3v1n0/unity-settings-daemon/keep-cached-kbd-backlight-updated

4138. By Marco Trevisan (Treviño)

GsdPowerManager: don't cache kbd backlight current value

Keyboard backlight is now always fetched from UPower, without keeping
a cached value around.

This allows to properly Toggle and save/restore the backlight keyboard even
in hardwired configurations, where no ACPI events are emitted to request
a keyboard backlight change (and the bios handles the change silently).

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'plugins/power/gsd-power-manager.c'
2--- plugins/power/gsd-power-manager.c 2016-06-13 11:19:59 +0000
3+++ plugins/power/gsd-power-manager.c 2016-06-13 11:19:59 +0000
4@@ -192,7 +192,6 @@
5
6 /* Keyboard */
7 GDBusProxy *upower_kdb_proxy;
8- gint kbd_brightness_now;
9 gint kbd_brightness_max;
10 gint kbd_brightness_old;
11 gint kbd_brightness_pre_dim;
12@@ -1931,14 +1930,41 @@
13 }
14
15 static gboolean
16+upower_kbd_get_brightness (GsdPowerManager *manager)
17+{
18+ GVariant *k_now = NULL;
19+ GError *error = NULL;
20+ gint now;
21+
22+ k_now = g_dbus_proxy_call_sync (manager->priv->upower_kdb_proxy,
23+ "GetBrightness",
24+ NULL,
25+ G_DBUS_CALL_FLAGS_NONE,
26+ -1,
27+ NULL,
28+ &error);
29+ if (k_now == NULL) {
30+ if (error->domain != G_DBUS_ERROR ||
31+ error->code != G_DBUS_ERROR_UNKNOWN_METHOD) {
32+ g_warning ("Failed to get brightness: %s",
33+ error->message);
34+ }
35+
36+ g_error_free (error);
37+ return -1;
38+ }
39+
40+ g_variant_get (k_now, "(i)", &now);
41+ g_variant_unref (k_now);
42+
43+ return now;
44+}
45+
46+static gboolean
47 upower_kbd_set_brightness (GsdPowerManager *manager, guint value, GError **error)
48 {
49 GVariant *retval;
50
51- /* same as before */
52- if (manager->priv->kbd_brightness_now == value)
53- return TRUE;
54-
55 /* update h/w value */
56 retval = g_dbus_proxy_call_sync (manager->priv->upower_kdb_proxy,
57 "SetBrightness",
58@@ -1950,8 +1976,6 @@
59 if (retval == NULL)
60 return FALSE;
61
62- /* save new value */
63- manager->priv->kbd_brightness_now = value;
64 g_variant_unref (retval);
65 return TRUE;
66 }
67@@ -1976,7 +2000,7 @@
68 } else {
69 g_debug ("keyboard toggle on");
70 /* save the current value to restore later when untoggling */
71- manager->priv->kbd_brightness_old = manager->priv->kbd_brightness_now;
72+ manager->priv->kbd_brightness_old = upower_kbd_get_brightness (manager);
73 ret = upower_kbd_set_brightness (manager, 0, error);
74 if (!ret) {
75 /* failed, reset back to -1 */
76@@ -2063,7 +2087,7 @@
77 }
78
79 if (policy == GSD_POWER_ACTION_NOTHING) {
80- inhibit_lid_switch (manager);
81+ inhibit_lid_switch (manager);
82 manager->priv->inhibit_lid_switch_action = TRUE;
83 } else {
84 uninhibit_lid_switch (manager);
85@@ -2281,7 +2305,7 @@
86 if (manager->priv->upower_kdb_proxy == NULL)
87 return TRUE;
88
89- now = manager->priv->kbd_brightness_now;
90+ now = upower_kbd_get_brightness (manager);
91 max = manager->priv->kbd_brightness_max;
92 idle = PERCENTAGE_TO_ABS (0, max, idle_percentage);
93 if (idle > now) {
94@@ -2848,25 +2872,10 @@
95 }
96
97 static void
98-upower_kbd_signal_cb (GDBusProxy *proxy,
99- const gchar *sender_name,
100- const gchar *signal_name,
101- GVariant *parameters,
102- gpointer user_data)
103-{
104- GsdPowerManager *manager = GSD_POWER_MANAGER (user_data);
105-
106- if (g_strcmp0 (signal_name, "BrightnessChanged") == 0) {
107- g_variant_get (parameters, "(i)", &manager->priv->kbd_brightness_now);
108- }
109-}
110-
111-static void
112 power_keyboard_proxy_ready_cb (GObject *source_object,
113 GAsyncResult *res,
114 gpointer user_data)
115 {
116- GVariant *k_now = NULL;
117 GVariant *k_max = NULL;
118 GError *error = NULL;
119 GsdPowerManager *manager = GSD_POWER_MANAGER (user_data);
120@@ -2879,26 +2888,6 @@
121 goto out;
122 }
123
124- g_signal_connect (manager->priv->upower_kdb_proxy, "g-signal",
125- G_CALLBACK (upower_kbd_signal_cb), manager);
126-
127- k_now = g_dbus_proxy_call_sync (manager->priv->upower_kdb_proxy,
128- "GetBrightness",
129- NULL,
130- G_DBUS_CALL_FLAGS_NONE,
131- -1,
132- NULL,
133- &error);
134- if (k_now == NULL) {
135- if (error->domain != G_DBUS_ERROR ||
136- error->code != G_DBUS_ERROR_UNKNOWN_METHOD) {
137- g_warning ("Failed to get brightness: %s",
138- error->message);
139- }
140- g_error_free (error);
141- goto out;
142- }
143-
144 k_max = g_dbus_proxy_call_sync (manager->priv->upower_kdb_proxy,
145 "GetMaxBrightness",
146 NULL,
147@@ -2907,17 +2896,20 @@
148 NULL,
149 &error);
150 if (k_max == NULL) {
151- g_warning ("Failed to get max brightness: %s", error->message);
152+ if (error->domain != G_DBUS_ERROR ||
153+ error->code != G_DBUS_ERROR_UNKNOWN_METHOD) {
154+ g_warning ("Failed to get max brightness: %s",
155+ error->message);
156+ }
157 g_error_free (error);
158 goto out;
159 }
160
161- g_variant_get (k_now, "(i)", &manager->priv->kbd_brightness_now);
162 g_variant_get (k_max, "(i)", &manager->priv->kbd_brightness_max);
163
164 /* set brightness to max if not currently set so is something
165 * sensible */
166- if (manager->priv->kbd_brightness_now < 0) {
167+ if (upower_kbd_get_brightness (manager) < 0) {
168 gboolean ret;
169 ret = upower_kbd_set_brightness (manager,
170 manager->priv->kbd_brightness_max,
171@@ -2930,8 +2922,6 @@
172 }
173 }
174 out:
175- if (k_now != NULL)
176- g_variant_unref (k_now);
177 if (k_max != NULL)
178 g_variant_unref (k_max);
179 }
180@@ -3553,6 +3543,7 @@
181 GVariant *parameters,
182 GDBusMethodInvocation *invocation)
183 {
184+ gint now;
185 gint step;
186 gint value = -1;
187 gboolean ret;
188@@ -3561,15 +3552,17 @@
189
190 if (g_strcmp0 (method_name, "StepUp") == 0) {
191 g_debug ("keyboard step up");
192+ now = upower_kbd_get_brightness (manager);
193 step = BRIGHTNESS_STEP_AMOUNT (manager->priv->kbd_brightness_max);
194- value = MIN (manager->priv->kbd_brightness_now + step,
195+ value = MIN (now + step,
196 manager->priv->kbd_brightness_max);
197 ret = upower_kbd_set_brightness (manager, value, &error);
198
199 } else if (g_strcmp0 (method_name, "StepDown") == 0) {
200 g_debug ("keyboard step down");
201+ now = upower_kbd_get_brightness (manager);
202 step = BRIGHTNESS_STEP_AMOUNT (manager->priv->kbd_brightness_max);
203- value = MAX (manager->priv->kbd_brightness_now - step, 0);
204+ value = MAX (now - step, 0);
205 ret = upower_kbd_set_brightness (manager, value, &error);
206
207 } else if (g_strcmp0 (method_name, "Toggle") == 0) {

Subscribers

People subscribed via source and target branches