Files
arthur-os/shell/plugins/bar/widgets/LockKeys.qml
T

95 lines
2.9 KiB
QML

import QtQuick
import Quickshell
import Quickshell.Io
import qs.Commons
import qs.Ui
BarWidget {
id: root
moduleName: "omarchy.lock-keys"
property bool capsOn: false
property bool numOn: false
property bool scrollOn: false
property bool hideWhenOff: true
Component.onCompleted: {
hideWhenOff = setting("hideWhenOff", true) === true
refresh()
}
function refresh() {
if (!stateProc.running) stateProc.running = true
}
property bool ledsAvailable: true
Process {
id: stateProc
command: ["bash", "-lc", "read_led() { for path in /sys/class/leds/input*::$1; do if [[ -r $path/brightness ]]; then cat $path/brightness; return; fi; done; echo missing; }; read_led capslock; read_led numlock; read_led scrolllock"]
stdout: StdioCollector {
waitForEnd: true
onStreamFinished: {
var lines = String(text || "").split("\n")
var caps = String(lines[0] || "").trim()
var num = String(lines[1] || "").trim()
var scroll = String(lines[2] || "").trim()
root.capsOn = caps !== "missing" && parseInt(caps, 10) > 0
root.numOn = num !== "missing" && parseInt(num, 10) > 0
root.scrollOn = scroll !== "missing" && parseInt(scroll, 10) > 0
root.ledsAvailable = caps !== "missing" || num !== "missing" || scroll !== "missing"
}
}
}
Timer {
interval: 2000
running: root.ledsAvailable
repeat: true
onTriggered: root.refresh()
}
readonly property bool anyOn: capsOn || numOn || scrollOn
visible: ledsAvailable && (hideWhenOff ? anyOn : true)
implicitWidth: vertical ? barSize : (lay.item ? lay.item.implicitWidth + Style.spacing.controlGap : 0)
implicitHeight: vertical ? (lay.item ? lay.item.implicitHeight + Style.spacing.controlGap : 0) : barSize
Loader {
id: lay
anchors.centerIn: parent
sourceComponent: root.vertical ? colLayout : rowLayout
}
Component {
id: rowLayout
Row {
spacing: Style.space(4)
LockGlyph { glyph: "A"; active: root.capsOn; visible: !root.hideWhenOff || root.capsOn }
LockGlyph { glyph: "1"; active: root.numOn; visible: !root.hideWhenOff || root.numOn }
LockGlyph { glyph: "S"; active: root.scrollOn; visible: !root.hideWhenOff || root.scrollOn }
}
}
Component {
id: colLayout
Column {
spacing: Style.space(2)
LockGlyph { glyph: "A"; active: root.capsOn; visible: !root.hideWhenOff || root.capsOn }
LockGlyph { glyph: "1"; active: root.numOn; visible: !root.hideWhenOff || root.numOn }
LockGlyph { glyph: "S"; active: root.scrollOn; visible: !root.hideWhenOff || root.scrollOn }
}
}
component LockGlyph: Text {
property string glyph: ""
property bool active: false
text: glyph
color: active ? (root.bar ? root.bar.foreground : Color.foreground) : Qt.rgba(0.7, 0.7, 0.7, 0.3)
font.family: root.bar ? root.bar.fontFamily : Style.font.family
font.pixelSize: Style.font.bodySmall
}
}