Address review on Noctalia-inspired widgets
- nightLight queries hyprctl hyprsunset temperature to detect state instead of pgrep, since omarchy-toggle-nightlight keeps the daemon running across toggles. Adds a 'toggling' busy flag so repeated clicks do not stack the toggle script. - lockKeys reads each LED individually and emits 'missing' when the class is absent, fixing column-shift mislabels on keyboards that only expose a subset of the locks. Hides + stops polling when no LEDs are reported. Poll interval relaxed to 2s. - activeWindow right-click now calls toplevel.close() against the captured window instead of dispatching killactive against whatever is focused at click time. - Drop unused Common imports from activeWindow and lockKeys.
This commit is contained in:
@@ -1,7 +1,6 @@
|
|||||||
import QtQuick
|
import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import Quickshell.Wayland
|
import Quickshell.Wayland
|
||||||
import "../common" as Common
|
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
id: root
|
id: root
|
||||||
@@ -60,7 +59,7 @@ Item {
|
|||||||
if (mouse.button === Qt.MiddleButton) {
|
if (mouse.button === Qt.MiddleButton) {
|
||||||
root.toplevel.close()
|
root.toplevel.close()
|
||||||
} else if (mouse.button === Qt.RightButton) {
|
} else if (mouse.button === Qt.RightButton) {
|
||||||
if (root.bar) root.bar.run("hyprctl dispatch killactive")
|
root.toplevel.close()
|
||||||
} else {
|
} else {
|
||||||
root.toplevel.activate()
|
root.toplevel.activate()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import QtQuick
|
import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import Quickshell.Io
|
import Quickshell.Io
|
||||||
import "../common" as Common
|
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
id: root
|
id: root
|
||||||
@@ -29,29 +28,35 @@ Item {
|
|||||||
if (!stateProc.running) stateProc.running = true
|
if (!stateProc.running) stateProc.running = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
property bool ledsAvailable: true
|
||||||
|
|
||||||
Process {
|
Process {
|
||||||
id: stateProc
|
id: stateProc
|
||||||
command: ["bash", "-lc", "cat /sys/class/leds/input*::capslock/brightness 2>/dev/null | head -1; cat /sys/class/leds/input*::numlock/brightness 2>/dev/null | head -1; cat /sys/class/leds/input*::scrolllock/brightness 2>/dev/null | head -1"]
|
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 {
|
stdout: StdioCollector {
|
||||||
waitForEnd: true
|
waitForEnd: true
|
||||||
onStreamFinished: {
|
onStreamFinished: {
|
||||||
var lines = String(text || "").split("\n")
|
var lines = String(text || "").split("\n")
|
||||||
root.capsOn = parseInt(lines[0], 10) > 0
|
var caps = String(lines[0] || "").trim()
|
||||||
root.numOn = parseInt(lines[1], 10) > 0
|
var num = String(lines[1] || "").trim()
|
||||||
root.scrollOn = parseInt(lines[2], 10) > 0
|
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 {
|
Timer {
|
||||||
interval: 1000
|
interval: 2000
|
||||||
running: true
|
running: root.ledsAvailable
|
||||||
repeat: true
|
repeat: true
|
||||||
onTriggered: root.refresh()
|
onTriggered: root.refresh()
|
||||||
}
|
}
|
||||||
|
|
||||||
readonly property bool anyOn: capsOn || numOn || scrollOn
|
readonly property bool anyOn: capsOn || numOn || scrollOn
|
||||||
visible: hideWhenOff ? anyOn : true
|
visible: ledsAvailable && (hideWhenOff ? anyOn : true)
|
||||||
|
|
||||||
readonly property bool vertical: bar ? bar.vertical : false
|
readonly property bool vertical: bar ? bar.vertical : false
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,10 @@ Item {
|
|||||||
|
|
||||||
property bool active: false
|
property bool active: false
|
||||||
property bool toolAvailable: false
|
property bool toolAvailable: false
|
||||||
|
property bool toggling: false
|
||||||
|
|
||||||
|
readonly property int onTemp: 4000
|
||||||
|
readonly property int offTemp: 6000
|
||||||
|
|
||||||
function setting(name, fallback) {
|
function setting(name, fallback) {
|
||||||
var value = settings ? settings[name] : undefined
|
var value = settings ? settings[name] : undefined
|
||||||
@@ -23,6 +27,8 @@ Item {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function toggle() {
|
function toggle() {
|
||||||
|
if (toggling) return
|
||||||
|
toggling = true
|
||||||
if (root.bar) root.bar.run("omarchy-toggle-nightlight")
|
if (root.bar) root.bar.run("omarchy-toggle-nightlight")
|
||||||
refreshTimer.restart()
|
refreshTimer.restart()
|
||||||
}
|
}
|
||||||
@@ -31,20 +37,27 @@ Item {
|
|||||||
|
|
||||||
Process {
|
Process {
|
||||||
id: statusProc
|
id: statusProc
|
||||||
command: ["bash", "-lc", "if command -v hyprsunset >/dev/null && pgrep -x hyprsunset >/dev/null 2>&1; then echo on; elif command -v hyprsunset >/dev/null; then echo off; else echo missing; fi"]
|
command: ["bash", "-lc", "command -v hyprsunset >/dev/null || { echo missing; exit; }; if pgrep -x hyprsunset >/dev/null 2>&1; then hyprctl hyprsunset temperature 2>/dev/null | grep -oE '[0-9]+' | head -1; else echo idle; fi"]
|
||||||
stdout: StdioCollector {
|
stdout: StdioCollector {
|
||||||
waitForEnd: true
|
waitForEnd: true
|
||||||
onStreamFinished: {
|
onStreamFinished: {
|
||||||
var state = String(text || "").trim()
|
var state = String(text || "").trim()
|
||||||
root.toolAvailable = state !== "missing"
|
root.toggling = false
|
||||||
root.active = state === "on"
|
if (state === "missing") {
|
||||||
|
root.toolAvailable = false
|
||||||
|
root.active = false
|
||||||
|
return
|
||||||
|
}
|
||||||
|
root.toolAvailable = true
|
||||||
|
var temp = parseInt(state, 10)
|
||||||
|
root.active = !isNaN(temp) && temp < root.offTemp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Timer {
|
Timer {
|
||||||
id: refreshTimer
|
id: refreshTimer
|
||||||
interval: 1200
|
interval: 1500
|
||||||
onTriggered: root.refresh()
|
onTriggered: root.refresh()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user