227 lines
8.1 KiB
Markdown
227 lines
8.1 KiB
Markdown
|
|
# 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 `N` shows workspace `N` on the currently focused monitor.
|
||
|
|
- Moving a window to workspace `N` does not require caring which monitor
|
||
|
|
currently owns that workspace.
|
||
|
|
- Sending the focused window to workspace `N` without following it is a
|
||
|
|
first-class operation.
|
||
|
|
- Moving the focused window to workspace `N` and 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/d` focuses windows directionally.
|
||
|
|
- `Super+Shift+w/a/s/d` swaps or moves the focused window directionally.
|
||
|
|
- `Super+Ctrl+w/a/s/d` moves the focused window to the monitor in that
|
||
|
|
direction while preserving useful focus.
|
||
|
|
- `Hyper+w/a/s/d` focuses monitors directionally.
|
||
|
|
- `Hyper+Shift+w/a/s/d` swaps or moves windows between monitors directionally.
|
||
|
|
- `Hyper+Ctrl+w/a/s/d` moves 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.
|