import { bash, dependencies, sh } from "lib/utils"; if (!dependencies("brightnessctl")) App.quit(); const get = (args: string) => Number(Utils.exec(`brightnessctl ${args}`)); const screen = await bash`ls -w1 /sys/class/backlight | head -1`; const kbd = await bash`ls -w1 /sys/class/leds | head -1`; class Brightness extends Service { static { Service.register( this, {}, { screen: ["float", "rw"], kbd: ["int", "rw"], }, ); } #kbdMax = get(`--device ${kbd} max`); #kbd = get(`--device ${kbd} get`); #screenMax = get("max"); #screen = get("get") / get("max"); get kbd() { return this.#kbd; } get screen() { return this.#screen; } set kbd(value) { if (value < 0 || value > this.#kbdMax) return; sh(`brightnessctl -d ${kbd} s ${value} -q`).then(() => { this.#kbd = value; this.changed("kbd"); }); } set screen(percent) { if (percent < 0) percent = 0; if (percent > 1) percent = 1; sh( `gbmonctl --prop brightness -val ${Math.min( Math.max(Math.floor(percent * 100), 0), 100, )}`, ).then(() => { this.#screen = percent; this.changed("screen"); }); } constructor() { super(); const screenPath = `/sys/class/backlight/${screen}/brightness`; const kbdPath = `/sys/class/leds/${kbd}/brightness`; Utils.monitorFile(screenPath, async (f) => { const v = await Utils.readFileAsync(f); this.#screen = Number(v) / this.#screenMax; this.changed("screen"); }); Utils.monitorFile(kbdPath, async (f) => { const v = await Utils.readFileAsync(f); this.#kbd = Number(v) / this.#kbdMax; this.changed("kbd"); }); } } export default new Brightness();