From fad1e014088302457e96332fcc7c666f412fd933 Mon Sep 17 00:00:00 2001 From: enricobuehler Date: Sun, 5 Jul 2026 17:44:13 +0000 Subject: [PATCH] docs(display-management): keep_alive=forever (gaming-rig) shipped MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit §5.1 + §7 matrix: Windows `Pinned` is shipped (ccbd7e8), the mgmt reject is gone, the console preset is enabled, and `/display/release` frees a pinned monitor (the §8 escape hatch). On-glass validated on Linux (.116 KWin); Windows compile-verified on .173, on-glass Pinned pending. Co-Authored-By: Claude Opus 4.8 (1M context) --- design/display-management.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) 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) |