73 lines
2.6 KiB
QML
73 lines
2.6 KiB
QML
pragma Singleton
|
|
import QtQuick
|
|
import Quickshell.Io
|
|
|
|
// Shared state for SystemUpdate.qml, the bar's package-update indicator.
|
|
// Bar.qml is instantiated once per screen (see shell.qml's Variants), so
|
|
// without this being a singleton, plugging in extra monitors would mean
|
|
// running `checkupdates` that many times in parallel on every poll — which
|
|
// isn't just wasteful, it's actively unreliable: concurrent invocations
|
|
// race over checkupdates' own sync directory and can intermittently report
|
|
// 0 pending updates. One shared Process here means exactly one `checkupdates`
|
|
// run at a time, and every bar's icon reflects the same result.
|
|
QtObject {
|
|
id: root
|
|
|
|
// checkupdates syncs a throwaway copy of the pacman db, so it's not
|
|
// free to run often — matches the old waybar custom/updater module's
|
|
// ~21.7 minute poll interval (see .config/waybar/config).
|
|
readonly property int refreshIntervalMs: 1300 * 1000
|
|
|
|
property int updateCount: 0
|
|
property bool checking: false
|
|
property bool updating: false
|
|
|
|
function refresh() {
|
|
if (_checkProc.running) return
|
|
root.checking = true
|
|
_checkProc.running = true
|
|
}
|
|
|
|
// scriptPath: absolute path to update-system.sh (resolved by the caller
|
|
// via Quickshell.shellPath, which isn't available as a plain import
|
|
// here without pulling in the whole Quickshell singleton for one call).
|
|
function runUpdate(scriptPath) {
|
|
if (_updateProc.running) return
|
|
root.updating = true
|
|
_updateProc.command = [scriptPath]
|
|
_updateProc.running = true
|
|
}
|
|
|
|
// QtObject has no default property, so these are attached via property
|
|
// assignment rather than as plain child elements (same as Colors.qml's
|
|
// FileView).
|
|
readonly property Process _checkProc: Process {
|
|
command: ["sh", "-c", "checkupdates 2>/dev/null | wc -l"]
|
|
stdout: StdioCollector {
|
|
id: checkCollector
|
|
onStreamFinished: {
|
|
root.updateCount = parseInt(checkCollector.text.trim(), 10) || 0
|
|
root.checking = false
|
|
}
|
|
}
|
|
}
|
|
|
|
// Runs update-system.sh, which opens its own terminal and blocks until
|
|
// that terminal is closed — so this only exits once the user's actually
|
|
// done updating, which is exactly when a re-check matters.
|
|
readonly property Process _updateProc: Process {
|
|
onExited: {
|
|
root.updating = false
|
|
root.refresh()
|
|
}
|
|
}
|
|
|
|
readonly property Timer _timer: Timer {
|
|
interval: root.refreshIntervalMs
|
|
running: true
|
|
repeat: true
|
|
triggeredOnStart: true
|
|
onTriggered: root.refresh()
|
|
}
|
|
}
|