Files
dotfiles/.config/hypr/workspaces.lua
T
2026-09-30 17:25:03 +01:00

134 lines
4.1 KiB
Lua

local workspace_map = {
'Home',
'Dev',
'Art',
'Gaming',
'Writing',
}
local function setup_monitors()
toggle_laptop_monitor()
local monitors = hl.get_monitors()
local monitor_count = #monitors
for i = 1, #workspace_map do
for j = monitor_count, 1, -1 do
local monitor = monitors[j]
local workspace_name = workspace_map[i] .. '_' .. j
hl.workspace_rule {
workspace = 'name:' .. workspace_name,
monitor = monitor.name,
default = i == 1,
}
-- Move to a workspace with SUPER + [1-5]
hl.bind(
'SUPER + code:1' .. (i - 1),
hl.dsp.focus { workspace = 'name:' .. workspace_name },
{ description = 'Switch to workspace ' .. workspace_map[i] }
)
end
-- Move active window to a workspace with SUPER + SHIFT + [1-5]
hl.bind('SUPER + SHIFT + code:1' .. (i - 1), function()
notify('Moving', 2000)
local active_window = hl.get_active_window()
if active_window then
local active_workspace = active_window.workspace
if active_workspace then
local active_workspace_name = active_workspace.name
local monitor_suffix = active_workspace_name:match '_(%d+)$'
or '1'
local new_workspace = 'name:'
.. workspace_map[i]
.. '_'
.. monitor_suffix
hl.dispatch(hl.dsp.window.move {
workspace = new_workspace,
window = active_window,
follow = false,
})
end
end
end, {
description = 'Move window to workspace ' .. workspace_map[i],
})
end
-- When removing a monitor move all windows to existing monitors
local windows = hl.get_windows()
for i = 1, #windows do
local window = windows[i]
if window and window.workspace then
local workspace_name = window.workspace.name
local monitor_suffix = workspace_name:match '_(%d+)$' or '0'
if tonumber(monitor_suffix) > monitor_count then
local new_workspace = 'name:'
.. workspace_name:match '^%w+'
.. '_1'
hl.dispatch(hl.dsp.window.move {
workspace = new_workspace,
window = window,
follow = false,
})
end
end
end
end
hl.on('monitor.added', setup_monitors)
hl.on('monitor.removed', setup_monitors)
hl.on('config.reloaded', setup_monitors)
hl.bind('switch:off:Lid Switch', setup_monitors)
hl.bind('switch:on:Lid Switch', setup_monitors)
local function set_laptop_workspaces_to_monocle()
local workspaces = hl.get_workspaces()
for i = 1, #workspaces do
local workspace = workspaces[i]
if
not workspace.special
and workspace.monitor
and workspace.monitor.description == LAPTOP_MONITOR_NAME
then
hl.workspace_rule {
workspace = 'name:' .. tostring(workspace.name),
layout = 'monocle',
}
end
end
end
hl.on('monitor.focused', set_laptop_workspaces_to_monocle)
hl.on('config.reloaded', set_laptop_workspaces_to_monocle)
hl.on('window.open', function()
local windows = hl.get_windows()
for i = 1, #windows do
local win = windows[i]
if win.workspace.id > 0 then
hl.dispatch(hl.dsp.window.move { workspace = 'name:Home_1' })
end
end
end)
hl.on('workspace.active', function()
local monitors = hl.get_monitors()
local monitor_count = #monitors
local workspace = get_active_workspace()
if workspace and workspace.id > 0 then
for j = monitor_count, 1, -1 do
local monitor = monitors[j]
hl.dsp.focus { workspace = 'name:Home_' .. j }
end
end
end)