Files
LlamaCasty/TASKS/task-16-kill-infinity-display.md
T
gramps 87509bcf99 docs: restructure TASKS.md into a catalog — one file per task in TASKS/
TASKS.md is now the index (status table, open items, research pointer).
33 files: 32 task files + 1 research facts file. The full take-saga
narrative and all design decisions are preserved verbatim; the catalog
makes the queue readable without opening every task body. Schema and
AGENTS.md updated to reflect the new layout.
2026-09-05 16:31:46 -07:00

28 lines
1.5 KiB
Markdown

# TASK 16 — Kill infinity display (no-game backdrop fallback)
> Catalog: [`TASKS.md`](../TASKS.md) — status and requirements live here.
**Goal:** when no full-screen game is detected, show a static branded placeholder instead of
capturing the primary display (which causes the infinity mirror effect).
### Status: ✅ Shipped
**Changes:**
1. `ResolveAutoCaptureKey()` returns `null` when no full-screen game is detected (was: primary monitor)
2. `ReacquireScreenCaptures()` — clears stale `CaptureKey` when `auto == null` (handles DB upgrades);
skips `AcquireAsync` when no keys are set
3. `SeedLiveBackdropAsset()` — sets `AssetId` on the backdrop element itself (NOT a Background source);
called from `ReacquireScreenCaptures()` after `EnsureBackdrop()` guarantees the element exists
4. `Source.DisplaySource` falls back to `_imageSource` when `VideoImageSource` is null for live captures
5. `Assets/live-backdrop.jpg` — user-provided image, added as `<Resource>` in csproj
6. `ResolveOutputFrame()` in compositor — `Source { IsLiveCapture: true, CaptureKey: not null }` already skips null keys; fallback pattern `Source { AssetId: not null }` picks up the static image
**Rendering flow:**
| Scenario | Preview | Compositor |
|---|---|---|
| Game detected | Live capture (opaque, covers static asset on backdrop) | `ScreenCaptureManager.GetLatestFrame` |
| No game | Static image via `DisplaySource` → `_imageSource` on backdrop | `StaticPixelCache.Get(assetId)` |
| Manual capture pick | Live capture | Live frame |