Files
community-plugins/hypr-layout-switcher/service.luau
T
felis 86ff7b83c2
Jobs to run on push to main / update-catalog (push) Canceled after 0s
Jobs to run on push to main / update-issue-templates (push) Canceled after 0s
Validate Plugin Manifests / validate (push) Canceled after 0s
add stage type
2026-08-13 20:55:58 -07:00

65 lines
1.4 KiB
Luau

--!nonstrict
local layouts = { "dwindle", "master", "stage" }
noctalia.setUpdateInterval(1000)
local lastLayout = nil
local function setLayoutCmd(layout)
local lua = string.format(
"local w = hl.get_active_special_workspace() or hl.get_active_workspace(); "
.. "if w then if w.special then hl.workspace_rule({workspace = tostring(w.name), layout = %q}) "
.. "else hl.workspace_rule({workspace = tostring(w.id), layout = %q}) end end",
layout, layout
)
return "hyprctl eval '" .. lua:gsub("'", "'\\''") .. "'"
end
local function poll()
if not noctalia.commandExists("hyprctl") then
return
end
noctalia.runAsync("hyprctl activeworkspace -j", function(result)
if result.exitCode ~= 0 then
return
end
local data = noctalia.json.decode(result.stdout)
if data == nil then
return
end
local layout = data.tiledLayout
if layout and layout ~= lastLayout then
lastLayout = layout
noctalia.state.set("layout", layout)
end
end)
end
local function cycle()
local idx = 1
for i, l in ipairs(layouts) do
if l == lastLayout then
idx = (i % #layouts) + 1
break
end
end
local nextLayout = layouts[idx]
noctalia.runAsync(setLayoutCmd(nextLayout))
lastLayout = nextLayout
noctalia.state.set("layout", nextLayout)
end
function onIpc(event)
if event == "cycle" then
cycle()
end
end
function update()
poll()
end
poll()