From a6905ebe4f2b1e3edc7a8f8179beea4a045f13cd Mon Sep 17 00:00:00 2001 From: Igor Kolokolnikov Date: Sat, 26 Sep 2026 19:41:31 -0700 Subject: [PATCH] Improvements to keyboard backlight. --- slock.c | 111 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 58 insertions(+), 53 deletions(-) diff --git a/slock.c b/slock.c index 54cf492..d8b01b8 100644 --- a/slock.c +++ b/slock.c @@ -191,6 +191,7 @@ void update_crtc_infos(Display *dpy) void set_screen_on(Display *dpy) { +#if !DEBUG if(crtcres) { int i; for(i = 0; i < crtcres->ncrtc; i++) { @@ -206,10 +207,12 @@ void set_screen_on(Display *dpy) info->noutput); } } +#endif } void set_screen_off(Display *dpy) { +#if !DEBUG if(crtcres) { int i; for(i = 0; i < crtcres->ncrtc; i++) { @@ -229,6 +232,7 @@ void set_screen_off(Display *dpy) } } } +#endif } static void @@ -627,21 +631,50 @@ static void dpms_enable(Display *dpy, struct dpms_state *state) } } -struct keyboard_backlight_state { +struct keyboard_backlight { int available; - int brightness; int fd; }; -static struct keyboard_backlight_state get_keyboard_backlight_state() +static int +get_keyboard_backlight_brightness(struct keyboard_backlight *kbl) +{ + if(kbl->available) { + int read_amnt, s; + long num; + + static char read_buf[32]; + char *endptr; + + read_amnt = 0; + do { + s = read(kbl->fd, read_buf+read_amnt, 32-read_amnt); + if(s == -1) + break; + read_amnt += s; + } while(s != 0); + + if(s != -1) { + read_buf[read_amnt] = '\0'; + + num = strtol(read_buf, &endptr, 10); + if(!(errno == ERANGE || endptr == read_buf)) { + return (int)num; + } + } + } + return 0; +} + +static struct keyboard_backlight init_keyboard_backlight() { static char bl_entry[1024]; char *leds; DIR *d; - struct keyboard_backlight_state bl_state; - memset(&bl_state, 0, sizeof(bl_state)); + struct keyboard_backlight kbl; + memset(&kbl, 0, sizeof(kbl)); leds = "/sys/class/leds"; d = opendir(leds); @@ -649,7 +682,6 @@ static struct keyboard_backlight_state get_keyboard_backlight_state() struct dirent *entry; while((entry = readdir(d)) != 0) { if(str_contains(entry->d_name, "kbd_backlight")) { - static char read_buf[32]; int fd; snprintf(bl_entry, 1024, @@ -657,28 +689,8 @@ static struct keyboard_backlight_state get_keyboard_backlight_state() fd = open(bl_entry, O_RDWR); if(fd != -1) { - int read_amnt, s; - char *endptr; - long num; - - read_amnt = 0; - do { - s = read(fd, read_buf+read_amnt, 32-read_amnt); - if(s == -1) - break; - read_amnt += s; - } while(s != 0); - - if(s != -1) { - read_buf[read_amnt] = '\0'; - - num = strtol(read_buf, &endptr, 10); - if(!(errno == ERANGE || endptr == read_buf)) { - bl_state.available = 1; - bl_state.fd = fd; - bl_state.brightness = num; - } - } + kbl.available = 1; + kbl.fd = fd; } break; @@ -687,27 +699,20 @@ static struct keyboard_backlight_state get_keyboard_backlight_state() closedir(d); } - return bl_state; + return kbl; } static void -reset_keyboard_backlight(struct keyboard_backlight_state *bl_state) +set_keyboard_backlight(struct keyboard_backlight *kbl, + int brightness) { +#if !DEBUG static char buf[512]; - if(bl_state->available) { - snprintf(buf, sizeof(buf), "%d\n", bl_state->brightness); - write(bl_state->fd, buf, str_len(buf)); - } -} - -static void -set_keyboard_backlight_off(struct keyboard_backlight_state *bl_state) -{ - if(bl_state->available) { - char buf[512]; - snprintf(buf, sizeof(buf), "%d\n", 0); - write(bl_state->fd, buf, str_len(buf)); + if(kbl->available) { + snprintf(buf, sizeof(buf), "%d\n", brightness); + write(kbl->fd, buf, str_len(buf)); } +#endif } static void update_timerfd(int tfd) @@ -728,9 +733,9 @@ static void update_timerfd(int tfd) } static void -readpw(struct arena *arena, - Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, - const char *hash, struct keyboard_backlight_state *bl_state) +run_loop(struct arena *arena, + Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, + const char *hash, struct keyboard_backlight *kbl) { XRRScreenChangeNotifyEvent *rre; char buf[32], passwd[256], *inputhash; @@ -743,6 +748,7 @@ readpw(struct arena *arena, unsigned long long rendering_timeout_millis; struct dpms_state dpms_state; struct fonts fonts; + int kbl_brightness; int error; int needs_rendering; @@ -760,8 +766,8 @@ readpw(struct arena *arena, tfd = timerfd_create(CLOCK_REALTIME, 0); update_crtc_infos(dpy); - dpms_disable(dpy, &dpms_state); + kbl_brightness = get_keyboard_backlight_brightness(kbl); if(!load_fonts(&fonts)) die("slock: load_fonts\n"); @@ -910,10 +916,10 @@ readpw(struct arena *arena, if(dson_saved != dson) { if(dson) { - reset_keyboard_backlight(bl_state); + set_keyboard_backlight(kbl, kbl_brightness); set_screen_on(dpy); } else { - set_keyboard_backlight_off(bl_state); + set_keyboard_backlight(kbl, 0); set_screen_off(dpy); } } @@ -945,7 +951,7 @@ readpw(struct arena *arena, if(ret == 0) { dson = 0; set_screen_off(dpy); - set_keyboard_backlight_off(bl_state); + set_keyboard_backlight(kbl, 0); } else if(ret > 0 && FD_ISSET(xfd, &fds)) { } else if(ret > 0 && FD_ISSET(tfd, &fds)) { } @@ -1121,8 +1127,7 @@ main(int argc, char **argv) { if (!DPMSQueryExtension(dpy, &event_base, &error_base)) die("slock: dpms extension is not supported\n"); - struct keyboard_backlight_state bl_state = - get_keyboard_backlight_state(); + struct keyboard_backlight kbl = init_keyboard_backlight(); /* drop privileges */ if (setgroups(0, NULL) < 0) @@ -1164,7 +1169,7 @@ main(int argc, char **argv) { /* everything is now blank. Wait for the correct password */ struct arena arena = arena_init(bf, GB(1)); - readpw(&arena, dpy, &rr, locks, nscreens, hash, &bl_state); + run_loop(&arena, dpy, &rr, locks, nscreens, hash, &kbl); return 0; }