From 3e69afd110bc5e676172a65c31ede661e5fc473c Mon Sep 17 00:00:00 2001 From: Vova Date: Tue, 18 Feb 2025 19:28:13 +1000 Subject: [PATCH] Fix: Input page is saved only when input is changed This is an attempt to decouple "saving gamepad settings" from the rest of the emulator settings. Should fix the issue where the gamepad was not detected when starting the emulator and the game (usually after saving settings with the gamepad turned off) --- .../UI/ViewModels/Input/InputViewModel.cs | 18 +++++++++++++++--- .../Views/Input/ControllerInputView.axaml.cs | 14 +++++++++++++- src/Ryujinx/UI/Views/Input/InputView.axaml.cs | 1 + .../UI/Views/Input/KeyboardInputView.axaml.cs | 7 +++++++ 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs b/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs index 5b7bcfd32..0ada8a130 100644 --- a/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs @@ -52,6 +52,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input [ObservableProperty] private object _configViewModel; [ObservableProperty] private string _profileName; private bool _isLoaded; + public bool InitInputPage { get; set; } private static readonly InputConfigJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions()); @@ -92,6 +93,8 @@ namespace Ryujinx.Ava.UI.ViewModels.Input public bool CanClearLed => SelectedGamepad.Name.ContainsIgnoreCase("DualSense"); public bool IsModified { get; set; } + public bool IsInputConfigChanged { get; set; } + public event Action NotifyChangesEvent; public PlayerIndex PlayerIdChoose @@ -121,13 +124,12 @@ namespace Ryujinx.Ava.UI.ViewModels.Input } _isLoaded = false; - LoadConfiguration(); LoadDevice(); LoadProfiles(); _isLoaded = true; - + OnPropertyChanged(); } } @@ -296,7 +298,10 @@ namespace Ryujinx.Ava.UI.ViewModels.Input { ConfigViewModel = new ControllerInputViewModel(this, new GamepadInputConfig(controllerInputConfig)); } - } + + IsInputConfigChanged |= InitInputPage; // If the field has been changed, the control settings will be overwritten + InitInputPage = true; // initialization variable + } public void LoadDevice() { @@ -817,6 +822,13 @@ namespace Ryujinx.Ava.UI.ViewModels.Input { IsModified = false; + if (!IsInputConfigChanged) + { + return; //If the input settings were not touched, then do nothing + } + + IsInputConfigChanged = false; // Input settings have been changed + List newConfig = []; newConfig.AddRange(ConfigurationState.Instance.Hid.InputConfig.Value); diff --git a/src/Ryujinx/UI/Views/Input/ControllerInputView.axaml.cs b/src/Ryujinx/UI/Views/Input/ControllerInputView.axaml.cs index d04085a89..803162866 100644 --- a/src/Ryujinx/UI/Views/Input/ControllerInputView.axaml.cs +++ b/src/Ryujinx/UI/Views/Input/ControllerInputView.axaml.cs @@ -65,6 +65,9 @@ namespace Ryujinx.Ava.UI.Views.Input if (!float.IsNaN(_changeSlider) && _changeSlider != (float)check.Value) { (DataContext as ControllerInputViewModel)!.ParentModel.IsModified = true; + + FlagInputConfigChanged(); + _changeSlider = (float)check.Value; } } @@ -75,6 +78,9 @@ namespace Ryujinx.Ava.UI.Views.Input if (sender is CheckBox { IsPointerOver: true }) { (DataContext as ControllerInputViewModel)!.ParentModel.IsModified = true; + + FlagInputConfigChanged(); + _currentAssigner?.Cancel(); _currentAssigner = null; } @@ -102,6 +108,8 @@ namespace Ryujinx.Ava.UI.Views.Input PointerPressed += MouseClick; + FlagInputConfigChanged(); + ControllerInputViewModel viewModel = (DataContext as ControllerInputViewModel); IKeyboard keyboard = @@ -208,6 +216,11 @@ namespace Ryujinx.Ava.UI.Views.Input } } + private void FlagInputConfigChanged() + { + (DataContext as ControllerInputViewModel)!.ParentModel.IsInputConfigChanged = true; + } + private void MouseClick(object sender, PointerPressedEventArgs e) { bool shouldUnbind = e.GetCurrentPoint(this).Properties.IsMiddleButtonPressed; @@ -239,7 +252,6 @@ namespace Ryujinx.Ava.UI.Views.Input { gamepad?.ClearLed(); } - _currentAssigner?.Cancel(); _currentAssigner = null; } diff --git a/src/Ryujinx/UI/Views/Input/InputView.axaml.cs b/src/Ryujinx/UI/Views/Input/InputView.axaml.cs index b1061f70d..086c30360 100644 --- a/src/Ryujinx/UI/Views/Input/InputView.axaml.cs +++ b/src/Ryujinx/UI/Views/Input/InputView.axaml.cs @@ -48,6 +48,7 @@ namespace Ryujinx.Ava.UI.Views.Input if (result == UserResult.Yes) { + ViewModel.InitInputPage = false; ViewModel.Save(); } diff --git a/src/Ryujinx/UI/Views/Input/KeyboardInputView.axaml.cs b/src/Ryujinx/UI/Views/Input/KeyboardInputView.axaml.cs index 99e424d4f..bb4b290ec 100644 --- a/src/Ryujinx/UI/Views/Input/KeyboardInputView.axaml.cs +++ b/src/Ryujinx/UI/Views/Input/KeyboardInputView.axaml.cs @@ -60,6 +60,8 @@ namespace Ryujinx.Ava.UI.Views.Input PointerPressed += MouseClick; + FlagInputConfigChanged(); + if (DataContext is not KeyboardInputViewModel viewModel) return; @@ -184,6 +186,11 @@ namespace Ryujinx.Ava.UI.Views.Input } } + private void FlagInputConfigChanged() + { + (DataContext as KeyboardInputViewModel)!.ParentModel.IsInputConfigChanged = true; + } + private void MouseClick(object sender, PointerPressedEventArgs e) { bool shouldUnbind = e.GetCurrentPoint(this).Properties.IsMiddleButtonPressed; -- 2.47.1