8.1 KiB
8.1 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.
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:
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.Hyper+Ctrl+w/a/s/dmoves the focused window to an empty workspace on the monitor in that direction.
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.