sna: Preserve the user backlight value for get_property calls

When querying the current backlight value, be sure not to overwrite the
last user set value by the call to RRChangeOutputProperty.
RRChangeOutputProperty calls into set_backlight_property, tricking us
into believing that the user has set a new backlight value. The result
is that we end up believing that the user chooses a 0 backlight if she
should happen to query the property whilst the output is disabled.

Reported-by: reztho@archlinux.us
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=70406
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2013-10-15 11:23:19 +01:00
parent 0345cbec97
commit 41b6b792d8
1 changed files with 11 additions and 1 deletions

View File

@ -2455,18 +2455,28 @@ sna_output_get_property(xf86OutputPtr output, Atom property)
int err;
if (property == backlight_atom || property == backlight_deprecated_atom) {
int old_backlight;
INT32 val;
if (! sna_output->backlight_iface)
if (!sna_output->backlight_iface)
return FALSE;
val = sna_output_backlight_get(output);
if (val < 0)
return FALSE;
/* Preserve our value of the current user backlight level so that we
* avoid mixing in automatic resetting of the backlight across DPMS
* events. The property query should ideally always be idempotent.
*/
old_backlight = sna_output->backlight_active_level;
err = RRChangeOutputProperty(output->randr_output, property,
XA_INTEGER, 32, PropModeReplace, 1, &val,
FALSE, TRUE);
sna_output->backlight_active_level = old_backlight;
if (err != 0) {
xf86DrvMsg(output->scrn->scrnIndex, X_ERROR,
"RRChangeOutputProperty error, %d\n", err);