Extract stats and clipboard helpers

This commit is contained in:
David Heinemeier Hansson
2026-05-21 11:58:43 +02:00
parent 8734464439
commit 4cd23d9584
7 changed files with 109 additions and 56 deletions
+1
View File
@@ -35,6 +35,7 @@ GROUP_DESCRIPTIONS[branding]="About and screensaver branding"
GROUP_DESCRIPTIONS[brightness]="Display and keyboard brightness"
GROUP_DESCRIPTIONS[capture]="Screenshots and screen recording"
GROUP_DESCRIPTIONS[channel]="Omarchy release channel management"
GROUP_DESCRIPTIONS[clipboard]="Clipboard helpers"
GROUP_DESCRIPTIONS[cmd]="Command and shortcut helpers"
GROUP_DESCRIPTIONS[config]="System configuration helpers"
GROUP_DESCRIPTIONS[debug]="Diagnostics and support logs"
+20
View File
@@ -0,0 +1,20 @@
#!/bin/bash
# omarchy:summary=Copy a file to the clipboard and paste it
# omarchy:group=clipboard
# omarchy:args=<mime-type> <path>
# omarchy:examples=omarchy clipboard paste file image/png /tmp/screenshot.png
mime=${1:-}
path=${2:-}
if [[ -z $mime || -z $path ]]; then
echo "Usage: omarchy-clipboard-paste-file <mime-type> <path>" >&2
exit 1
fi
[[ -r $path ]] || exit 1
wl-copy --type "$mime" < "$path"
sleep 0.15
wtype -M shift -k Insert -m shift 2>/dev/null || true
+25
View File
@@ -0,0 +1,25 @@
#!/bin/bash
# omarchy:summary=Copy text to the clipboard and type or paste it
# omarchy:group=clipboard
# omarchy:args=[--shift-insert] <text>
# omarchy:examples=omarchy clipboard paste text "hello" | omarchy clipboard paste text --shift-insert "hello"
use_shift_insert=false
if [[ ${1:-} == "--shift-insert" ]]; then
use_shift_insert=true
shift
fi
text=${1:-}
[[ -n $text ]] || exit
printf '%s' "$text" | wl-copy
sleep 0.15
if [[ $use_shift_insert == "true" ]]; then
wtype -M shift -k Insert -m shift 2>/dev/null || true
else
wtype "$text" 2>/dev/null || true
fi
+35
View File
@@ -2,6 +2,41 @@
# omarchy:summary=Print CPU and memory stats for the shell
# omarchy:group=system
# omarchy:args=[--bar-widget]
bar_widget_stats() {
awk '
NR == 1 {
idle = $5
total = 0
for (i = 2; i <= NF; i++) total += $i
printf "cpu\t%s\t%s\n", idle, total
}
' /proc/stat
awk '
/^MemTotal:/ { total = $2 }
/^MemAvailable:/ { avail = $2 }
END {
if (total > 0) printf "memory\t%.2f\n", ((total - avail) / total) * 100
}
' /proc/meminfo
awk '{ print "load\t" $1 }' /proc/loadavg
}
case "${1:-}" in
"")
;;
--bar-widget)
bar_widget_stats
exit
;;
*)
echo "Usage: omarchy-system-stats [--bar-widget]" >&2
exit 1
;;
esac
cpu=$(top -bn1 | awk '/^%?Cpu/ {
gsub(/,/, "")
+25 -52
View File
@@ -24,9 +24,7 @@ BarWidget {
readonly property int historyLimit: 30
function refresh() {
if (!cpuProc.running) cpuProc.running = true
if (!memProc.running) memProc.running = true
if (!loadProc.running) loadProc.running = true
if (!statsProc.running) statsProc.running = true
}
function pushHistory(arr, value) {
@@ -36,20 +34,9 @@ BarWidget {
return next
}
function updateCpu(raw) {
var fields = String(raw || "").trim().split(/\s+/)
if (fields.length < 8) return
var user = parseInt(fields[1], 10) || 0
var nice = parseInt(fields[2], 10) || 0
var sys = parseInt(fields[3], 10) || 0
var idle = parseInt(fields[4], 10) || 0
var iowait = parseInt(fields[5], 10) || 0
var irq = parseInt(fields[6], 10) || 0
var softirq = parseInt(fields[7], 10) || 0
var total = user + nice + sys + idle + iowait + irq + softirq
var totalDiff = total - prevCpu.total
function updateCpuTotals(idle, total) {
var idleDiff = idle - prevCpu.idle
var totalDiff = total - prevCpu.total
if (prevCpu.total > 0 && totalDiff > 0) {
var usage = (1 - idleDiff / totalDiff) * 100
@@ -60,52 +47,38 @@ BarWidget {
prevCpu = { idle: idle, total: total }
}
function updateMem(raw) {
var lines = String(raw || "").split("\n")
var total = 0
var available = 0
for (var i = 0; i < lines.length; i++) {
var line = lines[i]
if (line.indexOf("MemTotal:") === 0) total = parseInt(line.replace(/[^0-9]/g, ""), 10) || 0
else if (line.indexOf("MemAvailable:") === 0) available = parseInt(line.replace(/[^0-9]/g, ""), 10) || 0
}
if (total > 0) {
memPercent = ((total - available) / total) * 100
memHistory = pushHistory(memHistory, memPercent)
}
}
function updateLoad(raw) {
var n = parseFloat(String(raw || "").trim().split(/\s+/)[0])
if (!isNaN(n)) loadAvg = n
}
function updateStats(raw) {
var lines = String(raw || "").split("\n")
for (var i = 0; i < lines.length; i++) {
var parts = lines[i].trim().split("\t")
if (parts.length < 2) continue
if (parts[0] === "cpu") updateCpuTotals(parseInt(parts[1], 10) || 0, parseInt(parts[2], 10) || 0)
else if (parts[0] === "memory") updateMemPercent(parts[1])
else if (parts[0] === "load") updateLoad(parts[1])
}
}
function updateMemPercent(raw) {
var n = parseFloat(String(raw || "").trim())
if (!isNaN(n)) {
memPercent = Math.max(0, Math.min(100, n))
memHistory = pushHistory(memHistory, memPercent)
}
}
Component.onCompleted: refresh()
Process {
id: cpuProc
command: ["bash", "-lc", "head -n1 /proc/stat"]
id: statsProc
command: [root.bar ? root.bar.omarchyPath + "/bin/omarchy-system-stats" : "omarchy-system-stats", "--bar-widget"]
stdout: StdioCollector {
waitForEnd: true
onStreamFinished: root.updateCpu(text)
}
}
Process {
id: memProc
command: ["bash", "-lc", "head -n3 /proc/meminfo"]
stdout: StdioCollector {
waitForEnd: true
onStreamFinished: root.updateMem(text)
}
}
Process {
id: loadProc
command: ["bash", "-lc", "cat /proc/loadavg"]
stdout: StdioCollector {
waitForEnd: true
onStreamFinished: root.updateLoad(text)
onStreamFinished: root.updateStats(text)
}
}
+2 -2
View File
@@ -189,9 +189,9 @@ Item {
if (!row) return
root.opened = false
if (row.entryType === "image") {
Quickshell.execDetached(["bash", "-lc", "wl-copy --type " + Util.shellQuote(row.mime) + " < " + Util.shellQuote(row.path) + "; sleep 0.15; wtype -M shift -k Insert -m shift 2>/dev/null || true"])
Quickshell.execDetached([root.omarchyPath + "/bin/omarchy-clipboard-paste-file", row.mime, row.path])
} else if (row.fullText) {
Quickshell.execDetached(["bash", "-lc", "printf %s " + Util.shellQuote(row.fullText) + " | wl-copy; sleep 0.15; wtype -M shift -k Insert -m shift 2>/dev/null || true"])
Quickshell.execDetached([root.omarchyPath + "/bin/omarchy-clipboard-paste-text", "--shift-insert", row.fullText])
}
}
+1 -2
View File
@@ -159,8 +159,7 @@ Item {
function applySelected(emoji) {
if (!emoji) return
root.dismiss()
var escEmoji = emoji.replace(/'/g, "'\\''")
Quickshell.execDetached(["bash", "-lc", "wl-copy '" + escEmoji + "'; sleep 0.15; wtype '" + escEmoji + "' 2>/dev/null || true"])
Quickshell.execDetached([root.omarchyPath + "/bin/omarchy-clipboard-paste-text", emoji])
}
ListModel { id: displayModel }