diff --git a/osu.Game/Localisation/JoystickSettingsStrings.cs b/osu.Game/Localisation/JoystickSettingsStrings.cs
new file mode 100644
index 0000000000..6ae8bb66dc
--- /dev/null
+++ b/osu.Game/Localisation/JoystickSettingsStrings.cs
@@ -0,0 +1,21 @@
+using osu.Framework.Localisation;
+
+namespace osu.Game.Localisation
+{
+ public static class JoystickSettingsStrings
+ {
+ private const string prefix = @"osu.Game.Resources.Localisation.JoystickSettings";
+
+ ///
+ /// "Joystick / Gamepad"
+ ///
+ public static LocalisableString JoystickGamepad => new TranslatableString(getKey(@"joystick_gamepad"), @"Joystick / Gamepad");
+
+ ///
+ /// "Deadzone Threshold"
+ ///
+ public static LocalisableString DeadzoneThreshold => new TranslatableString(getKey(@"deadzone_threshold"), @"Deadzone Threshold");
+
+ private static string getKey(string key) => $@"{prefix}:{key}";
+ }
+}
\ No newline at end of file
diff --git a/osu.Game/Overlays/Settings/Sections/Input/JoystickSettings.cs b/osu.Game/Overlays/Settings/Sections/Input/JoystickSettings.cs
new file mode 100644
index 0000000000..fd1dbc876a
--- /dev/null
+++ b/osu.Game/Overlays/Settings/Sections/Input/JoystickSettings.cs
@@ -0,0 +1,62 @@
+using osu.Framework.Allocation;
+using osu.Framework.Bindables;
+using osu.Framework.Graphics;
+using osu.Framework.Input.Handlers.Joystick;
+using osu.Framework.Localisation;
+using osu.Game.Graphics.UserInterface;
+using osu.Game.Localisation;
+
+namespace osu.Game.Overlays.Settings.Sections.Input
+{
+ public class JoystickSettings : SettingsSubsection
+ {
+ private readonly JoystickHandler joystickHandler;
+
+ protected override LocalisableString Header => JoystickSettingsStrings.JoystickGamepad;
+ private readonly BindableNumber deadzoneThreshold = new BindableNumber();
+ private readonly Bindable enabled = new BindableBool(true);
+ public JoystickSettings(JoystickHandler joystickHandler)
+ {
+ this.joystickHandler = joystickHandler;
+ }
+ [BackgroundDependencyLoader]
+ private void load()
+ {
+ Children = new Drawable[]
+ {
+ new SettingsCheckbox
+ {
+ LabelText = CommonStrings.Enabled,
+ Current = enabled
+ },
+ new DeadzoneSetting
+ {
+ LabelText = JoystickSettingsStrings.DeadzoneThreshold,
+ Current = deadzoneThreshold
+ },
+ };
+ }
+
+ protected override void LoadComplete()
+ {
+ base.LoadComplete();
+ enabled.BindTo(joystickHandler.Enabled);
+ deadzoneThreshold.BindTo(joystickHandler.DeadzoneThreshold);
+ enabled.BindValueChanged(e => deadzoneThreshold.Disabled = !e.NewValue, true);
+ }
+
+ private class DeadzoneSetting : SettingsSlider
+ {
+ public DeadzoneSetting()
+ {
+ KeyboardStep = 0.005f;
+ TransferValueOnCommit = true;
+ }
+ }
+
+ private class DeadzoneSlider : OsuSliderBar
+ {
+ public override LocalisableString TooltipText => Current.Disabled ? "" : base.TooltipText;
+ }
+ }
+}
\ No newline at end of file
diff --git a/osu.Game/Overlays/Settings/Sections/InputSection.cs b/osu.Game/Overlays/Settings/Sections/InputSection.cs
index d282ba5318..d2c5d2fcf7 100644
--- a/osu.Game/Overlays/Settings/Sections/InputSection.cs
+++ b/osu.Game/Overlays/Settings/Sections/InputSection.cs
@@ -68,7 +68,10 @@ namespace osu.Game.Overlays.Settings.Sections
break;
// whitelist the handlers which should be displayed to avoid any weird cases of users touching settings they shouldn't.
- case JoystickHandler _:
+ case JoystickHandler jh:
+ section = new JoystickSettings(jh);
+ break;
+
case MidiHandler _:
section = new HandlerSection(handler);
break;