From 96098fae19d2b808f41df1f50f4c0365e03b2007 Mon Sep 17 00:00:00 2001 From: Anthony Rodriguez Date: Fri, 14 Feb 2025 14:32:02 +0100 Subject: [PATCH] feat: add brightness service --- flake.nix | 1 + service/brightness.ts | 51 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 service/brightness.ts diff --git a/flake.nix b/flake.nix index 10ebb77..87d0bab 100644 --- a/flake.nix +++ b/flake.nix @@ -46,6 +46,7 @@ (ags.packages.${system}.default.override { extraPackages = astalPkgs; }) + pkgs.brightnessctl ]; }; }; diff --git a/service/brightness.ts b/service/brightness.ts new file mode 100644 index 0000000..c630d16 --- /dev/null +++ b/service/brightness.ts @@ -0,0 +1,51 @@ +import GObject, { register, property } from "astal/gobject"; +import { monitorFile, readFileAsync } from "astal/file"; +import { exec, execAsync } from "astal/process"; + +const get = (args: string) => Number(exec(`brightnessctl ${args}`)); +const screen = exec(`bash -c "ls -w1 /sys/class/backlight | head -1"`); + +@register({ GTypeName: "Brightness" }) +export default class Brightness extends GObject.Object { + static instance: Brightness; + static get_default() { + if (!this.instance) this.instance = new Brightness(); + + return this.instance; + } + + #screenMax = get("max"); + #screen = get("get") / (this.#screenMax || 1); + + @property(Number) + get screen() { + return this.#screen; + } + + set screen(percent) { + console.log(percent); + if (percent < 0) percent = 0; + + if (percent > 1) percent = 1; + + execAsync(`brightnessctl set ${Math.floor(percent * 100)}% -q`).then( + () => { + console.log(percent); + this.#screen = percent; + this.notify("screen"); + }, + ); + } + + constructor() { + super(); + + const screenPath = `/sys/class/backlight/${screen}/brightness`; + + monitorFile(screenPath, async (f) => { + const value = await readFileAsync(f); + this.#screen = Number(value) / this.#screenMax; + this.notify("screen"); + }); + } +}