44 lines
1.2 KiB
Lua
44 lines
1.2 KiB
Lua
-- Read the tiny kernel meminfo pseudo-file every five seconds. This avoids a
|
|
-- resident helper process and reuses Noctalia's lightweight widget lifecycle.
|
|
local command = [[awk '
|
|
$1 == "MemTotal:" { total = $2 }
|
|
$1 == "MemAvailable:" { available = $2 }
|
|
$1 == "SwapTotal:" { swap_total = $2 }
|
|
$1 == "SwapFree:" { swap_free = $2 }
|
|
END {
|
|
if (!total || !available) exit 1
|
|
used = total - available
|
|
if (swap_total > 0) {
|
|
swap_used = (swap_total - swap_free) * 100 / swap_total
|
|
printf "RAM %.1f/%.1f GiB S %.0f%%\n", used / 1048576, total / 1048576, swap_used
|
|
} else {
|
|
printf "RAM %.1f/%.1f GiB S —\n", used / 1048576, total / 1048576
|
|
}
|
|
}' /proc/meminfo]]
|
|
|
|
local request_in_flight = false
|
|
|
|
function update()
|
|
noctalia.setUpdateInterval(5000)
|
|
|
|
if request_in_flight then
|
|
return
|
|
end
|
|
|
|
request_in_flight = true
|
|
noctalia.runAsync(command, function(result)
|
|
request_in_flight = false
|
|
|
|
if result.exitCode ~= 0 then
|
|
barWidget.setText("RAM —")
|
|
barWidget.setTooltip("Unable to read /proc/meminfo")
|
|
return
|
|
end
|
|
|
|
local text = string.gsub(result.stdout, "%s+$", "")
|
|
barWidget.setGlyph("memory")
|
|
barWidget.setText(text)
|
|
barWidget.setTooltip("RAM used / total · S = swap used")
|
|
end)
|
|
end
|