diff --git a/design/display-management.md b/design/display-management.md index 58a14f3..6e2a5e0 100644 --- a/design/display-management.md +++ b/design/display-management.md @@ -277,7 +277,11 @@ plumbing) does not. Concretely per backend, "the display survives" means: - **gamescope (managed)**: the policy duration replaces the hardcoded 5 s `RESTORE_DEBOUNCE` — the warm Steam session stays up for the window; `forever` means the TV session is never auto-restored (release via console/tray). -- **Windows**: the existing linger, plus `forever` = the new `Pinned` state. +- **Windows**: the existing linger, plus `forever` = the `Pinned` state — **shipped** (`ccbd7e8`, + `MgrState::Pinned`; compile-verified on `.173`, on-glass Windows Pinned pending). Freed via + `POST /display/release` (`force_release` handles Pinned) — the §8 escape hatch. `gaming-rig` (the + `forever` preset) is no longer mgmt-rejected and is enabled in the console; **on-glass validated on + Linux** (`.116` KWin: normal disconnect → `pinned`, no expiry; Release frees it). **Rules.** - Input devices (uinput pads, libei/EIS contexts) stay session-scoped — a disconnect reads to @@ -575,7 +579,7 @@ out per-host instead of lying: | Capability | KWin | gamescope spawn | gamescope managed | gamescope attach | Mutter | wlroots | Windows | |---|---|---|---|---|---|---|---| -| keep-alive (linger/forever) | ✅ hold the vout thread; re-attach PipeWire consumer to the kept node — **validate** | ✅ nested session + game survive; re-discover node | ✅ policy replaces the 5 s debounce | — (never owned it) | ✅ hold the D-Bus session; consumer re-attach — **validate** | ✅ output persists; fresh portal capture per attach (cleanest) | ✅ shipped; add `Pinned` | +| keep-alive (linger/forever) | ✅ hold the vout thread; re-attach PipeWire consumer to the kept node — **validate** | ✅ nested session + game survive; re-discover node | ✅ policy replaces the 5 s debounce | — (never owned it) | ✅ hold the D-Bus session; consumer re-attach — **validate** | ✅ output persists; fresh portal capture per attach (cleanest) | ✅ shipped incl. `Pinned` (forever) | | reconfigure kept display to a new mode | ✅ `set_custom_refresh` + kscreen mode | ✅ SIGKILL+respawn is the honest "reconfigure" (game restarts — docs say so) or decline → recreate | ✅ existing managed-mode set | — | ⚠ node is sized by negotiation; renegotiation unproven — fallback recreate | ✅ `output mode --custom` | ✅ `reconfigure()` shipped | | topology: primary | ✅ | n/a | n/a | n/a | ✅ | ❌ → extend | ✅ (new, small) | | topology: exclusive | ✅ shipped (filter → group-aware) | n/a | n/a | n/a | ✅ shipped (→ group-aware) | ✅ (new, small) | ✅ shipped (→ group-aware) |