diff options
| author | 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> | 2025-05-04 22:11:03 +1000 |
|---|---|---|
| committer | 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> | 2025-05-04 22:11:03 +1000 |
| commit | a575245d7b9f084110ce062b35d908ceeda260ab (patch) | |
| tree | 72e727d41577c99126f94421681eb0f17592c93d /services | |
| parent | feat: audio osd (diff) | |
| download | caelestia-shell-a575245d7b9f084110ce062b35d908ceeda260ab.tar.gz caelestia-shell-a575245d7b9f084110ce062b35d908ceeda260ab.tar.bz2 caelestia-shell-a575245d7b9f084110ce062b35d908ceeda260ab.zip | |
feat: brightness osd
Diffstat (limited to 'services')
| -rw-r--r-- | services/Brightness.qml | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/services/Brightness.qml b/services/Brightness.qml new file mode 100644 index 0000000..dd51376 --- /dev/null +++ b/services/Brightness.qml @@ -0,0 +1,113 @@ +pragma Singleton +pragma ComponentBehavior: Bound + +import "root:/widgets" +import Quickshell +import Quickshell.Io +import QtQuick + +Singleton { + id: root + + property var ddcMonitors: [] + readonly property list<Monitor> monitors: Quickshell.screens.map(screen => monitorComp.createObject(root, { + screen + })) + + function getMonitorForScreen(screen: ShellScreen): var { + return monitors.find(m => m.screen === screen); + } + + function increaseBrightness(): void { + const focusedName = Hyprland.focusedMonitor.name; + const monitor = monitors.find(m => focusedName === m.screen.name); + if (monitor) + monitor.setBrightness(monitor.brightness + 0.1); + } + + function decreaseBrightness(): void { + const focusedName = Hyprland.focusedMonitor.name; + const monitor = monitors.find(m => focusedName === m.screen.name); + if (monitor) + monitor.setBrightness(monitor.brightness - 0.1); + } + + reloadableId: "brightness" + + onMonitorsChanged: { + ddcMonitors = []; + ddcProc.running = true; + } + + Process { + id: ddcProc + + command: ["ddcutil", "detect", "--brief"] + stdout: SplitParser { + splitMarker: "\n\n" + onRead: data => { + if (data.startsWith("Display ")) { + const lines = data.split("\n").map(l => l.trim()); + root.ddcMonitors.push({ + model: lines.find(l => l.startsWith("Monitor:")).split(":")[2], + busNum: lines.find(l => l.startsWith("I2C bus:")).split("/dev/i2c-")[1] + }); + } + } + } + onExited: root.ddcMonitorsChanged() + } + + Process { + id: setProc + } + + CustomShortcut { + name: "brightnessUp" + onPressed: root.increaseBrightness() + } + + CustomShortcut { + name: "brightnessDown" + onPressed: root.decreaseBrightness() + } + + component Monitor: QtObject { + id: monitor + + required property ShellScreen screen + readonly property bool isDdc: root.ddcMonitors.some(m => m.model === screen.model) + readonly property string busNum: root.ddcMonitors.find(m => m.model === screen.model)?.busNum ?? "" + property real brightness + + readonly property Process initProc: Process { + stdout: SplitParser { + onRead: data => { + const [, , , current, max] = data.split(" "); + monitor.brightness = parseInt(current) / parseInt(max); + } + } + } + + function setBrightness(value: real): void { + value = Math.max(0, Math.min(1, value)); + const rounded = Math.round(value * 100); + if (Math.round(brightness * 100) === rounded) + return; + brightness = value; + setProc.command = isDdc ? ["ddcutil", "-b", busNum, "setvcp", "10", rounded] : ["brightnessctl", "s", rounded]; + setProc.startDetached(); + } + + onBusNumChanged: { + initProc.command = isDdc ? ["ddcutil", "-b", busNum, "getvcp", "10", "--brief"] : ["sh", "-c", `echo "a b c $(brightnessctl g) $(brightnessctl m)"`]; + initProc.running = true; + } + } + + Component { + id: monitorComp + + Monitor {} + } +} |