#!/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
