Fix AltGr key assignment and silence keyboard SetLed logs

This commit is contained in:
Babib3l
2026-03-18 17:12:33 +01:00
parent 32f603d7ad
commit 13c8b57063
4 changed files with 27 additions and 6 deletions

View File

@@ -82,8 +82,8 @@
"de_DE": "", "de_DE": "",
"el_GR": "", "el_GR": "",
"en_US": "Ctrl Left", "en_US": "Ctrl Left",
"es_ES": "Alt Gr", "es_ES": "Ctrl Izquierdo",
"fr_FR": "Alt Gr", "fr_FR": "Ctrl Gauche",
"he_IL": "", "he_IL": "",
"it_IT": "Ctrl sinistro", "it_IT": "Ctrl sinistro",
"ja_JP": "", "ja_JP": "",
@@ -232,8 +232,8 @@
"de_DE": "", "de_DE": "",
"el_GR": "", "el_GR": "",
"en_US": "Alt Right", "en_US": "Alt Right",
"es_ES": "Alt Derecho", "es_ES": "Alt Gr",
"fr_FR": "Alt Droite", "fr_FR": "Alt Gr",
"he_IL": "", "he_IL": "",
"it_IT": "Alt destro", "it_IT": "Alt destro",
"ja_JP": "", "ja_JP": "",

View File

@@ -33,6 +33,13 @@ namespace Ryujinx.Input.Assigner
public Button? GetPressedButton() 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; Button? keyPressed = null;
for (Key key = Key.Unknown; key < Key.Count; key++) for (Key key = Key.Unknown; key < Key.Count; key++)

View File

@@ -1,6 +1,5 @@
using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Configuration.Hid;
using Ryujinx.Common.Configuration.Hid.Keyboard; using Ryujinx.Common.Configuration.Hid.Keyboard;
using Ryujinx.Common.Logging;
using Ryujinx.Input; using Ryujinx.Input;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@@ -146,7 +145,7 @@ namespace Ryujinx.Ava.Input
public void SetLed(uint packedRgb) 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) { } public void SetTriggerThreshold(float triggerThreshold) { }

View File

@@ -1,5 +1,6 @@
using Avalonia.Controls.Primitives; using Avalonia.Controls.Primitives;
using Avalonia.Threading; using Avalonia.Threading;
using Ryujinx.Ava.Input;
using Ryujinx.Input; using Ryujinx.Input;
using Ryujinx.Input.Assigner; using Ryujinx.Input.Assigner;
using System; using System;
@@ -25,6 +26,7 @@ namespace Ryujinx.Ava.UI.Helpers
private bool _isWaitingForInput; private bool _isWaitingForInput;
private bool _shouldUnbind; private bool _shouldUnbind;
private IKeyboard _keyboard;
public event EventHandler<ButtonAssignedEventArgs> ButtonAssigned; public event EventHandler<ButtonAssignedEventArgs> ButtonAssigned;
public ButtonKeyAssigner(ToggleButton toggleButton) public ButtonKeyAssigner(ToggleButton toggleButton)
@@ -34,6 +36,9 @@ namespace Ryujinx.Ava.UI.Helpers
public async void GetInputAndAssign(IButtonAssigner assigner, IKeyboard keyboard = null) public async void GetInputAndAssign(IButtonAssigner assigner, IKeyboard keyboard = null)
{ {
_keyboard = keyboard;
ClearKeyboardState(_keyboard);
Dispatcher.UIThread.Post(() => Dispatcher.UIThread.Post(() =>
{ {
ToggledButton.IsChecked = true; ToggledButton.IsChecked = true;
@@ -82,6 +87,7 @@ namespace Ryujinx.Ava.UI.Helpers
_isWaitingForInput = false; _isWaitingForInput = false;
ToggledButton.IsChecked = false; ToggledButton.IsChecked = false;
ClearKeyboardState(_keyboard);
if (pressedButton.HasValue && pressedButton.Value.AsHidType<Key>() == Key.BackSpace) if (pressedButton.HasValue && pressedButton.Value.AsHidType<Key>() == Key.BackSpace)
{ {
@@ -98,6 +104,15 @@ namespace Ryujinx.Ava.UI.Helpers
_isWaitingForInput = false; _isWaitingForInput = false;
ToggledButton.IsChecked = false; ToggledButton.IsChecked = false;
_shouldUnbind = shouldUnbind; _shouldUnbind = shouldUnbind;
ClearKeyboardState(_keyboard);
}
private static void ClearKeyboardState(IKeyboard keyboard)
{
if (keyboard is AvaloniaKeyboard avaloniaKeyboard)
{
avaloniaKeyboard.Clear();
}
} }
} }
} }