4e0915a36e
Click-to-pin an open window as the full-bleed Live backdrop, via the existing
window:<hwnd> capture path (same render layer as game/desktop). Session-scoped:
window:/picker: keys heal to auto on reload (HWND-recycle hazard); pin wins
while the window enumerates, then auto-fallbacks (game → desktop → static); a
dead window's capture session heals to auto, no dead ends.
Fix: ScreenCaptureSourceFactory.Resolve hex-parsed "window:0x<Hwnd>" WITHOUT
stripping the 0x prefix — NumberStyles.HexNumber rejects it, so every pin
resolved null ("No capture target for this key") and the heal silently rolled
back. Same flaw in IsAliveWindowPin (pin-wins guard was dead). Both fixed.
Commit also carries an out-of-scope prerequisite: PillRadioTests.cs:105 had a
committed stray token ("...PrimaryStartButtonLabel soil;", CS1003) blocking the
whole test-project compile — token removed.
Plus the previous session's uncommitted pricing docs (one-time $29/$49) that
share TASKS.md/ai.md/HANDOFF.md.
28 lines
947 B
C#
28 lines
947 B
C#
namespace ytLive.Models;
|
|
|
|
/// <summary>One user-visible open window offered by the "Capture Window…"
|
|
/// submenu. Carries its owning process name for disambiguation and the raw
|
|
/// HWND that becomes the "window:<hwnd>" capture key.</summary>
|
|
public sealed class WindowInfo
|
|
{
|
|
public WindowInfo(string title, string processName, long hwnd, int processId)
|
|
{
|
|
Title = title;
|
|
ProcessName = processName;
|
|
Hwnd = hwnd;
|
|
ProcessId = processId;
|
|
}
|
|
|
|
public string Title { get; }
|
|
public string ProcessName { get; }
|
|
public long Hwnd { get; }
|
|
public int ProcessId { get; }
|
|
|
|
/// <summary>Menu label: "Title — ProcessName" (e.g. "bash — WindowsTerminal").</summary>
|
|
public string Label => $"{Title} — {ProcessName}";
|
|
|
|
/// <summary>The capture key fed to the screen-capture factory
|
|
/// ("window:<hwnd>").</summary>
|
|
public string CaptureKey => $"window:0x{Hwnd:X}";
|
|
}
|