diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2013-10-15 11:23:19 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2013-10-15 11:31:29 +0100 |
commit | 41b6b792d8e9c84c0a71a4bd7600e1c42e86b5bd (patch) | |
tree | 21bc00a6733b54d92100fad5f7ddbe7ac9a45d13 | |
parent | 0345cbec97d2848fe5e41043d8ddf4cf5e888c72 (diff) |
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>
-rw-r--r-- | src/sna/sna_display.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c index ad5b5cd3..31d1ceb6 100644 --- a/src/sna/sna_display.c +++ b/src/sna/sna_display.c @@ -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); |