intel_backlight_ctl/intel_backlight_ctl.c
2023-08-10 03:01:18 +03:00

138 lines
2.3 KiB
C

/* 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;
}