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.
1.5 KiB
1.5 KiB
TASK 16 — Kill infinity display (no-game backdrop fallback)
Catalog:
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:
ResolveAutoCaptureKey()returnsnullwhen no full-screen game is detected (was: primary monitor)ReacquireScreenCaptures()— clears staleCaptureKeywhenauto == null(handles DB upgrades); skipsAcquireAsyncwhen no keys are setSeedLiveBackdropAsset()— setsAssetIdon the backdrop element itself (NOT a Background source); called fromReacquireScreenCaptures()afterEnsureBackdrop()guarantees the element existsSource.DisplaySourcefalls back to_imageSourcewhenVideoImageSourceis null for live capturesAssets/live-backdrop.jpg— user-provided image, added as<Resource>in csprojResolveOutputFrame()in compositor —Source { IsLiveCapture: true, CaptureKey: not null }already skips null keys; fallback patternSource { 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 |