quickshell-rice/quickshell/services/BrightnessService.qml

105 lines
2.9 KiB
QML

pragma Singleton
import QtQuick
import Quickshell.Io
Item {
id: root
property var devices: []
property int masterBrightness: 100
property string brightnessStr: masterBrightness + "%"
property bool isUserInteracting: false
function scanDevices() {
if (!setDevProc.running && !applyTimer.running) {
scanProc.running = true
}
}
function setDeviceBrightness(devId, pct) {
var valid = Math.max(0, Math.min(100, Math.round(pct)))
isUserInteracting = true
userTimer.restart()
// Mutate in-place to prevent QML Repeater delegate destruction mid-drag
for (var i = 0; i < devices.length; i++) {
if (devices[i].id === devId) {
devices[i].brightness = valid
break
}
}
// Debounce hardware execution per device
applyTimer.targetDevId = devId
applyTimer.targetPct = valid
applyTimer.restart()
}
function brightnessUp() {
for (var i = 0; i < devices.length; i++) {
var item = devices[i]
setDeviceBrightness(item.id, item.brightness + 5)
}
}
function brightnessDown() {
for (var i = 0; i < devices.length; i++) {
var item = devices[i]
setDeviceBrightness(item.id, item.brightness - 5)
}
}
Timer {
id: applyTimer
interval: 100
repeat: false
property string targetDevId: ""
property int targetPct: 100
onTriggered: {
var dev = root.devices.find(d => d.id === targetDevId)
if (!dev) return
var cmd = ""
if (dev.type === "ddc") {
cmd = "ddcutil setvcp 10 " + targetPct + " --display " + dev.display_num + " 2>/dev/null"
} else if (dev.type === "sys" || dev.type === "kbd") {
cmd = "brightnessctl --device=" + dev.dev_name + " set " + targetPct + "% 2>/dev/null"
}
if (cmd !== "") {
setDevProc.command = ["bash", "-c", cmd]
setDevProc.running = true
}
}
}
Timer {
id: userTimer
interval: 4000
repeat: false
onTriggered: root.isUserInteracting = false
}
Process { id: setDevProc }
Process {
id: scanProc
command: ["python3", "/home/sho/Documents/themes/quickshell/services/python/brightness_service.py"]
running: true
stdout: SplitParser {
onRead: data => {
if (!root.isUserInteracting) {
try {
let parsed = JSON.parse(data.trim())
if (parsed && parsed.length > 0) {
root.devices = parsed
root.masterBrightness = parsed[0].brightness
}
} catch (e) {}
}
}
}
}
}