diff --git a/ags-v3/widget/modules/Battery.tsx b/ags-v3/widget/modules/Battery.tsx
index c874541..1654564 100644
--- a/ags-v3/widget/modules/Battery.tsx
+++ b/ags-v3/widget/modules/Battery.tsx
@@ -1,29 +1,38 @@
import AstalBattery from "gi://AstalBattery"
-import { createBinding } from "ags"
+import { createBinding, createDerivedBinding } from "ags"
export default function Battery() {
const bat = AstalBattery.get_default()
- const text = createBinding(bat, "percentage")((p: number) => {
- const pct = Math.round(p * 100)
- let icon = ""
- if (bat.charging) icon = ""
- else if (pct > 90) icon = ""
- else if (pct > 70) icon = ""
- else if (pct > 50) icon = ""
- else if (pct > 30) icon = ""
- else if (pct > 10) icon = ""
- else icon = ""
- return `${icon} ${pct}%`
- })
+ const percentage = createBinding(bat, "percentage")
+ const charging = createBinding(bat, "charging")
- const cls = createBinding(bat, "percentage")((p: number) => {
- const pct = Math.round(p * 100)
- if (bat.charging) return "battery charging"
- if (pct <= 10) return "battery low"
- if (pct <= 20) return "battery warning"
- return "battery"
- })
+ const text = createDerivedBinding(
+ [percentage, charging],
+ (p: number, isCharging: boolean) => {
+ const pct = Math.round(p * 100)
+ let icon = ""
+ if (isCharging) icon = ""
+ else if (pct > 90) icon = ""
+ else if (pct > 70) icon = ""
+ else if (pct > 50) icon = ""
+ else if (pct > 30) icon = ""
+ else if (pct > 10) icon = ""
+ else icon = ""
+ return `${icon} ${pct}%`
+ },
+ )
+
+ const cls = createDerivedBinding(
+ [percentage, charging],
+ (p: number, isCharging: boolean) => {
+ const pct = Math.round(p * 100)
+ if (isCharging) return "battery charging"
+ if (pct <= 10) return "battery low"
+ if (pct <= 20) return "battery warning"
+ return "battery"
+ },
+ )
return
}
diff --git a/ags-v3/widget/modules/Prompt.tsx b/ags-v3/widget/modules/Prompt.tsx
index 9c5eafc..770d4ef 100644
--- a/ags-v3/widget/modules/Prompt.tsx
+++ b/ags-v3/widget/modules/Prompt.tsx
@@ -1,6 +1,9 @@
+import GLib from "gi://GLib"
import { createPoll } from "ags/time"
export default function Prompt() {
+ const username = GLib.get_user_name() || "user"
+
const cursor = createPoll("_", 600, () => {
// alternate between _ and empty to create blink
return Date.now() % 1200 < 600 ? "_" : " "
@@ -8,7 +11,7 @@ export default function Prompt() {
return (
-
+
)
diff --git a/ags-v3/widget/modules/SystemStats.tsx b/ags-v3/widget/modules/SystemStats.tsx
index 4fcaf9b..b6c454d 100644
--- a/ags-v3/widget/modules/SystemStats.tsx
+++ b/ags-v3/widget/modules/SystemStats.tsx
@@ -1,21 +1,50 @@
+import GLib from "gi://GLib"
import { createPoll } from "ags/time"
-import { exec } from "ags/process"
+
+function readProc(path: string): string | null {
+ try {
+ const [ok, contents] = GLib.file_get_contents(path)
+ if (ok && contents) return new TextDecoder().decode(contents)
+ } catch {}
+ return null
+}
+
+let prevIdle = 0
+let prevTotal = 0
function getCpuUsage(): string {
- try {
- const out = exec("bash -c \"top -bn1 | grep 'Cpu(s)' | awk '{print 100 - $8}'\"")
- return `${Math.round(parseFloat(out))}`
- } catch {
- return "?"
- }
+ const content = readProc("/proc/stat")
+ if (!content) return "?"
+
+ const line = content.split("\n")[0] // "cpu user nice system idle ..."
+ const parts = line.split(/\s+/).slice(1).map(Number)
+ const idle = parts[3] + parts[4] // idle + iowait
+ const total = parts.reduce((a, b) => a + b, 0)
+
+ const dIdle = idle - prevIdle
+ const dTotal = total - prevTotal
+ prevIdle = idle
+ prevTotal = total
+
+ if (dTotal === 0) return "0"
+ return `${Math.round(((dTotal - dIdle) / dTotal) * 100)}`
}
function getRamUsage(): string {
- try {
- return exec("bash -c \"free | awk '/Mem:/ {printf \\\"%.0f\\\", $3/$2 * 100}'\"")
- } catch {
- return "?"
+ const content = readProc("/proc/meminfo")
+ if (!content) return "?"
+
+ const lines = content.split("\n")
+ let total = 0, available = 0
+
+ for (const line of lines) {
+ if (line.startsWith("MemTotal:")) total = parseInt(line.split(/\s+/)[1])
+ if (line.startsWith("MemAvailable:")) available = parseInt(line.split(/\s+/)[1])
+ if (total && available) break
}
+
+ if (!total) return "?"
+ return `${Math.round(((total - available) / total) * 100)}`
}
export default function SystemStats() {
diff --git a/autostart/ghost-shell.desktop b/autostart/ghost-shell.desktop
index d154899..18004c4 100644
--- a/autostart/ghost-shell.desktop
+++ b/autostart/ghost-shell.desktop
@@ -2,5 +2,5 @@
Type=Application
Name=Ghost Shell
Comment=violet-chaton v2 AGS statusbar
-Exec=ags run -d /home/tetardtek/.config/ags-v3 -g 3
+Exec=sh -c "ags run -d $HOME/.config/ags-v3 -g 3"
X-GNOME-Autostart-enabled=true