From c968981697e74826682ac868e737daf4f8e9a476 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 25 Nov 2025 15:51:47 +0900 Subject: [PATCH 1/3] Fix quick retry/exit overlay volume dimming potentially sticking at results Closes #35737. --- osu.Game/Screens/Play/Player.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index 6158118c78..38e3fcd38d 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -320,7 +320,7 @@ namespace osu.Game.Screens.Play OnRetry = Configuration.AllowUserInteraction ? () => Restart() : null, OnQuit = () => PerformExitWithConfirmation(), }, - new HotkeyExitOverlay + exitOverlay = new HotkeyExitOverlay { Action = () => { @@ -338,7 +338,7 @@ namespace osu.Game.Screens.Play { rulesetSkinProvider.AddRange(new Drawable[] { - new HotkeyRetryOverlay + retryOverlay = new HotkeyRetryOverlay { Action = () => { @@ -1033,6 +1033,9 @@ namespace osu.Game.Screens.Play private double? lastPauseActionTime; + private HotkeyRetryOverlay retryOverlay; + private HotkeyExitOverlay exitOverlay; + protected bool PauseCooldownActive => PlayingState.Value == LocalUserPlayingState.Playing && lastPauseActionTime.HasValue && GameplayClockContainer.CurrentTime < lastPauseActionTime + PauseCooldownDuration; @@ -1171,6 +1174,10 @@ namespace osu.Game.Screens.Play { screenSuspension?.RemoveAndDisposeImmediately(); + // If these are not disposed, audio volume dimming can get stuck. + retryOverlay?.RemoveAndDisposeImmediately(); + exitOverlay?.RemoveAndDisposeImmediately(); + fadeOut(); base.OnSuspending(e); } From 2c9fc32756e543113f72042e6eb9ec454c43541c Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 25 Nov 2025 16:39:39 +0900 Subject: [PATCH 2/3] Assert that player suspension is final --- osu.Game/Screens/Play/Player.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index 38e3fcd38d..9988bbcd93 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -1172,6 +1172,8 @@ namespace osu.Game.Screens.Play public override void OnSuspending(ScreenTransitionEvent e) { + Debug.Assert(!ValidForResume); + screenSuspension?.RemoveAndDisposeImmediately(); // If these are not disposed, audio volume dimming can get stuck. From f6a6c9f8859205b1caa19fc4fc1f39f42cceb9e4 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 25 Nov 2025 18:48:03 +0900 Subject: [PATCH 3/3] Fix failing test --- .../Visual/Background/TestSceneUserDimBackgrounds.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/osu.Game.Tests/Visual/Background/TestSceneUserDimBackgrounds.cs b/osu.Game.Tests/Visual/Background/TestSceneUserDimBackgrounds.cs index 3021589cdb..1365d95a55 100644 --- a/osu.Game.Tests/Visual/Background/TestSceneUserDimBackgrounds.cs +++ b/osu.Game.Tests/Visual/Background/TestSceneUserDimBackgrounds.cs @@ -266,7 +266,11 @@ namespace osu.Game.Tests.Visual.Background FadeAccessibleResults results = null; - AddStep("Transition to Results", () => player.Push(results = new FadeAccessibleResults(TestResources.CreateTestScoreInfo()))); + AddStep("Transition to Results", () => + { + player.ValidForResume = false; + player.Push(results = new FadeAccessibleResults(TestResources.CreateTestScoreInfo())); + }); AddUntilStep("Wait for results is current", () => results.IsCurrentScreen());