Tiling#
Tiling window managers arrange windows in a non-overlapping layout, driven by keyboard. The operator picks one for three reasons: keyboard-only workflow leaves no mouse-driven artifact in screen recordings, layouts are reproducible across hosts, and configuration is text the operator versions and ports.
The tiling ecosystem splits along display server (X11 vs Wayland)
and dynamic-vs-manual layout. Dynamic WMs (dwm, awesome,
xmonad) compute layouts; manual WMs (i3, sway) let the
operator place each window deliberately. Hyprland and River are
newer wlroots compositors with rich animations and IPC.
WM |
Server |
Style |
Notes |
|---|---|---|---|
|
X11 |
Manual |
The keyboard-centric default. Stable, well-documented. |
|
Wayland |
Manual |
Drop-in replacement for |
|
X11 |
Dynamic |
suckless. Configured by editing C and recompiling. |
|
X11 |
Dynamic |
Configured in Lua. Wide widget ecosystem. |
|
X11 |
Dynamic |
Configured in Haskell. Best when the operator writes Haskell. |
|
X11 |
Binary tree |
Layouts as binary trees. Driven by external scripts via |
|
X11 / Wayland |
Dynamic |
Configured in Python. |
|
Wayland |
Manual |
wlroots; rich animations and per-monitor workspaces. |
|
Wayland |
Dynamic |
wlroots; layout generators as separate processes. |
|
Wayland |
Scrollable |
Infinite horizontal workspace; no traditional tiling. |
Tools#
i3#
$ i3-msg workspace 2
$ i3-msg [class="Firefox"] focus
$ i3-msg restart # reload after config edit
sway#
Same protocol as i3, plus Wayland-specific extensions.
$ swaymsg workspace 2
$ swaymsg -t get_tree | jq '..|.name? // empty'
$ swaymsg reload
hyprland#
$ hyprctl workspaces
$ hyprctl activewindow
$ hyprctl reload
dwm#
Configuration is config.h. Recompile to apply.
$ sudo make clean install # in the dwm source tree
Files#
Configuration#
Path |
Purpose |
|---|---|
|
|
|
|
|
Hyprland config. |
|
|
|
|
|
|
Common Tasks#
Identify the running tiler.
$ wmctrl -m # X11
$ pgrep -af 'sway|hyprland|river|niri|dwm|i3|bspwm|awesome|xmonad|qtile'
Reload config without restarting the session.
$ swaymsg reload # sway
$ hyprctl reload # hyprland
$ i3-msg reload # i3
$ bspc wm -r # bspwm
References#
man 1 i3,man 1 sway,man 1 hyprland,man 5 sway,man 1 dwm,man 1 bspwm.Tasks for session battle drills.