#!/usr/bin/env bash # Backlight brightness (first device under /sys/class/backlight). Refreshes # on backlight udev events, which also fire for the hardware keys. # # brightness status loop (deflisten) # brightness set PERCENT dev="" for d in /sys/class/backlight/*; do [[ -e $d ]] && { dev=${d##*/}; break; } done state() { [[ -n $dev ]] || { printf '{"percent":0,"available":false}'; return; } local max cur max=$(<"/sys/class/backlight/$dev/max_brightness") cur=$(cat "/sys/class/backlight/$dev/actual_brightness" 2>/dev/null \ || cat "/sys/class/backlight/$dev/brightness") printf '{"percent":%d,"available":true}' "$(((cur * 100 + max / 2) / max))" } refresh() { emit "$(state)"; } _bl_events() { exec udevadm monitor --udev --subsystem-match=backlight; } case ${1:-} in set) [[ -n $dev ]] && brightnessctl -q -d "$dev" set "${2%.*}%" ;; *) refresh [[ -n $dev ]] || exit 0 mux_init mux_add _bl_events mux_loop refresh ;; esac