diff options
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 137 |
1 files changed, 137 insertions, 0 deletions
@@ -0,0 +1,137 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +#include <stdio.h> +#include <math.h> +#include <string.h> +#include <stdbool.h> + +#define CUR_PATH "/sys/class/backlight/intel_backlight/brightness" +#define MAX_PATH "/sys/class/backlight/intel_backlight/max_brightness" +#define STEP 10 + +struct brightness { + int max_raw; + int raw; + int percents; +}; + + + +int readval(const char *path, int *dst) +{ + FILE *f = fopen(path, "r"); + int retval = 1; + + if (f == NULL) { + perror(path); + goto end; + } + + int raw; + if (fscanf(f, "%d", &raw) != 1) { + perror(path); + goto end; + } + + *dst = raw; + retval = 0; + +end: + if (f != NULL) + fclose(f); + return retval; +} + + +int get(struct brightness *dst) +{ + int retval = 1; + if (readval(CUR_PATH, &dst->raw)) + goto end; + if (readval(MAX_PATH, &dst->max_raw)) + goto end; + + dst->percents = (int)round((double)dst->raw*100/dst->max_raw); + retval = 0; + +end: + return retval; +} + +int set(struct brightness *src) +{ + int retval = 1; + FILE *f = fopen(CUR_PATH, "w"); + if (!f) { + perror(CUR_PATH); + goto end; + } + + fprintf(f, "%d", src->raw); + retval = 0; + +end: + if (f != NULL) + fclose(f); + return retval; +} + +void adjust(struct brightness *b, int value) +{ + b->percents += value; + if (b->percents > 100) + b->percents = 100; + else if (b->percents < 0) + b->percents = 0; + b->raw = (int)ceil((double)b->percents*b->max_raw/100); +} + + +void dump(struct brightness *b) +{ + printf("%d (%d%%)\n", b->raw, b->percents); +} + + +int main(int argc, char** argv) +{ + int retval = 0; + struct brightness b; + int adjust_val = STEP; + bool decr = false; + + if (argc > 1 && strcmp(argv[1], "-h") == 0) { + printf("usage: %s [-h] [+/-]\n", argv[0]); + goto end; + } + + if (get(&b)) + goto end; + + if (argc <= 1) { + dump(&b); + goto end; + } + + if (strcmp(argv[1], "-") == 0) + decr = true; + else if (strcmp(argv[1], "+") != 0) { + fprintf(stderr, "%s: unknown argument\n", argv[1]); + retval = 1; + goto end; + } + + if (decr) + adjust_val *= -1; + + adjust(&b, adjust_val); + if (set(&b)) { + retval = 1; + goto end; + } + + dump(&b); + +end: + return retval; +} |