From fa45608628b0dcb73762b629713d5b574836f764 Mon Sep 17 00:00:00 2001 From: enricobuehler Date: Sun, 5 Jul 2026 13:33:05 +0000 Subject: [PATCH] =?UTF-8?q?docs(display-management):=20Stage=205=20host=20?= =?UTF-8?q?+=20web=20build=20complete=20=E2=80=94=20only=20on-glass=20vali?= =?UTF-8?q?dation=20+=20residuals=20left?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mark the web arrangement table done and narrow "remaining Stage 5" to validation (2 clients on a GPU box, not the dev VM) plus the two documented residuals (wlroots exclusive, Mutter APPLY_TEMPORARY revert). No further host/web build work in Stage 5. Co-Authored-By: Claude Opus 4.8 (1M context) --- design/display-management.md | 37 ++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/design/display-management.md b/design/display-management.md index 608bd8b..06c5bf0 100644 --- a/design/display-management.md +++ b/design/display-management.md @@ -6,10 +6,12 @@ > `exclusive`/`primary` (KWin name-filter + first-slot-wins; Mutter `set_first_in_group`), **per-group > topology restore** (KWin restore floats through the group, runs on the last member's teardown), the > **layout engine** (`vdisplay/layout.rs`, auto-row + manual) + registry-driven `apply_position`, and the -> `PUT /display/layout` endpoint with group/position/index in `/display/state`. **Remaining Stage 5:** the -> web console arrangement table + on-glass validation (2 clients on a GPU box) + a couple of documented -> residuals (wlroots `exclusive`, Mutter `APPLY_TEMPORARY` revert). See the **Status — handoff** block -> under §11 for the per-stage state and the key decisions (notably the Windows `reject` default). +> `PUT /display/layout` endpoint with group/position/index in `/display/state`, and the **web console +> arrangement table** (x/y editor → `PUT /display/layout`). **Remaining Stage 5 = validation + residuals +> only** (no more build work): on-glass validation (2 clients on a GPU box, not the dev VM) + two +> documented residuals (wlroots `exclusive`, Mutter `APPLY_TEMPORARY` revert). See the **Status — +> handoff** block under §11 for the per-stage state and the key decisions (notably the Windows `reject` +> default). > This doc designs a **policy layer on top of the > existing per-compositor `VirtualDisplay` backends** — user-configurable lifecycle (keep-alive > after disconnect), topology (primary / exclusive), conflict handling (what happens when a second @@ -685,9 +687,10 @@ GNOME/Mutter, RTX 5070 Ti), **`.116`** (Bazzite KDE/KWin, AMD — build via a `f (`position_for_new` over the whole group; skips the origin so the single-display path is unchanged), the `PUT /api/v1/display/layout` endpoint (`EffectivePolicy::with_manual_layout`), and `/display/state` now carrying `group`/`display_index`/`position`/`identity_slot`/`topology`. The registry keys the arrangement - on per-client identity via `VirtualDisplay::last_identity_slot` (KWin). **Remaining:** the web arrangement - table + on-glass validation + the documented residuals (wlroots `exclusive`, Mutter `APPLY_TEMPORARY` - revert) — see the Stage 5 entry below. + on per-client identity via `VirtualDisplay::last_identity_slot` (KWin). The **web arrangement table** + (`DisplayCard.tsx` `DisplayArrangement`, en+de) is also done. **Remaining = validation + residuals only:** + on-glass validation + the documented residuals (wlroots `exclusive`, Mutter `APPLY_TEMPORARY` revert) — + see the Stage 5 entry below. **Decisions / deltas from this plan as written — read before continuing:** - **Windows admission default is `reject`, NOT `join`** (supersedes the Stage-4 line below). Two @@ -793,16 +796,22 @@ Stage-5 group-aware exclusive. (no shared desktop), so `registry::group_key` makes each gamescope display its OWN group — never auto-rowed against, topology-grouped with, or restore-grouped with another gamescope. Unit-tested. (§6B single-output "decline extras" is Stage 6.) - **TODO (still Stage 5):** - - **Console arrangement table (web)** — an x/y editor in the `Virtual displays` card reading - `/display/state` and writing `PUT /display/layout` (x/y table first; drag mini-map is the stretch). - The host API + persistence are done; this is the remaining web-only piece. + - **Console arrangement table (web)** [DONE ✓]: a `DisplayArrangement` x/y editor in the `Virtual + displays` card (`web/src/sections/Host/DisplayCard.tsx`) — for a ≥2-display group it renders an x/y + table over the live displays that carry an identity slot, seeded from `/display/state`, and Save + writes `PUT /display/layout` (switches the host to a manual layout, applied next connect). en+de + i18n; the stale `display_pending_note` copy refreshed. tsc + vite build green. (Drag mini-map is a + later stretch.) + **Remaining Stage 5 — validation + deferred residuals only (no more host/web build work):** + - **On-glass validation** (needs a GPU box + 2 clients — NOT the GPU-less dev VM): two clients + (probe + GTK) on the headless KDE box forming a 2-output desktop; drag a window across; disconnect + one → its slot lingers per policy, the sibling is unaffected, and the physical is restored only after + BOTH drop (the per-group restore). Plus the concurrent-Mutter case on a GNOME box. - **wlroots group-aware exclusive** stays deferred: wlroots `exclusive` is not implemented at all (needs a Sway box), so there is no topology to make group-aware yet. §6A multi-view on wlroots already works (independent `HEADLESS-N` outputs). - *Validate (all on-glass, needs a GPU box + 2 clients — not the dev VM):* two clients (probe + GTK) on - the headless KDE box forming a 2-output desktop; drag a window across; disconnect one → its slot lingers - per policy, sibling unaffected, restore only after both drop. + - **Mutter `APPLY_TEMPORARY` disconnect-revert** (§7): when the FIRST Mutter session leaves under a live + sibling, Mutter reverts the topology — a full fix needs a group-owned `DisplayConfig` connection. - **Stage 6 — §6B protocol + Linux host + GTK client.** `VIDEO_CAP_MULTI_DISPLAY`, control- stream Add/Remove/DisplayAdded, per-flow nonce-salt derivation, per-display pipelines on KWin/wlroots, input display-index routing, C ABI additions, GTK client multi-window