Merge pull request 'add brightness service and slider' (#2) from niri into v3
Reviewed-on: #2
This commit is contained in:
commit
a2baad9d72
52
services/brightness/__init__.py
Normal file
52
services/brightness/__init__.py
Normal 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
|
@ -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"}
|
|
@ -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 {
|
||||||
|
@ -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
22
widgets/bar/brightness.hy
Normal 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)))))])))
|
Loading…
x
Reference in New Issue
Block a user