diff --git a/src/Ryujinx.Input.SDL3/SDL3Keyboard.cs b/src/Ryujinx.Input.SDL3/SDL3Keyboard.cs index 8dec2ba35..3e64f3447 100644 --- a/src/Ryujinx.Input.SDL3/SDL3Keyboard.cs +++ b/src/Ryujinx.Input.SDL3/SDL3Keyboard.cs @@ -3,14 +3,11 @@ using Ryujinx.Common.Configuration.Hid.Keyboard; using Ryujinx.Common.Logging; using System; using System.Collections.Generic; -using System.Numerics; using System.Runtime.CompilerServices; using System.Threading; using SDL; using static SDL.SDL3; -using ConfigPhysicalKey = Ryujinx.Common.Configuration.Hid.PhysicalKey; - namespace Ryujinx.Input.SDL3 { class SDL3Keyboard : IKeyboard @@ -264,36 +261,6 @@ namespace Ryujinx.Input.SDL3 return value * ConvertRate; } - private static (short, short) GetStickValues(ref KeyboardStateSnapshot snapshot, JoyconConfigKeyboardStick stickConfig) - { - short stickX = 0; - short stickY = 0; - - if (snapshot.IsPressed(stickConfig.StickUp.ToInputKey())) - { - stickY += 1; - } - - if (snapshot.IsPressed(stickConfig.StickDown.ToInputKey())) - { - stickY -= 1; - } - - if (snapshot.IsPressed(stickConfig.StickRight.ToInputKey())) - { - stickX += 1; - } - - if (snapshot.IsPressed(stickConfig.StickLeft.ToInputKey())) - { - stickX -= 1; - } - - Vector2 stick = Vector2.Normalize(new Vector2(stickX, stickY)); - - return ((short)(stick.X * short.MaxValue), (short)(stick.Y * short.MaxValue)); - } - public GamepadStateSnapshot GetMappedStateSnapshot() { KeyboardStateSnapshot rawState = GetKeyboardStateSnapshot(); @@ -320,8 +287,8 @@ namespace Ryujinx.Input.SDL3 } } - (short leftStickX, short leftStickY) = GetStickValues(ref rawState, _configuration.LeftJoyconStick); - (short rightStickX, short rightStickY) = GetStickValues(ref rawState, _configuration.RightJoyconStick); + (short leftStickX, short leftStickY) = KeyboardInputMappingHelper.GetStickValues(ref rawState, _configuration.LeftJoyconStick); + (short rightStickX, short rightStickY) = KeyboardInputMappingHelper.GetStickValues(ref rawState, _configuration.RightJoyconStick); result.SetStick(StickInputId.Left, ConvertRawStickValue(leftStickX), ConvertRawStickValue(leftStickY)); result.SetStick(StickInputId.Right, ConvertRawStickValue(rightStickX), ConvertRawStickValue(rightStickY)); @@ -357,32 +324,12 @@ namespace Ryujinx.Input.SDL3 { _configuration = (StandardKeyboardInputConfig)configuration; - // First clear the buttons mapping _buttonsUserMapping.Clear(); - // Then configure left joycon - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.LeftStick, _configuration.LeftJoyconStick.StickButton.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.DpadUp, _configuration.LeftJoycon.DpadUp.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.DpadDown, _configuration.LeftJoycon.DpadDown.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.DpadLeft, _configuration.LeftJoycon.DpadLeft.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.DpadRight, _configuration.LeftJoycon.DpadRight.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.Minus, _configuration.LeftJoycon.ButtonMinus.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.LeftShoulder, _configuration.LeftJoycon.ButtonL.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.LeftTrigger, _configuration.LeftJoycon.ButtonZl.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.SingleRightTrigger0, _configuration.LeftJoycon.ButtonSr.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.SingleLeftTrigger0, _configuration.LeftJoycon.ButtonSl.ToInputKey())); - - // Finally configure right joycon - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.RightStick, _configuration.RightJoyconStick.StickButton.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.A, _configuration.RightJoycon.ButtonA.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.B, _configuration.RightJoycon.ButtonB.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.X, _configuration.RightJoycon.ButtonX.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.Y, _configuration.RightJoycon.ButtonY.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.Plus, _configuration.RightJoycon.ButtonPlus.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.RightShoulder, _configuration.RightJoycon.ButtonR.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.RightTrigger, _configuration.RightJoycon.ButtonZr.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.SingleRightTrigger1, _configuration.RightJoycon.ButtonSr.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.SingleLeftTrigger1, _configuration.RightJoycon.ButtonSl.ToInputKey())); + foreach (KeyboardInputMappingHelper.KeyboardButtonMapping mapping in KeyboardInputMappingHelper.BuildButtonMappings(_configuration)) + { + _buttonsUserMapping.Add(new ButtonMappingEntry(mapping.To, mapping.From)); + } } } diff --git a/src/Ryujinx.Input/KeyboardInputMappingHelper.cs b/src/Ryujinx.Input/KeyboardInputMappingHelper.cs new file mode 100644 index 000000000..7b9c5a4ef --- /dev/null +++ b/src/Ryujinx.Input/KeyboardInputMappingHelper.cs @@ -0,0 +1,78 @@ +using Ryujinx.Common.Configuration.Hid.Keyboard; +using System.Collections.Generic; +using System.Numerics; + +using ConfigPhysicalKey = Ryujinx.Common.Configuration.Hid.PhysicalKey; + +namespace Ryujinx.Input +{ + public static class KeyboardInputMappingHelper + { + public readonly record struct KeyboardButtonMapping(GamepadButtonInputId To, Key From) + { + public bool IsValid => To is not GamepadButtonInputId.Unbound && From is not Key.Unknown and not Key.Unbound; + } + + public static KeyboardButtonMapping[] BuildButtonMappings(StandardKeyboardInputConfig configuration) => + [ + // Left JoyCon + new(GamepadButtonInputId.LeftStick, configuration.LeftJoyconStick.StickButton.ToInputKey()), + new(GamepadButtonInputId.DpadUp, configuration.LeftJoycon.DpadUp.ToInputKey()), + new(GamepadButtonInputId.DpadDown, configuration.LeftJoycon.DpadDown.ToInputKey()), + new(GamepadButtonInputId.DpadLeft, configuration.LeftJoycon.DpadLeft.ToInputKey()), + new(GamepadButtonInputId.DpadRight, configuration.LeftJoycon.DpadRight.ToInputKey()), + new(GamepadButtonInputId.Minus, configuration.LeftJoycon.ButtonMinus.ToInputKey()), + new(GamepadButtonInputId.LeftShoulder, configuration.LeftJoycon.ButtonL.ToInputKey()), + new(GamepadButtonInputId.LeftTrigger, configuration.LeftJoycon.ButtonZl.ToInputKey()), + new(GamepadButtonInputId.SingleRightTrigger0, configuration.LeftJoycon.ButtonSr.ToInputKey()), + new(GamepadButtonInputId.SingleLeftTrigger0, configuration.LeftJoycon.ButtonSl.ToInputKey()), + + // Right JoyCon + new(GamepadButtonInputId.RightStick, configuration.RightJoyconStick.StickButton.ToInputKey()), + new(GamepadButtonInputId.A, configuration.RightJoycon.ButtonA.ToInputKey()), + new(GamepadButtonInputId.B, configuration.RightJoycon.ButtonB.ToInputKey()), + new(GamepadButtonInputId.X, configuration.RightJoycon.ButtonX.ToInputKey()), + new(GamepadButtonInputId.Y, configuration.RightJoycon.ButtonY.ToInputKey()), + new(GamepadButtonInputId.Plus, configuration.RightJoycon.ButtonPlus.ToInputKey()), + new(GamepadButtonInputId.RightShoulder, configuration.RightJoycon.ButtonR.ToInputKey()), + new(GamepadButtonInputId.RightTrigger, configuration.RightJoycon.ButtonZr.ToInputKey()), + new(GamepadButtonInputId.SingleRightTrigger1, configuration.RightJoycon.ButtonSr.ToInputKey()), + new(GamepadButtonInputId.SingleLeftTrigger1, configuration.RightJoycon.ButtonSl.ToInputKey()), + ]; + + public static (short X, short Y) GetStickValues(ref KeyboardStateSnapshot snapshot, JoyconConfigKeyboardStick stickConfig) + { + short stickX = 0; + short stickY = 0; + + if (snapshot.IsPressed(stickConfig.StickUp.ToInputKey())) + { + stickY += 1; + } + + if (snapshot.IsPressed(stickConfig.StickDown.ToInputKey())) + { + stickY -= 1; + } + + if (snapshot.IsPressed(stickConfig.StickRight.ToInputKey())) + { + stickX += 1; + } + + if (snapshot.IsPressed(stickConfig.StickLeft.ToInputKey())) + { + stickX -= 1; + } + + if (stickX == 0 && stickY == 0) + { + return (0, 0); + } + + Vector2 stick = Vector2.Normalize(new Vector2(stickX, stickY)); + + return ((short)(stick.X * short.MaxValue), (short)(stick.Y * short.MaxValue)); + } + } +} diff --git a/src/Ryujinx/Input/AvaloniaKeyboard.cs b/src/Ryujinx/Input/AvaloniaKeyboard.cs index 0c18918c4..526ec7981 100644 --- a/src/Ryujinx/Input/AvaloniaKeyboard.cs +++ b/src/Ryujinx/Input/AvaloniaKeyboard.cs @@ -4,9 +4,7 @@ using Ryujinx.Common.Logging; using Ryujinx.Input; using System; using System.Collections.Generic; -using System.Numerics; using System.Threading; -using ConfigPhysicalKey = Ryujinx.Common.Configuration.Hid.PhysicalKey; using Key = Ryujinx.Input.Key; namespace Ryujinx.Ava.Input @@ -27,10 +25,9 @@ namespace Ryujinx.Ava.Input public bool IsConnected => true; public GamepadFeaturesFlag Features => GamepadFeaturesFlag.None; - private class ButtonMappingEntry(GamepadButtonInputId to, Key from) + private readonly record struct ButtonMappingEntry(GamepadButtonInputId To, Key From) { - public readonly GamepadButtonInputId To = to; - public readonly Key From = from; + public bool IsValid => To is not GamepadButtonInputId.Unbound && From is not Key.Unknown and not Key.Unbound; } public AvaloniaKeyboard(AvaloniaKeyboardDriver driver, string id, string name, KeyboardInputMode mode) @@ -62,7 +59,7 @@ namespace Ryujinx.Ava.Input foreach (ButtonMappingEntry entry in _buttonsUserMapping) { - if (entry.From == Key.Unknown || entry.From == Key.Unbound || entry.To == GamepadButtonInputId.Unbound) + if (!entry.IsValid) { continue; } @@ -74,8 +71,8 @@ namespace Ryujinx.Ava.Input } } - (short leftStickX, short leftStickY) = GetStickValues(ref rawState, _configuration.LeftJoyconStick); - (short rightStickX, short rightStickY) = GetStickValues(ref rawState, _configuration.RightJoyconStick); + (short leftStickX, short leftStickY) = KeyboardInputMappingHelper.GetStickValues(ref rawState, _configuration.LeftJoyconStick); + (short rightStickX, short rightStickY) = KeyboardInputMappingHelper.GetStickValues(ref rawState, _configuration.RightJoyconStick); result.SetStick(StickInputId.Left, ConvertRawStickValue(leftStickX), ConvertRawStickValue(leftStickY)); result.SetStick(StickInputId.Right, ConvertRawStickValue(rightStickX), ConvertRawStickValue(rightStickY)); @@ -119,31 +116,10 @@ namespace Ryujinx.Ava.Input _buttonsUserMapping.Clear(); -#pragma warning disable IDE0055 // Disable formatting - // Left JoyCon - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.LeftStick, _configuration.LeftJoyconStick.StickButton.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.DpadUp, _configuration.LeftJoycon.DpadUp.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.DpadDown, _configuration.LeftJoycon.DpadDown.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.DpadLeft, _configuration.LeftJoycon.DpadLeft.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.DpadRight, _configuration.LeftJoycon.DpadRight.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.Minus, _configuration.LeftJoycon.ButtonMinus.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.LeftShoulder, _configuration.LeftJoycon.ButtonL.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.LeftTrigger, _configuration.LeftJoycon.ButtonZl.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.SingleRightTrigger0, _configuration.LeftJoycon.ButtonSr.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.SingleLeftTrigger0, _configuration.LeftJoycon.ButtonSl.ToInputKey())); - - // Right JoyCon - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.RightStick, _configuration.RightJoyconStick.StickButton.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.A, _configuration.RightJoycon.ButtonA.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.B, _configuration.RightJoycon.ButtonB.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.X, _configuration.RightJoycon.ButtonX.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.Y, _configuration.RightJoycon.ButtonY.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.Plus, _configuration.RightJoycon.ButtonPlus.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.RightShoulder, _configuration.RightJoycon.ButtonR.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.RightTrigger, _configuration.RightJoycon.ButtonZr.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.SingleRightTrigger1, _configuration.RightJoycon.ButtonSr.ToInputKey())); - _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.SingleLeftTrigger1, _configuration.RightJoycon.ButtonSl.ToInputKey())); -#pragma warning restore IDE0055 + foreach (KeyboardInputMappingHelper.KeyboardButtonMapping mapping in KeyboardInputMappingHelper.BuildButtonMappings(_configuration)) + { + _buttonsUserMapping.Add(new ButtonMappingEntry(mapping.To, mapping.From)); + } } } @@ -174,38 +150,6 @@ namespace Ryujinx.Ava.Input return value * ConvertRate; } - private static (short, short) GetStickValues(ref KeyboardStateSnapshot snapshot, JoyconConfigKeyboardStick stickConfig) - { - short stickX = 0; - short stickY = 0; - - if (snapshot.IsPressed(stickConfig.StickUp.ToInputKey())) - { - stickY += 1; - } - - if (snapshot.IsPressed(stickConfig.StickDown.ToInputKey())) - { - stickY -= 1; - } - - if (snapshot.IsPressed(stickConfig.StickRight.ToInputKey())) - { - stickX += 1; - } - - if (snapshot.IsPressed(stickConfig.StickLeft.ToInputKey())) - { - stickX -= 1; - } - - Vector2 stick = new(stickX, stickY); - - stick = Vector2.Normalize(stick); - - return ((short)(stick.X * short.MaxValue), (short)(stick.Y * short.MaxValue)); - } - public void Clear() { _driver?.Clear(_mode); diff --git a/src/Ryujinx/Input/AvaloniaKeyboardDriver.cs b/src/Ryujinx/Input/AvaloniaKeyboardDriver.cs index 5386fb0ec..5528d0d6f 100644 --- a/src/Ryujinx/Input/AvaloniaKeyboardDriver.cs +++ b/src/Ryujinx/Input/AvaloniaKeyboardDriver.cs @@ -1,7 +1,6 @@ using Avalonia.Controls; using Avalonia.Input; using Ryujinx.Ava.Common.Locale; -using Ryujinx.Ava.UI.Helpers; using Ryujinx.Input; using System; using System.Collections.Generic; @@ -82,18 +81,13 @@ namespace Ryujinx.Ava.Input protected void OnKeyPress(object sender, KeyEventArgs args) { - UpdateKeyState(_semanticPressedKeys, GetInputKey(args, KeyboardInputMode.Semantic), true); - UpdateKeyState(_physicalPressedKeys, GetInputKey(args, KeyboardInputMode.Physical), true); - PhysicalKeyLabelHelper.UpdateFromEvent(args); - + UpdateKeyStates(args, isPressed: true); KeyPressed?.Invoke(this, args); } protected void OnKeyRelease(object sender, KeyEventArgs args) { - UpdateKeyState(_semanticPressedKeys, GetInputKey(args, KeyboardInputMode.Semantic), false); - UpdateKeyState(_physicalPressedKeys, GetInputKey(args, KeyboardInputMode.Physical), false); - + UpdateKeyStates(args, isPressed: false); KeyRelease?.Invoke(this, args); } @@ -157,6 +151,12 @@ namespace Ryujinx.Ava.Input } } + private void UpdateKeyStates(KeyEventArgs args, bool isPressed) + { + UpdateKeyState(_semanticPressedKeys, GetInputKey(args, KeyboardInputMode.Semantic), isPressed); + UpdateKeyState(_physicalPressedKeys, GetInputKey(args, KeyboardInputMode.Physical), isPressed); + } + private static Key GetInputKey(KeyEventArgs args, KeyboardInputMode mode) { if (mode == KeyboardInputMode.Physical) diff --git a/src/Ryujinx/UI/Helpers/Converters/KeyValueConverter.cs b/src/Ryujinx/UI/Helpers/Converters/KeyValueConverter.cs index 87c60edd4..8c1046563 100644 --- a/src/Ryujinx/UI/Helpers/Converters/KeyValueConverter.cs +++ b/src/Ryujinx/UI/Helpers/Converters/KeyValueConverter.cs @@ -153,7 +153,7 @@ namespace Ryujinx.Ava.UI.Helpers break; case PhysicalKey physicalKey: - keyString = PhysicalKeyLabelHelper.GetString(physicalKey); + keyString = PhysicalKeyLabelHelper.GetDisplayString(physicalKey); break; case GamepadInputId gamepadInputId: if (_gamepadInputIdMap.TryGetValue(gamepadInputId, out localeKey)) diff --git a/src/Ryujinx/UI/Helpers/PhysicalKeyLabelHelper.cs b/src/Ryujinx/UI/Helpers/PhysicalKeyLabelHelper.cs index b272003ae..fce993006 100644 --- a/src/Ryujinx/UI/Helpers/PhysicalKeyLabelHelper.cs +++ b/src/Ryujinx/UI/Helpers/PhysicalKeyLabelHelper.cs @@ -66,7 +66,7 @@ namespace Ryujinx.Ava.UI.Helpers [ConfigPhysicalKey.Unbound] = LocaleKeys.KeyboardLayout_KeyUnbound, }; - public static string GetString(ConfigPhysicalKey key) + public static string GetDisplayString(ConfigPhysicalKey key) { if (_localizedKeysMap.TryGetValue(key, out LocaleKeys localeKey)) { @@ -78,7 +78,7 @@ namespace Ryujinx.Ava.UI.Helpers return observedLabel; } - if (TryGetPrintableKeySymbol(key, out string label)) + if (TryGetFallbackPrintableKeyLabel(key, out string label)) { return label; } @@ -86,7 +86,7 @@ namespace Ryujinx.Ava.UI.Helpers return key.ToString(); } - public static void UpdateFromEvent(KeyEventArgs args) + public static void ObserveKeyPress(object sender, KeyEventArgs args) { if (args.KeyModifiers != KeyModifiers.None) { @@ -99,13 +99,13 @@ namespace Ryujinx.Ava.UI.Helpers return; } - if (TryNormalizePrintableSymbol(args.KeySymbol, out string label)) + if (TryNormalizeObservedPrintableLabel(args.KeySymbol, out string label)) { _observedLayoutLabels[physicalKey] = label; } } - private static bool TryGetPrintableKeySymbol(ConfigPhysicalKey key, out string label) + private static bool TryGetFallbackPrintableKeyLabel(ConfigPhysicalKey key, out string label) { // The legacy enum name for the ISO extra key is misleading, so give it a distinct physical label. if (key == ConfigPhysicalKey.Grave) @@ -136,7 +136,7 @@ namespace Ryujinx.Ava.UI.Helpers return true; } - private static bool TryNormalizePrintableSymbol(string keySymbol, out string label) + private static bool TryNormalizeObservedPrintableLabel(string keySymbol, out string label) { if (string.IsNullOrEmpty(keySymbol) || keySymbol.Length != 1 || char.IsControl(keySymbol[0])) { diff --git a/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs b/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs index 5c91bf5ce..7e8151150 100644 --- a/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs @@ -291,6 +291,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input _mainWindow = RyujinxApp.MainWindow; AvaloniaKeyboardDriver = new AvaloniaKeyboardDriver(owner, KeyboardInputMode.Physical); + AvaloniaKeyboardDriver.KeyPressed += PhysicalKeyLabelHelper.ObserveKeyPress; _mainWindow.InputManager.GamepadDriver.OnGamepadConnected += HandleOnGamepadConnected; _mainWindow.InputManager.GamepadDriver.OnGamepadDisconnected += HandleOnGamepadDisconnected; diff --git a/src/Ryujinx/UI/Views/Settings/SettingsHotkeysView.axaml.cs b/src/Ryujinx/UI/Views/Settings/SettingsHotkeysView.axaml.cs index a0a924c5a..2e1e452af 100644 --- a/src/Ryujinx/UI/Views/Settings/SettingsHotkeysView.axaml.cs +++ b/src/Ryujinx/UI/Views/Settings/SettingsHotkeysView.axaml.cs @@ -35,6 +35,7 @@ namespace Ryujinx.Ava.UI.Views.Settings } _avaloniaKeyboardDriver = new AvaloniaKeyboardDriver(this, KeyboardInputMode.Semantic); + _avaloniaKeyboardDriver.KeyPressed += PhysicalKeyLabelHelper.ObserveKeyPress; } protected override void OnPointerReleased(PointerReleasedEventArgs e) diff --git a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs index 1d8bcdfe9..7dac9a3d7 100644 --- a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs @@ -106,7 +106,9 @@ namespace Ryujinx.Ava.UI.Windows if (Program.PreviewerDetached) { - InputManager = new InputManager(new AvaloniaKeyboardDriver(this, KeyboardInputMode.Semantic), new SDL3GamepadDriver()); + AvaloniaKeyboardDriver keyboardDriver = new(this, KeyboardInputMode.Semantic); + keyboardDriver.KeyPressed += PhysicalKeyLabelHelper.ObserveKeyPress; + InputManager = new InputManager(keyboardDriver, new SDL3GamepadDriver()); _ = this.GetObservable(IsActiveProperty).Subscribe(it => ViewModel.IsActive = it); this.ScalingChanged += OnScalingChanged;