Add the installer, uninstaller, and generated docs

This commit is contained in:
2026-09-20 00:19:38 -04:00
parent 0c422e7345
commit 3e65d176e3
100 changed files with 2585 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
o.window("^(1[p|P]assword)$", { no_screen_share = true, tag = "+floating-window" })
+16
View File
@@ -0,0 +1,16 @@
-- Battle.net launches under Proton; all its windows share class steam_app_battlenet.
-- The actual launcher: float-centered.
o.window({ class = "^steam_app_battlenet$", title = "^Battle\\.net$" }, {
float = true,
center = true,
size = { 1280, 800 },
})
-- Installer: drop decorations and backdrop blur/shadow so the Blizzard chrome
-- isn't framed by the WM.
o.window({ class = "^steam_app_battlenet$", title = "^Battle\\.net Setup$" }, {
decorate = false,
no_blur = true,
no_shadow = true,
})
+6
View File
@@ -0,0 +1,6 @@
o.window("^(Bitwarden)$", { no_screen_share = true, tag = "+floating-window" })
o.window("chrome-nngceckbapebfimnlniiiahkandclblb-Default", {
no_screen_share = true,
tag = "+floating-window",
})
+12
View File
@@ -0,0 +1,12 @@
-- Browser tags and styling.
o.window("((google-)?[cC]hrom(e|ium)|[bB]rave-browser|[mM]icrosoft-edge|Vivaldi-stable|helium)", { tag = "+chromium-based-browser" })
o.window("([fF]irefox|zen|librewolf)", { tag = "+firefox-based-browser" })
o.window({ tag = "chromium-based-browser" }, { tag = "-default-opacity", tile = true, opacity = "1.0 0.985" })
o.window({ tag = "firefox-based-browser" }, { tag = "-default-opacity", opacity = "1.0 0.985" })
-- Video apps: remove chromium browser tag so they don't get opacity applied.
o.window("(^.+-youtube\\.com__.*$|^.+-app\\.zoom\\.us__wc_home.*$)", { tag = "-chromium-based-browser" })
o.window("(^.+-youtube\\.com__.*$|^.+-app\\.zoom\\.us__wc_home.*$)", { tag = "-default-opacity" })
-- Hide screen sharing notification windows.
o.window({ title = ".*is sharing.*" }, { workspace = "special silent" })
+11
View File
@@ -0,0 +1,11 @@
-- DaVinci Resolve window focus handling. Kept fully opaque: the default
-- translucency distorts colour-critical grading work.
o.window(".*[Rr]esolve.*", {
float = true,
stay_focused = true,
tag = "-default-opacity",
opacity = "1 1",
})
o.window({ class = ".*[Rr]esolve.*", title = "^DaVinci Resolve( Studio)? - .+$" }, { fullscreen = true })
o.window({ class = ".*[Rr]esolve.*", title = "^(DaVinci Resolve( Studio)? - .+|Project Manager)$" }, { stay_focused = false })
+1
View File
@@ -0,0 +1 @@
o.window("GeForceNOW", { idle_inhibit = "fullscreen" })
+7
View File
@@ -0,0 +1,7 @@
-- Hermes Desktop's frameless HUD manages its own geometry.
o.window({ class = "^Hermes$", title = "^Hermes HUD$" }, {
tag = "-default-opacity",
float = true,
border_size = 0,
opacity = "1 1",
})
+2
View File
@@ -0,0 +1,2 @@
-- Disable mouse focus (see https://github.com/basecamp/omarchy/pull/5183#issuecomment-4189299971).
o.window("^(jetbrains-.*)$", { no_follow_mouse = true })
+3
View File
@@ -0,0 +1,3 @@
-- Float LocalSend and fzf file picker.
o.window("(Share|localsend)", { float = true, center = true })
o.window("localsend", { size = { 1100, 700 } })
+1
View File
@@ -0,0 +1 @@
o.window("com.moonlight_stream.Moonlight", { fullscreen = true, idle_inhibit = "fullscreen" })
+14
View File
@@ -0,0 +1,14 @@
-- Window and layer rules for the Blob Quickshell surfaces. The
-- shell-wide bar / menu / popouts are layer-shell.
-- Keep the bar instant: no layer-shell fade/slide animation.
hl.layer_rule({ match = { namespace = "blob-bar" }, no_anim = true, animation = "none" })
-- Launcher, image selector, emojis, clipboard overlays, and keyboard-driven
-- panels should pop without compositor layer fades. Panels keep their own
-- QML opacity transition for normal open/close, and skip it for panel handoff.
hl.layer_rule({ match = { namespace = "^(blob-menu|blob-image-selector|blob-emojis|blob-clipboard|blob-keyboard-panel)$" }, no_anim = true, animation = "none" })
-- Dev gallery is the main shell workbench; open it maximized like
-- SUPER+ALT+F so component previews have the whole workspace.
o.window({ class = "^org.quickshell$", title = "^Blob shell dev gallery$" }, { maximize = true })
+24
View File
@@ -0,0 +1,24 @@
-- Picture-in-picture overlays.
o.window({ title = "(Picture.?in.?[Pp]icture)" }, { tag = "+pip" })
o.window({ tag = "pip" }, {
tag = "-default-opacity",
float = true,
pin = true,
size = { 600, 338 },
keep_aspect_ratio = true,
border_size = 0,
opacity = "1 1",
move = { "(monitor_w-window_w-40)", "(monitor_h*0.04)" },
})
-- Google Meet PiP uses the meeting title instead of "Picture-in-Picture".
o.window({ tag = "chromium-based-browser", title = "^Meet - .+" }, {
tag = "-default-opacity",
float = true,
pin = true,
size = { 600, 338 },
keep_aspect_ratio = true,
border_size = 0,
opacity = "1 1",
move = { "(monitor_w-window_w-40)", "(monitor_h-window_h-40)" },
})
+1
View File
@@ -0,0 +1 @@
o.window("qemu", { tag = "-default-opacity", opacity = "1 1" })
+6
View File
@@ -0,0 +1,6 @@
o.window("com.libretro.RetroArch", {
fullscreen = true,
tag = "-default-opacity",
opacity = "1 1",
idle_inhibit = "fullscreen",
})
@@ -0,0 +1,2 @@
-- Remove the 1px border around the slurp region selection used by screenshots.
hl.layer_rule({ match = { namespace = "selection" }, no_anim = true, animation = "none" })
+4
View File
@@ -0,0 +1,4 @@
o.window("steam", { float = true, idle_inhibit = "fullscreen" })
o.window({ class = "steam", title = "Steam" }, { center = true, size = { 1100, 700 } })
o.window("steam.*", { tag = "-default-opacity", opacity = "1 1" })
o.window({ class = "steam", title = "Friends List" }, { size = { 460, 800 } })
+54
View File
@@ -0,0 +1,54 @@
-- Floating windows.
o.window({ tag = "floating-window" }, { float = true })
o.window({ tag = "floating-window" }, { center = true })
o.window({ tag = "floating-window" }, { size = { 875, 600 } })
o.window(
"(org.blob.btop|org.blob.terminal|org.blob.bash|org.codeberg.dnkl.foot|org.gnome.NautilusPreviewer|org.gnome.Evince|Blob|About|TUI.float|imv|mpv)",
{
tag = "+floating-window",
}
)
-- The portal only ever shows dialogs — file pickers, screen shares, permission
-- prompts — so every one of its windows belongs in the floating treatment,
-- whatever the app that asked for it titled it.
o.window("xdg-desktop-portal-gtk", { tag = "+floating-window" })
o.window({
class = "(sublime_text|DesktopEditors|org.gnome.Nautilus)",
title = "^(Open.*Files?|Open [F|f]older.*|Save.*Files?|Save.*As|Save|All Files|.*wants to [open|save].*|[C|c]hoose.*)",
}, { tag = "+floating-window" })
-- The About fastfetch layout needs more columns than the standard float provides.
-- This size only covers the first launch: blob-launch-about measures the
-- rendered content, remembers the size that hugs it, and applies that as its own
-- rule before every later launch.
o.window("org.blob.about", { float = true })
o.window("org.blob.about", { center = true })
o.window("org.blob.about", { size = { 920, 480 } })
-- Fullscreen screensaver.
o.window("org.blob.screensaver", { fullscreen = true })
o.window("org.blob.screensaver", { float = true })
o.window("org.blob.screensaver", { animation = "slide" })
-- No transparency on media windows.
o.window(
"^(zoom|vlc|mpv|org.kde.kdenlive|com.obsproject.Studio|com.github.PintaProject.Pinta|imv|org.gnome.NautilusPreviewer)$",
{
tag = "-default-opacity",
}
)
o.window(
"^(zoom|vlc|mpv|org.kde.kdenlive|com.obsproject.Studio|com.github.PintaProject.Pinta|imv|org.gnome.NautilusPreviewer)$",
{
opacity = "1 1",
}
)
-- Popped window rounding.
o.window({ tag = "pop" }, { rounding = 8 })
-- Prevent idle while open.
o.window({ tag = "noidle" }, { idle_inhibit = "always" })
+2
View File
@@ -0,0 +1,2 @@
-- Prevent Telegram from stealing focus on new messages.
o.window("org.telegram.desktop", { focus_on_activate = false })
+8
View File
@@ -0,0 +1,8 @@
-- Define terminal tag so themes and bindings can single terminals out. Blob
-- launches TUIs and its own terminal windows under dedicated app-ids
-- (org.blob.btop, org.blob.terminal, TUI.float, ...), so match those too.
-- The class is matched in full, so foot's other app-id needs spelling out.
o.window(
"(Alacritty|kitty|com.mitchellh.ghostty|foot|org\\.codeberg\\.dnkl\\.foot|wezterm|org\\.blob\\..*|TUI\\..*)",
{ tag = "+terminal" }
)
+25
View File
@@ -0,0 +1,25 @@
-- The 8:9 portrait presets scale from monitor height so they occupy the same
-- share of anything from a 1080p monitor to a scaled 6K display.
o.window("^WebcamOverlay-small$", {
size = { "(monitor_h*4/25)", "(monitor_h*9/50)" },
move = { "(monitor_w-monitor_h*4/25-40)", "(monitor_h-monitor_h*9/50-40)" },
})
o.window("^WebcamOverlay-medium$", {
size = { "(monitor_h*2/9)", "(monitor_h/4)" },
move = { "(monitor_w-monitor_h*2/9-40)", "(monitor_h-monitor_h/4-40)" },
})
o.window("^WebcamOverlay-large$", {
size = { "(monitor_h*3/10)", "(monitor_h*27/80)" },
move = { "(monitor_w-monitor_h*3/10-40)", "(monitor_h-monitor_h*27/80-40)" },
})
-- The dedicated app id keeps this out of mpv's generic centered floating rules,
-- so the camera appears at its final corner position.
o.window({ class = "^WebcamOverlay-(small|medium|large)$", title = "^WebcamOverlay$" }, {
tag = "-default-opacity",
float = true,
pin = true,
no_initial_focus = true,
no_dim = true,
opacity = "1 1",
})