From ac5d34d0aba1180fb26a52b007e0f933a52cb19c Mon Sep 17 00:00:00 2001 From: Owen McGirr Date: Sun, 19 Jul 2026 14:33:25 +0100 Subject: [PATCH] Reduce click feedback center size --- .../CursorOverlayClickFeedbackTests.cs | 13 ++++++++----- .../CursorOverlay/CursorOverlayVisualFoundation.cs | 11 ++++++++++- .../CursorOverlay/WindowsCursorOverlayNotifier.cs | 4 +--- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/SwitchifyPc.Tests/CursorOverlayClickFeedbackTests.cs b/src/SwitchifyPc.Tests/CursorOverlayClickFeedbackTests.cs index 82a1f6a..e12b8f4 100644 --- a/src/SwitchifyPc.Tests/CursorOverlayClickFeedbackTests.cs +++ b/src/SwitchifyPc.Tests/CursorOverlayClickFeedbackTests.cs @@ -18,20 +18,23 @@ public void StaticFeedbackUsesFixedVisibilityDurations() } [Theory] - [InlineData(1, 48, 88, 3, 2)] - [InlineData(1.5, 72, 132, 4.5, 3)] - [InlineData(2, 96, 176, 6, 4)] + [InlineData(1, 33.6, 36.95, 3, 2)] + [InlineData(1.5, 50.4, 55.425, 4.5, 3)] + [InlineData(2, 67.2, 73.9, 6, 4)] public void LandingGeometryScalesWithMonitorDpi( double scale, float expectedCore, - float expectedHalo, + float expectedHaloRadius, float expectedStroke, float expectedShadow) { CursorOverlayVisualTokens tokens = CursorOverlayVisualTokens.Create(128, scale); Assert.Equal(expectedCore, tokens.LandingCoreDiameter); - Assert.Equal(expectedHalo, tokens.LandingHaloDiameter); + Assert.InRange( + CursorOverlayStaticFeedback.ResolveLandingHaloRadius(tokens), + expectedHaloRadius - 0.001f, + expectedHaloRadius + 0.001f); Assert.Equal(expectedStroke, tokens.LandingHaloStroke); Assert.Equal(expectedShadow, tokens.ShadowOffset); } diff --git a/src/SwitchifyPc.Windows/CursorOverlay/CursorOverlayVisualFoundation.cs b/src/SwitchifyPc.Windows/CursorOverlay/CursorOverlayVisualFoundation.cs index 83403d9..d92caee 100644 --- a/src/SwitchifyPc.Windows/CursorOverlay/CursorOverlayVisualFoundation.cs +++ b/src/SwitchifyPc.Windows/CursorOverlay/CursorOverlayVisualFoundation.cs @@ -9,6 +9,7 @@ internal sealed record CursorOverlayVisualTokens( float GlowStroke, int CrosshairThickness, float LandingCoreDiameter, + float LandingHaloStartDiameter, float LandingHaloDiameter, float LandingHaloStroke, float ShadowOffset, @@ -31,7 +32,8 @@ public static CursorOverlayVisualTokens Create(int logicalWindowSize, double sca RingStroke: (float)Math.Max(4 * scale, normalizedLogicalSize * 0.039 * scale), GlowStroke: (float)Math.Max(18 * scale, normalizedLogicalSize * 0.1875 * scale), CrosshairThickness: Math.Max(1, Scale(2, scale)), - LandingCoreDiameter: (float)(normalizedLogicalSize * 0.375 * scale), + LandingCoreDiameter: (float)(normalizedLogicalSize * 0.2625 * scale), + LandingHaloStartDiameter: (float)(normalizedLogicalSize * 0.375 * scale), LandingHaloDiameter: (float)(normalizedLogicalSize * 0.6875 * scale), LandingHaloStroke: (float)Math.Max(2 * scale, normalizedLogicalSize * 0.0234375 * scale), ShadowOffset: (float)Math.Max(1, 2 * scale), @@ -67,6 +69,13 @@ internal static class CursorOverlayFeedbackTiming internal static class CursorOverlayStaticFeedback { public const float LandingHaloProgress = 0.7f; + + public static float ResolveLandingHaloRadius(CursorOverlayVisualTokens tokens) + { + float startRadius = tokens.LandingHaloStartDiameter / 2; + float maxRadius = (tokens.LandingHaloDiameter - tokens.LandingHaloStroke) / 2; + return startRadius + ((maxRadius - startRadius) * LandingHaloProgress); + } } internal sealed class CursorOverlayRenderFailureGuard diff --git a/src/SwitchifyPc.Windows/CursorOverlay/WindowsCursorOverlayNotifier.cs b/src/SwitchifyPc.Windows/CursorOverlay/WindowsCursorOverlayNotifier.cs index 618deef..fec569e 100644 --- a/src/SwitchifyPc.Windows/CursorOverlay/WindowsCursorOverlayNotifier.cs +++ b/src/SwitchifyPc.Windows/CursorOverlay/WindowsCursorOverlayNotifier.cs @@ -718,9 +718,7 @@ private void DrawLanding(Graphics graphics) float centerY = cursorCenter.Y; float coreDiameter = visualTokens.LandingCoreDiameter; float coreRadius = coreDiameter / 2; - float maxHaloRadius = (visualTokens.LandingHaloDiameter - visualTokens.LandingHaloStroke) / 2; - float haloRadius = visualTokens.LandingCoreDiameter / 2 + - ((maxHaloRadius - visualTokens.LandingCoreDiameter / 2) * CursorOverlayStaticFeedback.LandingHaloProgress); + float haloRadius = CursorOverlayStaticFeedback.ResolveLandingHaloRadius(visualTokens); using Pen halo = new( Color.FromArgb(180, overlayColor.R, overlayColor.G, overlayColor.B),