[systemd-devel] [PATCH 2/2] backlight: Avoid restoring brightness to an unreadably dim level
Lennart Poettering
lennart at poettering.net
Wed Mar 12 08:44:55 PDT 2014
On Tue, 11.03.14 21:16, Josh Triplett (josh at joshtriplett.org) wrote:
> Some systems turn the backlight all the way off at the lowest levels.
> Clamp saved brightness to at least 1 or 5% of max_brightness. This
> avoids preserving an unreadably dim screen, which would otherwise force
> the user to disable state restoration.
Applied, made a minor change though: I downgrade the warning message to
debug, since this isn' really something to warn about..
> ---
> v2: Send the right patch this time. Factor clamping into a separate
> function. Make failures in clamping non-fatal. Use unsigned rather
> than unsigned long long.
>
> src/backlight/backlight.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 44 insertions(+)
>
> diff --git a/src/backlight/backlight.c b/src/backlight/backlight.c
> index 81470b3..44308e0 100644
> --- a/src/backlight/backlight.c
> +++ b/src/backlight/backlight.c
> @@ -192,6 +192,48 @@ static bool validate_device(struct udev *udev, struct udev_device *device) {
> return true;
> }
>
> +/* Some systems turn the backlight all the way off at the lowest levels.
> + * clamp_brightness clamps the saved brightness to at least 1 or 5% of
> + * max_brightness. This avoids preserving an unreadably dim screen, which
> + * would otherwise force the user to disable state restoration. */
> +static void clamp_brightness(struct udev_device *device, char **value) {
> + int r;
> + const char *max_brightness_str;
> + unsigned brightness, max_brightness, new_brightness;
> +
> + max_brightness_str = udev_device_get_sysattr_value(device, "max_brightness");
> + if (!max_brightness_str) {
> + log_warning("Failed to read max_brightness attribute; not checking saved brightness");
> + return;
> + }
> +
> + r = safe_atou(*value, &brightness);
> + if (r < 0) {
> + log_warning("Failed to parse brightness \"%s\": %s", *value, strerror(-r));
> + return;
> + }
> +
> + r = safe_atou(max_brightness_str, &max_brightness);
> + if (r < 0) {
> + log_warning("Failed to parse max_brightness \"%s\": %s", max_brightness_str, strerror(-r));
> + return;
> + }
> +
> + new_brightness = MAX3(brightness, 1U, max_brightness/20);
> + if (new_brightness != brightness) {
> + char *old_value = *value;
> +
> + r = asprintf(value, "%u", new_brightness);
> + if (r < 0) {
> + log_warning("Failed to format new brightness: %s", strerror(-r));
> + return;
> + }
> +
> + log_warning("Saved brightness %s too low; increasing to %s", old_value, *value);
> + free(old_value);
> + }
> +}
> +
> int main(int argc, char *argv[]) {
> _cleanup_udev_unref_ struct udev *udev = NULL;
> _cleanup_udev_device_unref_ struct udev_device *device = NULL;
> @@ -306,6 +348,8 @@ int main(int argc, char *argv[]) {
> return EXIT_FAILURE;
> }
>
> + clamp_brightness(device, &value);
> +
> r = udev_device_set_sysattr_value(device, "brightness", value);
> if (r < 0) {
> log_error("Failed to write system attribute: %s", strerror(-r));
Lennart
--
Lennart Poettering, Red Hat
More information about the systemd-devel
mailing list