diff --git a/osu.Game.Rulesets.Osu/UI/DrawableOsuRuleset.cs b/osu.Game.Rulesets.Osu/UI/DrawableOsuRuleset.cs
index aa61fb6922..49aea52902 100644
--- a/osu.Game.Rulesets.Osu/UI/DrawableOsuRuleset.cs
+++ b/osu.Game.Rulesets.Osu/UI/DrawableOsuRuleset.cs
@@ -18,6 +18,7 @@ using osu.Game.Rulesets.Osu.Scoring;
using osu.Game.Rulesets.Scoring;
using osu.Game.Rulesets.UI;
using osu.Game.Screens.Play;
+using osuTK;
namespace osu.Game.Rulesets.Osu.UI
{
@@ -30,6 +31,8 @@ namespace osu.Game.Rulesets.Osu.UI
{
}
+ public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => true; // always show the gameplay cursor
+
public override ScoreProcessor CreateScoreProcessor() => new OsuScoreProcessor(this);
protected override Playfield CreatePlayfield() => new OsuPlayfield();
diff --git a/osu.Game/Rulesets/UI/DrawableRuleset.cs b/osu.Game/Rulesets/UI/DrawableRuleset.cs
index 5ed1e5a368..96275c1274 100644
--- a/osu.Game/Rulesets/UI/DrawableRuleset.cs
+++ b/osu.Game/Rulesets/UI/DrawableRuleset.cs
@@ -34,6 +34,7 @@ using osu.Game.Rulesets.Configuration;
using osu.Game.Rulesets.Scoring;
using osu.Game.Scoring;
using osu.Game.Screens.Play;
+using osuTK;
namespace osu.Game.Rulesets.UI
{
@@ -331,6 +332,9 @@ namespace osu.Game.Rulesets.UI
protected override bool OnHover(HoverEvent e) => true; // required for IProvideCursor
+ // only show the cursor when within the playfield, by default.
+ public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => Playfield.ReceivePositionalInputAt(screenSpacePos);
+
CursorContainer IProvideCursor.Cursor => Playfield.Cursor;
public override GameplayCursorContainer Cursor => Playfield.Cursor;
diff --git a/osu.Game/Rulesets/UI/Playfield.cs b/osu.Game/Rulesets/UI/Playfield.cs
index ca4983e3d7..047047ccfd 100644
--- a/osu.Game/Rulesets/UI/Playfield.cs
+++ b/osu.Game/Rulesets/UI/Playfield.cs
@@ -100,10 +100,13 @@ namespace osu.Game.Rulesets.UI
public GameplayCursorContainer Cursor { get; private set; }
///
- /// Provide an optional cursor which is to be used for gameplay.
+ /// Provide a cursor which is to be used for gameplay.
///
- /// The cursor, or null if a cursor is not rqeuired.
- protected virtual GameplayCursorContainer CreateCursor() => null;
+ ///
+ /// The default provided cursor is invisible when inside the bounds of the .
+ ///
+ /// The cursor, or null to show the menu cursor.
+ protected virtual GameplayCursorContainer CreateCursor() => new InvisibleCursorContainer();
///
/// Registers a as a nested .
@@ -143,5 +146,14 @@ namespace osu.Game.Rulesets.UI
/// Creates the container that will be used to contain the s.
///
protected virtual HitObjectContainer CreateHitObjectContainer() => new HitObjectContainer();
+
+ public class InvisibleCursorContainer : GameplayCursorContainer
+ {
+ protected override Drawable CreateCursor() => new InvisibleCursor();
+
+ private class InvisibleCursor : Drawable
+ {
+ }
+ }
}
}