Files
dotfiles-violet-chaton/ags-v3/widget/modules/SystemStats.tsx
Tetardtek 51b725e1f7 fix(ags-v3): nice-to-have — portabilité, perf, réactivité
- Prompt.tsx: GLib.get_user_name() au lieu de hardcode "tetardtek"
- ghost-shell.desktop: $HOME au lieu de chemin absolu
- SystemStats.tsx: lecture /proc/stat + /proc/meminfo (zero fork, économie batterie)
- Battery.tsx: createDerivedBinding percentage+charging — réactif sur branchement
2026-03-26 09:13:36 +01:00

61 lines
1.6 KiB
TypeScript

import GLib from "gi://GLib"
import { createPoll } from "ags/time"
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 {
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 {
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() {
const cpu = createPoll("0", 3000, () => getCpuUsage())
const ram = createPoll("0", 5000, () => getRamUsage())
return (
<box>
<label class="cpu module" label={cpu((v: string) => ` ${v}%`)} />
<label class="ram module" label={ram((v: string) => `󰍛 ${v}%`)} />
</box>
)
}