summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--main.c137
1 files changed, 137 insertions, 0 deletions
diff --git a/main.c b/main.c
new file mode 100644
index 0000000..70f6822
--- /dev/null
+++ b/main.c
@@ -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;
+}