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 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)