Feature and support matrix
What works on which backend. Honest and narrow claims.
For the long-form status write-up, see Feature status and limitations.
Backend summary
| Backend | Mode | Tested |
|---|---|---|
headless |
Deterministic in-process runtime, no display | Heavily tested (unit + integration) |
winit |
Nested compositor in a window | Heavily tested (unit + live smoke) |
udev |
Standalone tty/DRM compositor | Tested (unit + virt harness), still experimental |
Feature matrix
| Feature | headless | winit | udev/tty |
|---|---|---|---|
| Canvas / viewport logic | ✅ | ✅ | ✅ |
| Focus stack | ✅ | ✅ | ✅ |
| Window model + rules | ✅ | ✅ | ✅ |
| Placement fallback | ✅ | ✅ | ✅ |
| Move / resize commands | ✅ | ✅ | ✅ |
| Key bindings | ✅ | ✅ | ✅ |
| Lua config loading | ✅ | ✅ | ✅ |
| Lua hooks (headless) | ✅ | — | — |
| Lua hooks (live) | — | ✅ | ✅ |
| Runtime snapshot (IPC) | ✅ | ✅ | ✅ |
| Interactive move/resize | — | ✅ | ✅ |
| Gesture hooks | — | ✅ | ✅ |
| Draw hooks | — | ✅ | ✅ |
| Pointer zoom (Super+scroll) | — | ✅ | ✅ |
| Middle-click pan | — | ✅ | ✅ |
| Trackpad swipe/pinch nav | — | ✅ | ✅ |
| XDG shell (xdg-toplevel) | — | ✅ | ✅ |
| XDG popups | — | ✅ | ✅ |
| Layer-shell (wlr-layer-shell) | — | ✅ | ⚠️ maps, not rendered |
| XDG decoration negotiation | — | ✅ | ✅ |
| Output management (wlr-output-management) | — | ⚠️ position-only | ⚠️ position-only |
| XWayland | — | ✅ | ✅ |
| Clipboard / data device | — | ✅ | ✅ |
| Primary selection | — | ✅ | ✅ |
| DnD (compositor-originated) | — | ❌ | ❌ |
| Session lock | — | ✅ | ✅ |
| Idle inhibit | — | ✅ | ✅ |
| IPC screenshot | — | ✅ (PPM) | ❌ |
| Multi-output | — | ✅ | ⚠️ narrow contract |
| Output hotplug | — | ⚠️ basic | ⚠️ basic |
| VT switching | — | — | ✅ |
| TTY session state machine | — | — | ✅ |
| Tap-to-click / natural scroll | — | — | ✅ |
Legend
- ✅ — proven, tested, claimed
- ⚠️ — partially supported, narrow scope, or backend-qualified (read the caveats)
- ❌ — not yet supported
- — — not applicable
Feature caveats (backend-qualified)
Layer-shell on tty
Layer-shell clients map and participate in session artifacts (event log, IPC snapshots), but the tty (udev) render path does not yet visually render wlr-layer-shell surfaces. The panel probe proves protocol/lifecycle correctness, not visual rendering. The winit backend renders layer-shell surfaces normally.
Output management
Only position changes and head enable/disable are currently supported. Mode, custom mode, transform, and scale changes are rejected. Multi-output behavior follows a narrow explicit contract; broad hotplug coverage is still pending.
TTY multi-output
Startup with multiple outputs builds a deterministic layout from
tty.output_layout. Pointer crossing and output lookup follow that layout.
Output removal prunes stale state. Broad real-hardware multi-output confidence
is still pending.
Pointer zoom / middle-click pan / gesture nav
Rust directly applies built-in canvas behavior. Lua config can enable/disable via boolean flags but cannot repurpose the input for other behaviors. A known design limitation.
See also
- Feature status and limitations — full write-up
- Contributor validation matrix — what to test
- Lua API cheat sheet — API reference
evil wiki
- Home
- Getting started
- Architecture and philosophy
- Configuration guide
- Writing your first config
- Lua basics for evil users
- Lua API guide
- Lua API cheat sheet
- Hooks guide
- Hook payload summary
- Queries, commands, and actions
- Drawing and visuals
- Example configs overview
- Example shared helpers and rules
- IPC protocol
- Testing and debugging
- Contributor validation matrix
- Feature status and limitations
- Feature and support matrix
- Recipes