aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Input
diff options
context:
space:
mode:
authorIsaac Marovitz <42140194+IsaacMarovitz@users.noreply.github.com>2024-04-17 22:52:12 +0100
committerGitHub <noreply@github.com>2024-04-17 18:52:12 -0300
commit446f2854a5af18aef7151f95d64e0fe66a3498b8 (patch)
tree2d92deeffc089cdad97ed49d13b0e858ddabd404 /src/Ryujinx.Input
parent8884d1fd732c9ba788f0ab711e6a9f507d934ac8 (diff)
Ava UI: Input Menu Refactor (#5826)
* Refactor * Apply suggestions from code review Co-authored-by: Ac_K <Acoustik666@gmail.com> * Update src/Ryujinx/UI/Views/Settings/SettingsHotkeysView.axaml.cs Co-authored-by: Ac_K <Acoustik666@gmail.com> * Update src/Ryujinx.Input/ButtonValueType.cs Co-authored-by: Ac_K <Acoustik666@gmail.com> * Add empty line * Requested renames * Update src/Ryujinx/UI/Views/Settings/SettingsHotkeysView.axaml.cs Co-authored-by: gdkchan <gab.dark.100@gmail.com> * Make parent models private readonly * Fix ControllerInputView * Make line shorter * Mac keys in locale * Double line break * Fix build * Get rid of _isValid * Fix potential race condition * Rename HasAnyButtonPressed to IsAnyButtonPressed * Use switches * Simplify enumeration --------- Co-authored-by: Ac_K <Acoustik666@gmail.com> Co-authored-by: gdkchan <gab.dark.100@gmail.com> Co-authored-by: TSR Berry <20988865+TSRBerry@users.noreply.github.com>
Diffstat (limited to 'src/Ryujinx.Input')
-rw-r--r--src/Ryujinx.Input/Assigner/GamepadButtonAssigner.cs15
-rw-r--r--src/Ryujinx.Input/Assigner/IButtonAssigner.cs4
-rw-r--r--src/Ryujinx.Input/Assigner/KeyboardKeyAssigner.cs12
-rw-r--r--src/Ryujinx.Input/Button.cs33
-rw-r--r--src/Ryujinx.Input/ButtonType.cs9
-rw-r--r--src/Ryujinx.Input/HLE/NpadController.cs24
6 files changed, 65 insertions, 32 deletions
diff --git a/src/Ryujinx.Input/Assigner/GamepadButtonAssigner.cs b/src/Ryujinx.Input/Assigner/GamepadButtonAssigner.cs
index 388ebcc0..80fed2b8 100644
--- a/src/Ryujinx.Input/Assigner/GamepadButtonAssigner.cs
+++ b/src/Ryujinx.Input/Assigner/GamepadButtonAssigner.cs
@@ -49,9 +49,9 @@ namespace Ryujinx.Input.Assigner
CollectButtonStats();
}
- public bool HasAnyButtonPressed()
+ public bool IsAnyButtonPressed()
{
- return _detector.HasAnyButtonPressed();
+ return _detector.IsAnyButtonPressed();
}
public bool ShouldCancel()
@@ -59,16 +59,11 @@ namespace Ryujinx.Input.Assigner
return _gamepad == null || !_gamepad.IsConnected;
}
- public string GetPressedButton()
+ public Button? GetPressedButton()
{
IEnumerable<GamepadButtonInputId> pressedButtons = _detector.GetPressedButtons();
- if (pressedButtons.Any())
- {
- return !_forStick ? pressedButtons.First().ToString() : ((StickInputId)pressedButtons.First()).ToString();
- }
-
- return "";
+ return !_forStick ? new(pressedButtons.FirstOrDefault()) : new((StickInputId)pressedButtons.FirstOrDefault());
}
private void CollectButtonStats()
@@ -123,7 +118,7 @@ namespace Ryujinx.Input.Assigner
_stats = new Dictionary<GamepadButtonInputId, InputSummary>();
}
- public bool HasAnyButtonPressed()
+ public bool IsAnyButtonPressed()
{
return _stats.Values.Any(CheckButtonPressed);
}
diff --git a/src/Ryujinx.Input/Assigner/IButtonAssigner.cs b/src/Ryujinx.Input/Assigner/IButtonAssigner.cs
index 76a9fece..688fbddb 100644
--- a/src/Ryujinx.Input/Assigner/IButtonAssigner.cs
+++ b/src/Ryujinx.Input/Assigner/IButtonAssigner.cs
@@ -19,7 +19,7 @@ namespace Ryujinx.Input.Assigner
/// Check if a button was pressed.
/// </summary>
/// <returns>True if a button was pressed</returns>
- bool HasAnyButtonPressed();
+ bool IsAnyButtonPressed();
/// <summary>
/// Indicate if the user of this API should cancel operations. This is triggered for example when a gamepad get disconnected or when a user cancel assignation operations.
@@ -31,6 +31,6 @@ namespace Ryujinx.Input.Assigner
/// Get the pressed button that was read in <see cref="ReadInput"/> by the button assigner.
/// </summary>
/// <returns>The pressed button that was read</returns>
- string GetPressedButton();
+ Button? GetPressedButton();
}
}
diff --git a/src/Ryujinx.Input/Assigner/KeyboardKeyAssigner.cs b/src/Ryujinx.Input/Assigner/KeyboardKeyAssigner.cs
index e52ef4a2..3c011a63 100644
--- a/src/Ryujinx.Input/Assigner/KeyboardKeyAssigner.cs
+++ b/src/Ryujinx.Input/Assigner/KeyboardKeyAssigner.cs
@@ -21,9 +21,9 @@ namespace Ryujinx.Input.Assigner
_keyboardState = _keyboard.GetKeyboardStateSnapshot();
}
- public bool HasAnyButtonPressed()
+ public bool IsAnyButtonPressed()
{
- return GetPressedButton().Length != 0;
+ return GetPressedButton() is not null;
}
public bool ShouldCancel()
@@ -31,20 +31,20 @@ namespace Ryujinx.Input.Assigner
return _keyboardState.IsPressed(Key.Escape);
}
- public string GetPressedButton()
+ public Button? GetPressedButton()
{
- string keyPressed = "";
+ Button? keyPressed = null;
for (Key key = Key.Unknown; key < Key.Count; key++)
{
if (_keyboardState.IsPressed(key))
{
- keyPressed = key.ToString();
+ keyPressed = new(key);
break;
}
}
- return !ShouldCancel() ? keyPressed : "";
+ return !ShouldCancel() ? keyPressed : null;
}
}
}
diff --git a/src/Ryujinx.Input/Button.cs b/src/Ryujinx.Input/Button.cs
new file mode 100644
index 00000000..4289901c
--- /dev/null
+++ b/src/Ryujinx.Input/Button.cs
@@ -0,0 +1,33 @@
+using System;
+
+namespace Ryujinx.Input
+{
+ public readonly struct Button
+ {
+ public readonly ButtonType Type;
+ private readonly uint _rawValue;
+
+ public Button(Key key)
+ {
+ Type = ButtonType.Key;
+ _rawValue = (uint)key;
+ }
+
+ public Button(GamepadButtonInputId gamepad)
+ {
+ Type = ButtonType.GamepadButtonInputId;
+ _rawValue = (uint)gamepad;
+ }
+
+ public Button(StickInputId stick)
+ {
+ Type = ButtonType.StickId;
+ _rawValue = (uint)stick;
+ }
+
+ public T AsHidType<T>() where T : Enum
+ {
+ return (T)Enum.ToObject(typeof(T), _rawValue);
+ }
+ }
+}
diff --git a/src/Ryujinx.Input/ButtonType.cs b/src/Ryujinx.Input/ButtonType.cs
new file mode 100644
index 00000000..25ef5eea
--- /dev/null
+++ b/src/Ryujinx.Input/ButtonType.cs
@@ -0,0 +1,9 @@
+namespace Ryujinx.Input
+{
+ public enum ButtonType
+ {
+ Key,
+ GamepadButtonInputId,
+ StickId,
+ }
+}
diff --git a/src/Ryujinx.Input/HLE/NpadController.cs b/src/Ryujinx.Input/HLE/NpadController.cs
index 8411c10a..cde20f5d 100644
--- a/src/Ryujinx.Input/HLE/NpadController.cs
+++ b/src/Ryujinx.Input/HLE/NpadController.cs
@@ -203,8 +203,6 @@ namespace Ryujinx.Input.HLE
new(Key.NumLock, 10),
};
- private bool _isValid;
-
private MotionInput _leftMotionInput;
private MotionInput _rightMotionInput;
@@ -222,7 +220,6 @@ namespace Ryujinx.Input.HLE
{
State = default;
Id = null;
- _isValid = false;
_cemuHookClient = cemuHookClient;
}
@@ -234,11 +231,10 @@ namespace Ryujinx.Input.HLE
Id = config.Id;
_gamepad = GamepadDriver.GetGamepad(Id);
- _isValid = _gamepad != null;
UpdateUserConfiguration(config);
- return _isValid;
+ return _gamepad != null;
}
public void UpdateUserConfiguration(InputConfig config)
@@ -262,10 +258,7 @@ namespace Ryujinx.Input.HLE
_config = config;
- if (_isValid)
- {
- _gamepad.SetConfiguration(config);
- }
+ _gamepad?.SetConfiguration(config);
}
private void UpdateMotionInput(MotionConfigController motionConfig)
@@ -282,18 +275,21 @@ namespace Ryujinx.Input.HLE
public void Update()
{
- if (_isValid && GamepadDriver != null)
+ // _gamepad may be altered by other threads
+ var gamepad = _gamepad;
+
+ if (gamepad != null && GamepadDriver != null)
{
- State = _gamepad.GetMappedStateSnapshot();
+ State = gamepad.GetMappedStateSnapshot();
if (_config is StandardControllerInputConfig controllerConfig && controllerConfig.Motion.EnableMotion)
{
if (controllerConfig.Motion.MotionBackend == MotionInputBackendType.GamepadDriver)
{
- if (_gamepad.Features.HasFlag(GamepadFeaturesFlag.Motion))
+ if (gamepad.Features.HasFlag(GamepadFeaturesFlag.Motion))
{
- Vector3 accelerometer = _gamepad.GetMotionData(MotionInputId.Accelerometer);
- Vector3 gyroscope = _gamepad.GetMotionData(MotionInputId.Gyroscope);
+ Vector3 accelerometer = gamepad.GetMotionData(MotionInputId.Accelerometer);
+ Vector3 gyroscope = gamepad.GetMotionData(MotionInputId.Gyroscope);
accelerometer = new Vector3(accelerometer.X, -accelerometer.Z, accelerometer.Y);
gyroscope = new Vector3(gyroscope.X, -gyroscope.Z, gyroscope.Y);