From 66fb7536e8aea587bf5d525c4bd472e4319491f9 Mon Sep 17 00:00:00 2001 From: rope Date: Sun, 16 Aug 2026 13:51:24 +0100 Subject: [PATCH] quickshell: snap kbd backlight keys to exact 5% steps Co-Authored-By: Claude Opus 5 --- settings/quickshell.nix | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/settings/quickshell.nix b/settings/quickshell.nix index ff2b0d5..db6fa2b 100644 --- a/settings/quickshell.nix +++ b/settings/quickshell.nix @@ -1645,13 +1645,31 @@ in brightProc.running = true; } + // smc::kbd_backlight has a raw max of 255, so brightnessctl's + // own percentages don't round-trip: `10%+` adds 25 raw, which + // reads back as 9%. Snap to exact 5% steps in raw units and + // report the intended percent to the OSD instead of the + // truncated readback. Prints a fake -m line so the parser above + // is unchanged. $3 = current raw, $5 = max raw. + function setKbd(step) { + if (brightProc.running) return; + brightProc.osdIcon = "keyboard"; + brightProc.command = ["sh", "-c", + 'd=smc::kbd_backlight; set -- $(brightnessctl -m -d $d | tr , " "); ' + + 'n=$(( ($3 * 20 + $5 / 2) / $5 ' + step + ' )); ' + + '[ $n -lt 0 ] && n=0; [ $n -gt 20 ] && n=20; ' + + 'brightnessctl -q -d $d set $(( (n * $5 + 10) / 20 )); ' + + 'echo "$d,leds,0,$(( n * 5 ))%,$5"']; + brightProc.running = true; + } + IpcHandler { target: "osd" // floor 1%: `set 0%` turns the panel fully off function brightnessUp(): void { root.setBrightness(["set", "5%+"], "brightness"); } function brightnessDown(): void { root.setBrightness(["-n", "1", "set", "5%-"], "brightness"); } - function kbdUp(): void { root.setBrightness(["-d", "smc::kbd_backlight", "set", "10%+"], "keyboard"); } - function kbdDown(): void { root.setBrightness(["-d", "smc::kbd_backlight", "set", "10%-"], "keyboard"); } + function kbdUp(): void { root.setKbd("+ 1"); } + function kbdDown(): void { root.setKbd("- 1"); } } // ── Night light: quickshell owns the schedule, the hyprsunset