87509bcf99
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.
28 lines
1.5 KiB
Markdown
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 |
|
|
|