From 676f69c416339723f8c1d2b01625c62cf173951b Mon Sep 17 00:00:00 2001 From: nat Date: Mon, 3 Mar 2025 19:04:14 -0800 Subject: [PATCH] add brightness service and slider --- services/brightness/__init__.py | 52 +++++++++++++++++++++++++++++++++ style/style.css.map | 1 - style/widgets/bar.scss | 26 +++++++++++++++-- widgets/bar/__init__.hy | 4 ++- widgets/bar/brightness.hy | 22 ++++++++++++++ 5 files changed, 101 insertions(+), 4 deletions(-) create mode 100644 services/brightness/__init__.py delete mode 100644 style/style.css.map create mode 100644 widgets/bar/brightness.hy diff --git a/services/brightness/__init__.py b/services/brightness/__init__.py new file mode 100644 index 0000000..a8da071 --- /dev/null +++ b/services/brightness/__init__.py @@ -0,0 +1,52 @@ +from astal import read_file, write_file, gi + +gi.require_version("GObject", "2.0") +gi.require_version("GUdev", "1.0") +from gi.repository import GObject, GUdev, GLib + +class Brightness(GObject.Object): + _brightness: float = 0 + + def __init__(self, device: str): + super().__init__() + + self._device_name = device + self._udev_client = GUdev.Client.new(["backlight"]) + self._udev_client.connect('uevent', self.on_uevent) + + def on_uevent(self, client, action, device): + if device.get_name() != self._device_name: + return + + self._brightness = self._get_brightness() + self.notify('brightness') + + def _get_brightness(self): + return self._get_current_brightness() / self._get_max_brightness() + + def _get_current_brightness(self): + return int(read_file(f"/sys/class/backlight/{self._device_name}/brightness")) + + def _get_max_brightness(self): + return int(read_file(f"/sys/class/backlight/{self._device_name}/max_brightness")) + + @GObject.Property(type=float) + def brightness(self): + return self._brightness + + @brightness.setter + def brightness(self, value: float): + if value < 0: + value = 0 + + elif value > 1: + value = 1 + + self._brightness = value + GLib.file_set_contents_full(f"/sys/class/backlight/{self._device_name}/brightness", bytes(str(round(self._brightness * self._get_max_brightness())), 'utf-8'), GLib.FileSetContentsFlags.ONLY_EXISTING, 0o666) + + def get_brightness(self): + return self._brightness + + def set_brightness(self, value): + self.brightness = value diff --git a/style/style.css.map b/style/style.css.map deleted file mode 100644 index 57292fb..0000000 --- a/style/style.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sourceRoot":"","sources":["style.scss","widgets/bar.scss","colors.scss","mixins.scss","widgets/notifications.scss"],"names":[],"mappings":"AAAA;EACE;;;ACCF;EACE;;;AAKE;EACE,YATG;EAUH,YCVD;EDWC;EACA;;AAEA;EACE;EACA;EACA;EACA,kBCjBG;;ADmBH;EACE,kBCnBC;;ADsBH;EACE,kBCnBL;;ADyBD;EACE;EACA;EACA;EACA;EACA;;AAGE;EACE;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;EACA,YClDC;;ADqDH;EACE;EACA,YC/Ba;;ADqCrB;EACE,YA/DK;EAgEL,YChEC;;ADkED;EACE;;AAEE;EACE;EACA;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA,YChFD;;ADmFD;EACE,YC9ED;;ADoFP;EACE;EACA;;AACA;EACE;EACA;EE/FN,ODYgB;ECXhB,kBDYgB;ECXhB,QAY0B;EAX1B,SAW+B;EAV/B,WAUoC;;AARpC;EACE;EACA,WAMuC;EALvC;;AF2FA;EACE,YCrGK;EDsGL;EACA;EACA;;AAGF;EACE;EACA,YC9GD;;ADgHC;EACE;EACA;;;AGhHJ;EACE;EACA;EACA,YFLD;;AEOC;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE,YFpBG;;AEsBH;EACE;EACA,kBFlBC;;AEsBL;EACE;;AAEA;EACE,YFzBC;;AE4BH;EACE,YF/BL","file":"style.css"} \ No newline at end of file diff --git a/style/widgets/bar.scss b/style/widgets/bar.scss index 45d27d5..05c0d29 100644 --- a/style/widgets/bar.scss +++ b/style/widgets/bar.scss @@ -68,7 +68,7 @@ centerbox { margin: 5px; box.volume-slider { > button { - font-size: 20px; + font-size: 24px; margin: 5px; } @@ -86,7 +86,29 @@ centerbox { background: $hl-alt-1; } } - } + } + + box.brightness-slider { + > button { + font-size: 20px; + margin: 5px; + } + + > .brightness-slider { /* selecting this as `slider` doesn't work, for some reason.*/ + min-width: 120px; + min-height: 10px; + + & trough { + min-height: 10px; + min-width: 120px; + background: $bg-alt-1; + } + + & highlight { + background: $hl-alt-1; + } + } + } } .battery-container { diff --git a/widgets/bar/__init__.hy b/widgets/bar/__init__.hy index 0cf8152..3dcad1f 100644 --- a/widgets/bar/__init__.hy +++ b/widgets/bar/__init__.hy @@ -6,6 +6,7 @@ (import .clock [clock]) (import .battery [battery-dial]) (import .volume [volume]) +(import .brightness [brightness]) (setv bar (Widget.Window :namespace "bar" @@ -26,7 +27,8 @@ :class-name "sliders" :vertical True :children [ - volume]) + volume + brightness]) battery-dial ((astalify Gtk.Separator)) clock])))) diff --git a/widgets/bar/brightness.hy b/widgets/bar/brightness.hy new file mode 100644 index 0000000..c801fa2 --- /dev/null +++ b/widgets/bar/brightness.hy @@ -0,0 +1,22 @@ +(import astal *) +(import astal.gtk3 *) +(import services.brightness [Brightness]) +(import math [floor]) + +(import gi.repository [AstalWp]) + +(let [ + backlight (Brightness "amdgpu_bl1")] + (setv brightness (Widget.Box + :class-name "brightness-slider" + :children [ + (Widget.Button + :child (Widget.Icon :icon (bind backlight "brightness" (fn [brightness] + f"display-brightness-{(get ["off" "low" "medium" "high" "high"] (floor (/ (* brightness 100) 25)))}-symbolic")))) + (Widget.Slider + :class-name "brightness-slider" + :hexpand True + :draw-value False + :value (bind backlight "brightness") + :on-dragged (fn [self] + (. backlight (set-brightness (.get-value self)))))])))