- 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
61 lines
1.6 KiB
TypeScript
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>
|
|
)
|
|
}
|