// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Configuration; using osu.Framework.Graphics; using osu.Framework.Input.Handlers.Mouse; using osu.Framework.Localisation; using osu.Game.Configuration; using osu.Game.Graphics.UserInterface; using osu.Game.Input; namespace osu.Game.Overlays.Settings.Sections.Input { public class MouseSettings : SettingsSubsection { private readonly MouseHandler mouseHandler; protected override string Header => "Mouse"; private Bindable handlerSensitivity; private Bindable localSensitivity; private Bindable windowMode; private SettingsEnumDropdown confineMouseModeSetting; private Bindable relativeMode; public MouseSettings(MouseHandler mouseHandler) { this.mouseHandler = mouseHandler; } [BackgroundDependencyLoader] private void load(OsuConfigManager osuConfig, FrameworkConfigManager config) { // use local bindable to avoid changing enabled state of game host's bindable. handlerSensitivity = mouseHandler.Sensitivity.GetBoundCopy(); localSensitivity = handlerSensitivity.GetUnboundCopy(); relativeMode = mouseHandler.UseRelativeMode.GetBoundCopy(); windowMode = config.GetBindable(FrameworkSetting.WindowMode); Children = new Drawable[] { new SettingsCheckbox { LabelText = "High precision mouse", TooltipText = "Attempts to bypass any operation system mouse acceleration. On windows, this is equivalent to what used to be known as \"Raw Input\".", Current = relativeMode, Keywords = new[] { "raw", "input", "relative", "cursor" } }, new SensitivitySetting { LabelText = "Cursor sensitivity", Current = localSensitivity }, confineMouseModeSetting = new SettingsEnumDropdown { LabelText = "Confine mouse cursor to window", Current = osuConfig.GetBindable(OsuSetting.ConfineMouseMode) }, new SettingsCheckbox { LabelText = "Disable mouse wheel during gameplay", Current = osuConfig.GetBindable(OsuSetting.MouseDisableWheel) }, new SettingsCheckbox { LabelText = "Disable mouse buttons during gameplay", Current = osuConfig.GetBindable(OsuSetting.MouseDisableButtons) }, }; } protected override void LoadComplete() { base.LoadComplete(); relativeMode.BindValueChanged(relative => localSensitivity.Disabled = !relative.NewValue, true); handlerSensitivity.BindValueChanged(val => { var disabled = localSensitivity.Disabled; localSensitivity.Disabled = false; localSensitivity.Value = val.NewValue; localSensitivity.Disabled = disabled; }, true); localSensitivity.BindValueChanged(val => handlerSensitivity.Value = val.NewValue); windowMode.BindValueChanged(mode => { var isFullscreen = mode.NewValue == WindowMode.Fullscreen; if (isFullscreen) { confineMouseModeSetting.Current.Disabled = true; confineMouseModeSetting.TooltipText = "Not applicable in full screen mode"; } else { confineMouseModeSetting.Current.Disabled = false; confineMouseModeSetting.TooltipText = string.Empty; } }, true); } private class SensitivitySetting : SettingsSlider { public SensitivitySetting() { KeyboardStep = 0.01f; TransferValueOnCommit = true; } } private class SensitivitySlider : OsuSliderBar { public override LocalisableString TooltipText => Current.Disabled ? "enable high precision mouse to adjust sensitivity" : $"{base.TooltipText}x"; } } }