diff --git a/osu.Game/Configuration/OsuConfigManager.cs b/osu.Game/Configuration/OsuConfigManager.cs
index 71cbdb345c..78179a781a 100644
--- a/osu.Game/Configuration/OsuConfigManager.cs
+++ b/osu.Game/Configuration/OsuConfigManager.cs
@@ -70,7 +70,7 @@ namespace osu.Game.Configuration
Set(OsuSetting.MouseDisableButtons, false);
Set(OsuSetting.MouseDisableWheel, false);
- Set(OsuSetting.ConfineMouseMode, OsuConfineMouseMode.WhenOverlaysDisabled);
+ Set(OsuSetting.ConfineMouseMode, OsuConfineMouseMode.DuringGameplay);
// Graphics
Set(OsuSetting.ShowFpsDisplay, false);
diff --git a/osu.Game/Input/ConfineMouseTracker.cs b/osu.Game/Input/ConfineMouseTracker.cs
index 3b54c03bb0..c1089874ae 100644
--- a/osu.Game/Input/ConfineMouseTracker.cs
+++ b/osu.Game/Input/ConfineMouseTracker.cs
@@ -7,30 +7,29 @@ using osu.Framework.Configuration;
using osu.Framework.Graphics;
using osu.Framework.Input;
using osu.Game.Configuration;
-using osu.Game.Overlays;
namespace osu.Game.Input
{
///
- /// Connects with ,
- /// while binding .
- /// It is assumed that while overlay activation is , we should also confine the
- /// mouse cursor if it has been requested with .
+ /// Connects with .
+ /// If is true, we should also confine the mouse cursor if it has been
+ /// requested with .
///
public class ConfineMouseTracker : Component
{
private Bindable frameworkConfineMode;
private Bindable osuConfineMode;
- private IBindable overlayActivationMode;
+ private IBindable isGameplay;
[BackgroundDependencyLoader]
private void load(OsuGame game, FrameworkConfigManager frameworkConfigManager, OsuConfigManager osuConfigManager)
{
frameworkConfineMode = frameworkConfigManager.GetBindable(FrameworkSetting.ConfineMouseMode);
osuConfineMode = osuConfigManager.GetBindable(OsuSetting.ConfineMouseMode);
+ isGameplay = game.IsGameplay.GetBoundCopy();
+
osuConfineMode.ValueChanged += _ => updateConfineMode();
- overlayActivationMode = game.OverlayActivationMode.GetBoundCopy();
- overlayActivationMode.BindValueChanged(_ => updateConfineMode(), true);
+ isGameplay.BindValueChanged(_ => updateConfineMode(), true);
}
private void updateConfineMode()
@@ -45,8 +44,8 @@ namespace osu.Game.Input
frameworkConfineMode.Value = ConfineMouseMode.Fullscreen;
break;
- case OsuConfineMouseMode.WhenOverlaysDisabled:
- frameworkConfineMode.Value = overlayActivationMode?.Value == OverlayActivation.Disabled ? ConfineMouseMode.Always : ConfineMouseMode.Never;
+ case OsuConfineMouseMode.DuringGameplay:
+ frameworkConfineMode.Value = isGameplay.Value ? ConfineMouseMode.Always : ConfineMouseMode.Never;
break;
case OsuConfineMouseMode.Always:
diff --git a/osu.Game/Input/OsuConfineMouseMode.cs b/osu.Game/Input/OsuConfineMouseMode.cs
index e8411a3d9f..32b456395c 100644
--- a/osu.Game/Input/OsuConfineMouseMode.cs
+++ b/osu.Game/Input/OsuConfineMouseMode.cs
@@ -23,11 +23,11 @@ namespace osu.Game.Input
Fullscreen,
///
- /// The mouse cursor will be locked to the window bounds while overlays are disabled,
+ /// The mouse cursor will be locked to the window bounds during gameplay,
/// but may otherwise move freely.
///
[Description("During Gameplay")]
- WhenOverlaysDisabled,
+ DuringGameplay,
///
/// The mouse cursor will always be locked to the window bounds while the game has focus.
diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs
index 06e6e4bfb0..466ff13615 100644
--- a/osu.Game/OsuGame.cs
+++ b/osu.Game/OsuGame.cs
@@ -97,6 +97,11 @@ namespace osu.Game
///
public readonly IBindable OverlayActivationMode = new Bindable();
+ ///
+ /// Whether gameplay is currently active.
+ ///
+ public readonly Bindable IsGameplay = new BindableBool();
+
protected OsuScreenStack ScreenStack;
protected BackButton BackButton;
diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs
index 175722c44e..a217d2a396 100644
--- a/osu.Game/Screens/Play/Player.cs
+++ b/osu.Game/Screens/Play/Player.cs
@@ -68,6 +68,8 @@ namespace osu.Game.Screens.Play
private readonly Bindable storyboardReplacesBackground = new Bindable();
+ private readonly Bindable isGameplay = new Bindable();
+
public int RestartCount;
[Resolved]
@@ -156,7 +158,7 @@ namespace osu.Game.Screens.Play
}
[BackgroundDependencyLoader]
- private void load(AudioManager audio, OsuConfigManager config)
+ private void load(AudioManager audio, OsuConfigManager config, OsuGame game)
{
Mods.Value = base.Mods.Value.Select(m => m.CreateCopy()).ToArray();
@@ -172,6 +174,8 @@ namespace osu.Game.Screens.Play
mouseWheelDisabled = config.GetBindable(OsuSetting.MouseDisableWheel);
+ isGameplay.BindTo(game.IsGameplay);
+
DrawableRuleset = ruleset.CreateDrawableRulesetWith(playableBeatmap, Mods.Value);
ScoreProcessor = ruleset.CreateScoreProcessor();
@@ -219,9 +223,9 @@ namespace osu.Game.Screens.Play
skipOverlay.Hide();
}
- DrawableRuleset.IsPaused.BindValueChanged(_ => updateOverlayActivationMode());
- DrawableRuleset.HasReplayLoaded.BindValueChanged(_ => updateOverlayActivationMode());
- breakTracker.IsBreakTime.BindValueChanged(_ => updateOverlayActivationMode());
+ DrawableRuleset.IsPaused.BindValueChanged(_ => updateGameplayState());
+ DrawableRuleset.HasReplayLoaded.BindValueChanged(_ => updateGameplayState());
+ breakTracker.IsBreakTime.BindValueChanged(_ => updateGameplayState());
DrawableRuleset.HasReplayLoaded.BindValueChanged(_ => updatePauseOnFocusLostState(), true);
@@ -353,14 +357,11 @@ namespace osu.Game.Screens.Play
HUDOverlay.KeyCounter.IsCounting = !isBreakTime.NewValue;
}
- private void updateOverlayActivationMode()
+ private void updateGameplayState()
{
- bool canTriggerOverlays = DrawableRuleset.IsPaused.Value || breakTracker.IsBreakTime.Value;
-
- if (DrawableRuleset.HasReplayLoaded.Value || canTriggerOverlays)
- OverlayActivationMode.Value = OverlayActivation.UserTriggered;
- else
- OverlayActivationMode.Value = OverlayActivation.Disabled;
+ bool inGameplay = !DrawableRuleset.HasReplayLoaded.Value && !DrawableRuleset.IsPaused.Value && !breakTracker.IsBreakTime.Value;
+ OverlayActivationMode.Value = inGameplay ? OverlayActivation.Disabled : OverlayActivation.UserTriggered;
+ isGameplay.Value = inGameplay;
}
private void updatePauseOnFocusLostState() =>
@@ -657,7 +658,7 @@ namespace osu.Game.Screens.Play
foreach (var mod in Mods.Value.OfType())
mod.ApplyToTrack(musicController.CurrentTrack);
- updateOverlayActivationMode();
+ updateGameplayState();
}
public override void OnSuspending(IScreen next)
@@ -693,6 +694,9 @@ namespace osu.Game.Screens.Play
musicController.ResetTrackAdjustments();
+ // Ensure we reset the IsGameplay state
+ isGameplay.Value = false;
+
fadeOut();
return base.OnExiting(next);
}