From 13c8b57063266eda56bffb3f0cf2ccacafd8d54f Mon Sep 17 00:00:00 2001 From: Babib3l Date: Wed, 18 Mar 2026 17:12:33 +0100 Subject: [PATCH] Fix AltGr key assignment and silence keyboard SetLed logs --- assets/Locales/KeyboardLayout.json | 8 ++++---- src/Ryujinx.Input/Assigner/KeyboardKeyAssigner.cs | 7 +++++++ src/Ryujinx/Input/AvaloniaKeyboard.cs | 3 +-- src/Ryujinx/UI/Helpers/ButtonKeyAssigner.cs | 15 +++++++++++++++ 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/assets/Locales/KeyboardLayout.json b/assets/Locales/KeyboardLayout.json index 2f7167422..3020c6656 100644 --- a/assets/Locales/KeyboardLayout.json +++ b/assets/Locales/KeyboardLayout.json @@ -82,8 +82,8 @@ "de_DE": "", "el_GR": "", "en_US": "Ctrl Left", - "es_ES": "Alt Gr", - "fr_FR": "Alt Gr", + "es_ES": "Ctrl Izquierdo", + "fr_FR": "Ctrl Gauche", "he_IL": "", "it_IT": "Ctrl sinistro", "ja_JP": "", @@ -232,8 +232,8 @@ "de_DE": "", "el_GR": "", "en_US": "Alt Right", - "es_ES": "Alt Derecho", - "fr_FR": "Alt Droite", + "es_ES": "Alt Gr", + "fr_FR": "Alt Gr", "he_IL": "", "it_IT": "Alt destro", "ja_JP": "", diff --git a/src/Ryujinx.Input/Assigner/KeyboardKeyAssigner.cs b/src/Ryujinx.Input/Assigner/KeyboardKeyAssigner.cs index 3c011a63b..252fadb66 100644 --- a/src/Ryujinx.Input/Assigner/KeyboardKeyAssigner.cs +++ b/src/Ryujinx.Input/Assigner/KeyboardKeyAssigner.cs @@ -33,6 +33,13 @@ namespace Ryujinx.Input.Assigner public Button? GetPressedButton() { + // On some layouts (for example AltGr on Windows), Right Alt is reported as Ctrl+Alt. + // Prefer AltRight in that case so the binding reflects the physical key used. + if (_keyboardState.IsPressed(Key.ControlLeft) && _keyboardState.IsPressed(Key.AltRight)) + { + return !ShouldCancel() ? new Button(Key.AltRight) : null; + } + Button? keyPressed = null; for (Key key = Key.Unknown; key < Key.Count; key++) diff --git a/src/Ryujinx/Input/AvaloniaKeyboard.cs b/src/Ryujinx/Input/AvaloniaKeyboard.cs index 031d8b033..3e068aa39 100644 --- a/src/Ryujinx/Input/AvaloniaKeyboard.cs +++ b/src/Ryujinx/Input/AvaloniaKeyboard.cs @@ -1,6 +1,5 @@ using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Configuration.Hid.Keyboard; -using Ryujinx.Common.Logging; using Ryujinx.Input; using System; using System.Collections.Generic; @@ -146,7 +145,7 @@ namespace Ryujinx.Ava.Input public void SetLed(uint packedRgb) { - Logger.Info?.Print(LogClass.UI, "SetLed called on an AvaloniaKeyboard"); + // Keyboard LED is not supported by this backend. } public void SetTriggerThreshold(float triggerThreshold) { } diff --git a/src/Ryujinx/UI/Helpers/ButtonKeyAssigner.cs b/src/Ryujinx/UI/Helpers/ButtonKeyAssigner.cs index a3939abf7..922897018 100644 --- a/src/Ryujinx/UI/Helpers/ButtonKeyAssigner.cs +++ b/src/Ryujinx/UI/Helpers/ButtonKeyAssigner.cs @@ -1,5 +1,6 @@ using Avalonia.Controls.Primitives; using Avalonia.Threading; +using Ryujinx.Ava.Input; using Ryujinx.Input; using Ryujinx.Input.Assigner; using System; @@ -25,6 +26,7 @@ namespace Ryujinx.Ava.UI.Helpers private bool _isWaitingForInput; private bool _shouldUnbind; + private IKeyboard _keyboard; public event EventHandler ButtonAssigned; public ButtonKeyAssigner(ToggleButton toggleButton) @@ -34,6 +36,9 @@ namespace Ryujinx.Ava.UI.Helpers public async void GetInputAndAssign(IButtonAssigner assigner, IKeyboard keyboard = null) { + _keyboard = keyboard; + ClearKeyboardState(_keyboard); + Dispatcher.UIThread.Post(() => { ToggledButton.IsChecked = true; @@ -82,6 +87,7 @@ namespace Ryujinx.Ava.UI.Helpers _isWaitingForInput = false; ToggledButton.IsChecked = false; + ClearKeyboardState(_keyboard); if (pressedButton.HasValue && pressedButton.Value.AsHidType() == Key.BackSpace) { @@ -98,6 +104,15 @@ namespace Ryujinx.Ava.UI.Helpers _isWaitingForInput = false; ToggledButton.IsChecked = false; _shouldUnbind = shouldUnbind; + ClearKeyboardState(_keyboard); + } + + private static void ClearKeyboardState(IKeyboard keyboard) + { + if (keyboard is AvaloniaKeyboard avaloniaKeyboard) + { + avaloniaKeyboard.Clear(); + } } } }