13 KiB
13 KiB
Tiling WM Experience Spec
This document describes the tiling window manager experience I am targeting.
Priority Levels
- Required: daily-driver behavior.
- Important: expected for parity, but a rough first version is acceptable.
- Nice: useful polish or compatibility.
Modifier Terminology
Supernames the physical modifier key often labeled Windows, Command, GUI, or OS depending on the keyboard.Hypermeans a higher-order logical modifier layer used for monitor, workspace, utility, and cross-context operations.- Prefer implementing
Hyperas its own virtual modifier or equivalent logical mask when the environment supports that. - If a dedicated virtual
Hypermask is not practical,Ctrl+Alt+Superis the fallback chord. - The fallback
Hyperchord intentionally does not includeShift; portableHyperbindings only use the plainHyperlayer and theHyper+Shiftlayer. - Do not require
Hyper+Ctrl,Hyper+Alt, orHyper+Superbindings. Those modifiers may already be part of the fallbackHyperchord. - Binding descriptions should use
SuperandHyperrather than hardware-vendor names.
Workspaces and Monitors
Required behavior:
- Workspaces are a shared global set, not independent per-monitor namespaces.
- Focusing workspace
Nshows workspaceNon the currently focused monitor. - Moving a window to workspace
Ndoes not require caring which monitor currently owns that workspace. - Sending the focused window to workspace
Nwithout following it is a first-class operation. - Moving the focused window to workspace
Nand following it is a first-class operation. - Sending the focused window to the next empty workspace without following it is a first-class operation.
- Moving the focused window to the next empty workspace and following it is a first-class operation.
- Normal workspaces are bounded to
1..9. - Workspace history is tracked per monitor.
- Last-workspace toggle uses the current monitor's workspace history.
- Workspace cycling works on the current monitor within the bounded workspace set.
Important behavior:
- Swapping the current workspace contents with another workspace is available.
- Moving a window to an empty workspace on another monitor is available.
- Moving the focused window to another monitor without following keeps keyboard focus on the original monitor.
- Moving the focused window to another monitor and following it moves keyboard focus to the destination monitor.
- Hidden/special workspaces exist for scratchpad state.
- Hidden/special workspaces exist for minimized state.
- Hidden/special workspaces are excluded from ordinary workspace cycling.
- Hidden/special workspaces are excluded from taffybar's normal workspace list.
Directional Navigation
Required behavior:
- Directional window focus is available.
- Directional window swapping or movement is available.
- Directional move-to-monitor is available while preserving useful focus.
- Directional monitor focus is available.
- Directional window movement between monitors is available.
- Moving the focused window to an empty workspace on the monitor in a direction
remains required behavior, but it should not require an extra
Hypermodifier beyondShift.
Important behavior:
- Directional focus in tabbed/fullscreen mode should cycle predictably through windows even though their screen geometry overlaps.
- Keyboard resize remains available, but it should not displace the directional move-to-monitor binding.
Layouts
Required behavior:
- Tiling is dynamic.
- Primary layout is equal-width vertical columns.
- All ordinary splits are vertical.
- Adding windows dynamically redistributes all tiled windows evenly.
- Removing windows dynamically redistributes all tiled windows evenly.
- Ordinary use should not require manually managing a split tree.
- Tabbed/fullscreen-style monocle layout is available.
- Directional window navigation bindings continue to switch windows in tabbed/fullscreen mode.
- The important layouts are columns and tabbed/fullscreen.
Important behavior:
- One-window workspaces should have no visible gaps or use smart gaps.
- Gaps are small in normal multi-window layouts.
- Dialogs float.
- Dialogs are centered.
- Layout state is per workspace when the compositor supports it.
- There is a command to jump directly to the columns layout and one to jump directly to the tabbed/fullscreen layout.
Nice behavior:
- Gaps can be toggled.
- Fullscreen can be toggled.
- Smart borders can be toggled.
- Layout-related modifiers remain available for experiments.
- Inactive windows are slightly dimmed when supported.
Overview and Discovery
Required behavior:
- There is an expose-style way to inspect open windows or workspaces before jumping.
- There is a rofi-style window picker.
- Window picker entries show icons.
- Window picker entries show titles.
- Window picker entries show workspace labels.
- Go-to-window focuses the selected window wherever it currently lives.
- Bring-window moves a selected non-visible window to the current workspace and focuses it.
- Replace-window swaps the focused window with a selected window where feasible.
Important behavior:
- Overview supports both "go" and "bring" workflows when possible.
- Window switchers hide scratchpad windows unless the user is explicitly using a scratchpad picker.
- Window switchers hide minimized windows unless the user is explicitly using a minimized picker.
- Window switchers hide internal windows.
- Go/bring actions unminimize selected windows when needed.
Scratchpads
Required behavior:
- A named scratchpad exists for element.
- A named scratchpad exists for gmail.
- A named scratchpad exists for htop.
- A named scratchpad exists for messages.
- A named scratchpad exists for slack.
- A named scratchpad exists for spotify.
- A named scratchpad exists for transmission.
- A named scratchpad exists for volume.
- Scratchpads appear near-fullscreen and centered by default.
- Toggling a scratchpad deactivates fullscreen/tabbed state first.
- Scratchpads are hidden from normal workspace and window listings.
Important behavior:
- A dropdown terminal scratchpad exists.
- Scratchpad matching handles delayed class/title assignment.
- Scratchpad behavior is robust when the app is already running.
- Scratchpad behavior is robust when the app is minimized.
- Scratchpad behavior is robust when the app is on another workspace.
Minimization
Required behavior:
- Focused window can be minimized.
- Last minimized window can be restored to the current workspace and focused.
- Minimized windows are excluded from normal layout.
- Minimized windows are excluded from ordinary go/bring lists.
Important behavior:
- A minimized picker mode exists.
- Restore-all-minimized exists.
- Other classes in the current workspace can be minimized.
- Windows of the focused class can be restored.
- All minimized windows can be restored.
Class-Aware Workflows
Important behavior:
- Gather all windows of the focused class onto the current workspace.
- Raise-or-spawn exists for the browser.
- Window menus show class.
- Window menus show title.
- Window menus show workspace.
- Window menus show icon.
Taffybar Contract
Required behavior:
- Taffybar can list normal workspaces.
- Taffybar can identify the active workspace per monitor.
- Taffybar can list windows per workspace.
- Taffybar can expose class hints for each listed window.
- Taffybar can expose title for each listed window.
- Taffybar can expose active state for each listed window.
- Taffybar can expose minimized state when available.
- Taffybar can expose urgency when available.
- Taffybar can expose approximate window position when available.
- Scratchpad workspaces are marked as special or filtered out.
- Minimized workspaces are marked as special or filtered out.
- Internal workspaces are marked as special or filtered out.
Important behavior:
- Workspace labels are stable.
- Workspace icons are stable.
- Window positioning information is available enough for workspace icon strips and future expose-like views.
- Layout information is available enough for workspace icon strips and future expose-like views.
- Layout name is exposed if practical.
- Layout state is exposed if practical.
Session and Utility Behavior
Important behavior:
- Terminal is
ghostty --gtk-single-instance=false. - Launcher is
rofi -show drun -show-icons. - Run menu is
rofi -show run. - Browser raise/spawn behavior exists.
- Border width is effectively zero.
- Taffybar can be toggled per monitor.
- Session startup integrates with the normal graphical-session target.
- Session startup integrates with any required session-specific user target.
Nice behavior:
- Wallpaper behavior remains consistent.
- Idle behavior remains consistent.
- Lock behavior remains consistent.
- Clipboard history behavior remains consistent.
- Screenshot behavior remains consistent.
- Monitor DDC/input switching remains consistent.
- Rofi utility bindings remain consistent.
- Media keys remain consistent.
Binding Appendix
Required behavior:
Hyperbindings should remain available from a single physical key where practical, even if that key emits the fallback chord internally.- Extra modifiers on
Hyperare limited toShiftfor portable bindings.
Important behavior:
Hyperutility bindings must not displace required directional monitor bindings onHyper+w/a/s/d.
Core Bindings
Required behavior:
Super+popens the application launcher.Super+Shift+popens the run menu.Super+Shift+Returnopens a terminal.Super+Tabopens the overview.Super+Shift+Tabopens the overview in bring-window mode when supported.Super+gopens the go-to-window picker.Super+bopens the bring-window picker.Super+Shift+bopens the replace-window picker.Super+\toggles to the previous workspace on the current monitor.Super+Shift+emoves the focused window to the next empty workspace and follows it. This is the target replacement for the olderSuper+Shift+hbinding.Hyper+efocuses the next empty workspace.Hyper+5swaps the current workspace with a selected workspace.Hyper+ggathers windows of the focused class onto the current workspace.
Directional Navigation Bindings
Required behavior:
Super+w/a/s/dfocuses windows directionally.Super+Shift+w/a/s/dswaps or moves the focused window directionally.Super+Ctrl+w/a/s/dmoves the focused window to the monitor in that direction while preserving useful focus.Hyper+w/a/s/dfocuses monitors directionally.Hyper+Shift+w/a/s/dswaps or moves windows between monitors directionally.- Moving the focused window to an empty workspace on the monitor in a direction
remains required behavior, but it should not require a
Hyper+Ctrlbinding. Super+zfocuses the next monitor.Super+Shift+zmoves the focused window to the next monitor.
Numbered Workspace Bindings
Required behavior:
Super+1..9focuses workspace1..9on the current monitor.Super+Shift+1..9sends the focused window to workspace1..9without following it.Super+Ctrl+1..9sends the focused window to workspace1..9and follows it.
Scratchpad Bindings
Required behavior:
Super+Alt+etoggles the element scratchpad.Super+Alt+gtoggles the gmail scratchpad.Super+Alt+htoggles the htop scratchpad.Super+Alt+mtoggles the messages scratchpad.Super+Alt+ktoggles the slack scratchpad.Super+Alt+stoggles the spotify scratchpad.Super+Alt+ttoggles the transmission scratchpad.Super+Alt+vtoggles the volume scratchpad.
Important behavior:
Super+Alt+gravetoggles the dropdown terminal scratchpad.Super+Alt+craises or starts the browser.Super+Alt+Returnenters the minimized-window picker or restores minimized windows, depending on environment support.Super+Altis reserved for app-specific raise/spawn, scratchpad, and scratchpad-adjacent bindings.
Utility Bindings
Required behavior:
Hyper+vopens clipboard history with a rofi-backed clipboard command such asgreenclip printorcliphist.Hyper+popens the password picker withrofi-pass.Hyper+hopens the screenshot tool withrofi_shutteror thegrim/slurp/swappypipeline.Hyper+copens a shell command prompt withshell_command.sh.Hyper+xopens the command picker withrofi_command.sh.Hyper+kopens the process killer withrofi_kill_process.sh.Hyper+Shift+kopens the kill-all/process-tree killer withrofi_kill_all.sh.Hyper+ropens the systemd/service menu withrofi-systemd.Hyper+slashtoggles taffybar withtoggle_taffybar.Hyper+backslashtoggles the monitor input withmpg341cx_input toggle.Hyper+iopens the audio input selector withrofi_select_input.hs.Hyper+oopens the audio output selector withrofi_paswitch.Hyper+yopens the agentic skill picker withrofi_agentic_skill.Hyper+Shift+llocks the session with the compositor/session-appropriate locker.
Important behavior:
- Wallpaper selection is available under
Hyperviarofi_wallpaper.sh, but its exact key must avoid the requiredHyper+w/a/s/ddirectional monitor bindings. - Expose-style overview remains available as a utility binding using the
compositor-appropriate implementation, such as
skippy-xdon X11 or a native compositor/plugin overview on Wayland. - Session-destructive operations use shifted or otherwise harder-to-hit variants.