Mercurial > backlight
changeset 7:45a06b02a61f
misc: add missing files
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 17 Sep 2019 21:34:11 +0200 |
parents | 77ea2359f3e4 |
children | 23faf720d186 |
files | .hgignore backlight.1 backlight.c |
diffstat | 3 files changed, 280 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/.hgignore Mon Sep 16 15:08:21 2019 +0200 +++ b/.hgignore Tue Sep 17 21:34:11 2019 +0200 @@ -18,4 +18,4 @@ \.o$ # backlight binary -backlight +^backlight$
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/backlight.1 Tue Sep 17 21:34:11 2019 +0200 @@ -0,0 +1,44 @@ +.\" +.\" Copyright (c) 2010-2019 David Demelier <markand@malikania.fr> +.\" +.\" Permission to use, copy, modify, and/or distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd September 16, 2019 +.Dt BACKLIGHT 1 +.Os +.\" NAME +.Sh NAME +.Nm backlight +.Nd command line redmine client +.\" SYNOPSIS +.Sh SYNOPSIS +.Nm +.Ar down +.Nm +.Ar up +.\" DESCRIPTION +.Sh DESCRIPTION +The +.Nm +tool adjust the brightness on your screen using direct access to ACPI video +extension. +.Pp +It understand the two commands +.Ar down +and +.Ar up +which decrease or increase the brightness level respectively. +.\" AUTHORS +.Sh AUTHORS +.Nm +was written by David Demelier <markand@malikania.fr>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/backlight.c Tue Sep 17 21:34:11 2019 +0200 @@ -0,0 +1,235 @@ +/* + * main.c -- adjust laptop backlight using ACPI + * + * Copyright (c) 2010-2019 David Demelier <markand@malikania.fr> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <errno.h> +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +enum action { + Up, + Down +}; + +static void +usage(const char *name) +{ + fprintf(stderr, "usage: %s down\n", name); + fprintf(stderr, " %s up\n", name); + exit(1); +} + +static void +die(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + fprintf(stderr, "abort: "); + vfprintf(stderr, fmt, ap); + va_end(ap); + + exit(1); +} + +/* {{{ Support for FreeBSD */ + +#if defined(__FreeBSD__) + +#include <sys/types.h> +#include <sys/sysctl.h> + +static int +set(enum action type) +{ + int current, next = 0, i; + int msg[100]; + size_t len, nextlen; + + /* First, get all values availables */ + len = sizeof (msg); + + if (sysctlbyname("hw.acpi.video.lcd0.levels", msg, &len, NULL, 0) == -1) + die("sysctl: %s\n", strerror(errno)); + + /* Get the current value */ + len = sizeof (current); + + if (sysctlbyname("hw.acpi.video.lcd0.brightness", ¤t, &len, NULL, 0) == -1) + die("sysctl: %s\n", strerror(errno)); + + /* First find the index of 0 */ + for (i = 0; msg[i] != 0; ++i) + continue; + + /* Find the current value index in msg */ + for (; msg[i] != current; ++i) + continue; + + if (type == Up) { + if (msg[i] >= 100) + return msg[i]; + + next = msg[i + 1]; + } else { + if (msg[i] == 0) + return 0; + + next = msg[i - 1]; + } + + nextlen = sizeof (next); + + if (sysctlbyname("hw.acpi.video.lcd0.brightness", ¤t, &len, &next, nextlen) == -1) + die("sysctl: %s\n", strerror(errno)); + + return next; +} + +#endif + +/* }}} */ + +/* {{{ Support for Linux */ + +#if defined(__linux__) + +#include <sys/types.h> +#include <sys/stat.h> + +static int +read_int(const char *path) +{ + FILE *fp; + int value = 0; + + if ((fp = fopen(path, "r")) == NULL) + die("open: %s\n", strerror(errno)); + if (fscanf(fp, "%d", &value) != 1) + die("could not read value from %s\n", path); + + fclose(fp); + + return value; +} + +static int +write_int(const char *path, int value) +{ + FILE *fp; + + if ((fp = fopen(path, "w+")) == NULL) + die("open: %s\n", strerror(errno)); + + fprintf(fp, "%d", value); + + return value; +} + +static const char * +find_card(void) +{ + static const char *list[] = { + "/sys/class/backlight/acpi_video0", + "/sys/class/backlight/intel_backlight", + NULL + }; + + struct stat st; + + for (const char **ptr = list; *ptr != NULL; ++ptr) + if (stat(*ptr, &st) >= 0) + return *ptr; + + return NULL; +} + +static int +set(int type) +{ + int current, max; + char file[BUFSIZ]; + const char *card = find_card(); + + /* Find a card adaptor */ + if (!card) + die("could not find card adaptor\n"); + + /* Read actual */ + snprintf(file, sizeof (file), "%s/actual_brightness", card); + current = read_int(file); + + /* Read max */ + snprintf(file, sizeof (file), "%s/max_brightness", card); + max = read_int(file); + + if (type == Up) { + current += max / 100; + + if (current > max) + return max; + } else { + current -= max / 100; + + if (current < 0) + return 0; + } + + snprintf(file, sizeof (file), "%s/brightness", card); + + return write_int(file, current); +} + +#else + +/* Not supported */ +static int +set(int type) +{ + (void)type; + + die("backlight is not supported on this system"); +} + +#endif + +/* }}} */ + +int +main(int argc, char *argv[]) +{ + int st, type; + + if (argc < 2) + usage(argv[0]); + + if (strcmp(argv[1], "up") == 0) + type = Up; + else if (strcmp(argv[1], "down") == 0) + type = Down; + else + usage(argv[0]); + + if ((st = set(type)) < 0) + return 1; + + printf("switching to %d\n", st); + + return 0; +}