Files
dotfiles/.local/share/noctalia/plugins/system-status/inhibitors-panel.luau
T

86 lines
2.5 KiB
Lua

-- Click-through details for both logind idle inhibitors and session
-- ScreenSaver requests such as browser video wake locks.
local command = (noctalia.getenv("HOME") or "") .. "/.local/bin/idle-inhibitor-monitor --list"
local inhibitors = {}
local status = "Loading idle inhibitors…"
local request_in_flight = false
local function renderPanel()
local children = {
ui.column({ gap = 2 }, {
ui.label({ text = "Idle inhibitors", fontSize = 18, fontWeight = "bold" }),
ui.label({ text = status, color = "on_surface_variant" }),
}),
ui.button({ text = "Refresh", onClick = "onRefresh" }),
}
if #inhibitors == 0 then
table.insert(children, ui.label({ text = "No process currently blocks automatic idle." }))
else
for _, inhibitor in ipairs(inhibitors) do
local title = inhibitor.comm ~= "" and inhibitor.comm or inhibitor.who
table.insert(children, ui.column({ gap = 2 }, {
ui.label({ text = string.format("%s · %s", inhibitor.source, title), fontWeight = "bold" }),
ui.label({ text = inhibitor.why ~= "" and inhibitor.why or "No reason supplied", maxLines = 2 }),
ui.label({
text = string.format("%s · %s · PID %s", inhibitor.mode, inhibitor.user, inhibitor.pid),
color = "on_surface_variant",
fontSize = 11,
}),
}))
end
end
panel.render(ui.scroll({ padding = 20, gap = 12 }, children))
end
local function refreshInhibitors()
if request_in_flight then return end
request_in_flight = true
status = "Loading idle inhibitors…"
renderPanel()
noctalia.runAsync(command, function(result)
request_in_flight = false
inhibitors = {}
if result.exitCode ~= 0 then
status = "Unable to inspect logind inhibitors."
renderPanel()
return
end
for line in string.gmatch(result.stdout, "[^\r\n]+") do
local source, who, user, pid, comm, mode, why = string.match(
line,
"^([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t(.*)$"
)
if source ~= nil then
table.insert(inhibitors, {
source = source,
who = who,
user = user,
pid = pid,
comm = comm,
mode = mode,
why = why,
})
end
end
status = #inhibitors == 0
and "Automatic idle is eligible."
or string.format("%d active idle inhibitor%s.", #inhibitors, #inhibitors == 1 and "" or "s")
renderPanel()
end)
end
function onOpen()
refreshInhibitors()
end
function onRefresh()
refreshInhibitors()
end