feat(hyprland): route apps through special workspaces

This commit is contained in:
2026-09-07 14:27:58 +02:00
parent 1f69906bc5
commit 3e12379694
@@ -113,7 +113,8 @@ for _, direction in ipairs({ "left", "down", "up", "right" }) do
hl.bind(main_mod .. " + " .. direction, hl.dsp.focus({ direction = direction }))
end
for key, direction in pairs({ H = "l", J = "d", K = "u", L = "r", LEFT = "l", DOWN = "d", UP = "u", RIGHT = "r" }) do
-- Super+Shift+K is reserved for Obsidian; Super+Shift+Up still moves windows up.
for key, direction in pairs({ H = "l", J = "d", L = "r", LEFT = "l", DOWN = "d", UP = "u", RIGHT = "r" }) do
hl.bind(main_mod .. " + SHIFT + " .. key, hl.dsp.window.move({ direction = direction }))
end
@@ -133,6 +134,9 @@ hl.bind(main_mod .. " + CTRL + LEFT", hl.dsp.focus({ workspace = "-1" }))
-- Hyprland special workspaces are the Wayland analogue of the i3 scratchpad.
hl.bind(main_mod .. " + MINUS", hl.dsp.workspace.toggle_special("scratchpad"))
hl.bind(main_mod .. " + SHIFT + MINUS", hl.dsp.window.move({ workspace = "special:scratchpad" }))
hl.bind(main_mod .. " + SHIFT + S", hl.dsp.workspace.toggle_special("spotify"))
hl.bind(main_mod .. " + SHIFT + M", hl.dsp.workspace.toggle_special("mail"))
hl.bind(main_mod .. " + SHIFT + K", hl.dsp.workspace.toggle_special("obsidian"))
-- Keep the i3 floating and fullscreen shortcuts. Layout-specific binds are deferred.
hl.bind(main_mod .. " + F", hl.dsp.window.fullscreen({ action = "toggle" }))
@@ -150,8 +154,8 @@ local function float_rule(name, match, border_size)
})
end
hl.window_rule({ name = "obsidian-workspace", match = { class = "^obsidian$" }, workspace = "8" })
hl.window_rule({ name = "thunderbird-workspace", match = { class = "^Thunderbird$" }, workspace = "9" })
hl.window_rule({ name = "obsidian-workspace", match = { class = "^obsidian$" }, workspace = "special:obsidian silent", no_initial_focus = true })
hl.window_rule({ name = "thunderbird-mail", match = { class = "^(Thunderbird|thunderbird)$" }, workspace = "special:mail silent", no_initial_focus = true })
float_rule("pi-status-ui", { class = "^(pi-status-ui|Pi-status-ui)$" }, 1)
float_rule("alsamixer", { title = "^alsamixer$" }, 1)
float_rule("qalculate", { title = "^Qalculate!$" })
@@ -162,8 +166,8 @@ float_rule("volume-control", { title = "^Volume Control$" })
float_rule("virtualbox", { class = ".*VirtualBox.*" })
hl.window_rule({ name = "virtualbox-manager-tiles", match = { class = ".*VirtualBox Manager.*" }, tile = true })
hl.window_rule({ name = "virtualbox-machine-tiles", match = { class = ".*VirtualBox Machine.*" }, tile = true })
-- Send music clients to the existing scratchpad without stealing startup focus.
hl.window_rule({ name = "spotify-music", match = { class = "^Spotify$" }, workspace = "special:scratchpad silent", no_initial_focus = true })
-- Send music clients to hidden workspaces without stealing startup focus.
hl.window_rule({ name = "spotify-music", match = { class = "^Spotify$" }, workspace = "special:spotify silent", no_initial_focus = true })
hl.window_rule({ name = "deezer-music", match = { class = "^Deezer$" }, workspace = "special:scratchpad silent", no_initial_focus = true })
hl.on("hyprland.start", function()