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);