Merge pull request 'add brightness service and slider' (#2) from niri into v3

Reviewed-on: #2
This commit is contained in:
natalie roentgen connolly 2025-03-26 05:25:01 -07:00
commit a2baad9d72
5 changed files with 101 additions and 4 deletions

View File

@ -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

View File

@ -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"}

View File

@ -68,7 +68,7 @@ centerbox {
margin: 5px; margin: 5px;
box.volume-slider { box.volume-slider {
> button { > button {
font-size: 20px; font-size: 24px;
margin: 5px; margin: 5px;
} }
@ -87,6 +87,28 @@ centerbox {
} }
} }
} }
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 { .battery-container {

View File

@ -6,6 +6,7 @@
(import .clock [clock]) (import .clock [clock])
(import .battery [battery-dial]) (import .battery [battery-dial])
(import .volume [volume]) (import .volume [volume])
(import .brightness [brightness])
(setv bar (Widget.Window (setv bar (Widget.Window
:namespace "bar" :namespace "bar"
@ -26,7 +27,8 @@
:class-name "sliders" :class-name "sliders"
:vertical True :vertical True
:children [ :children [
volume]) volume
brightness])
battery-dial battery-dial
((astalify Gtk.Separator)) ((astalify Gtk.Separator))
clock])))) clock]))))

22
widgets/bar/brightness.hy Normal file
View File

@ -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)))))])))