Screen backdrop (schema v5/v6) + five-scene catalog + webcam polish: live desktop/game capture as a permanent non-deletable bottom layer (Source.IsBackdrop), auto full-screen game detection (Win32FullScreenDetector) else primary display, GraphicsCapturePicker re-designation, refcounted shared ScreenCaptureManager, Live-only backdrop by policy (HasBackdrop + v5-v6 backfill + EnforceBackdropPolicy, checkbox gone), SceneCatalog (Starting/Live/BRB/Chat/Ending) with + button re-adding missing scenes, webcam mid-session transparent-container fix (GetPreviewBitmap propagation), Chat half-screen-area cap, 'Add Webcam' always opens the picker (SwapWebcamIdentityAsync, no silent resurrect), WindowsRuntimeMarshal frame-read + 5s-throttled errors, docs updated, tests (65 passing)

This commit is contained in:
2026-08-07 14:15:50 -07:00
parent e037ba027b
commit ad9b3e1e48
27 changed files with 2232 additions and 116 deletions
+10 -5
View File
@@ -101,9 +101,14 @@ public sealed class RoundClipInteractionTests
// The round clip must render as a circle (square bounding box), not an oval.
webcam.ClipShape = ClipShape.Round;
window.UpdateLayout();
var ellipse = FindRoundEllipse(window);
Assert.NotNull(ellipse);
Assert.Equal(ellipse!.RenderSize.Width, ellipse.RenderSize.Height, 1.0);
var clip = FindRoundClip(window);
Assert.NotNull(clip);
var geometry = Assert.IsType<EllipseGeometry>(clip!.Clip);
Assert.Equal(0.5, geometry.Center.X, 1.0);
Assert.Equal(0.5, geometry.Center.Y, 1.0);
Assert.Equal(0.5, geometry.RadiusX, 1.0);
Assert.Equal(0.5, geometry.RadiusY, 1.0);
Assert.Equal(clip.ActualWidth, clip.ActualHeight, 1.0);
}
finally
{
@@ -114,9 +119,9 @@ public sealed class RoundClipInteractionTests
}
}
private static Ellipse? FindRoundEllipse(Window window)
private static Image? FindRoundClip(Window window)
{
return Walk(window, element => element is Ellipse e && e.IsVisible) as Ellipse;
return Walk(window, element => element is Image i && i.IsVisible && i.Clip is EllipseGeometry) as Image;
}
private static DependencyObject? Walk(DependencyObject parent, Func<DependencyObject, bool> predicate)