From 327f90b4209d640c556aa2af0cd538e874fb5c5e Mon Sep 17 00:00:00 2001 From: Babib3l Date: Thu, 19 Mar 2026 20:25:01 +0100 Subject: [PATCH] Refresh keyboard labels when layout changes --- .../UI/Helpers/PhysicalKeyLabelHelper.cs | 7 ++++ .../UI/Models/Input/KeyboardInputConfig.cs | 32 +++++++++++++++++++ .../UI/ViewModels/Input/InputViewModel.cs | 11 +++++++ 3 files changed, 50 insertions(+) diff --git a/src/Ryujinx/UI/Helpers/PhysicalKeyLabelHelper.cs b/src/Ryujinx/UI/Helpers/PhysicalKeyLabelHelper.cs index fce993006..a23bae4de 100644 --- a/src/Ryujinx/UI/Helpers/PhysicalKeyLabelHelper.cs +++ b/src/Ryujinx/UI/Helpers/PhysicalKeyLabelHelper.cs @@ -14,6 +14,7 @@ namespace Ryujinx.Ava.UI.Helpers internal static class PhysicalKeyLabelHelper { private static readonly ConcurrentDictionary _observedLayoutLabels = new(); + public static event Action LabelsChanged; private static readonly Dictionary _localizedKeysMap = new() { @@ -101,7 +102,13 @@ namespace Ryujinx.Ava.UI.Helpers if (TryNormalizeObservedPrintableLabel(args.KeySymbol, out string label)) { + if (_observedLayoutLabels.TryGetValue(physicalKey, out string existingLabel) && existingLabel == label) + { + return; + } + _observedLayoutLabels[physicalKey] = label; + LabelsChanged?.Invoke(); } } diff --git a/src/Ryujinx/UI/Models/Input/KeyboardInputConfig.cs b/src/Ryujinx/UI/Models/Input/KeyboardInputConfig.cs index 7f3cb121b..6b27162fd 100644 --- a/src/Ryujinx/UI/Models/Input/KeyboardInputConfig.cs +++ b/src/Ryujinx/UI/Models/Input/KeyboardInputConfig.cs @@ -198,5 +198,37 @@ namespace Ryujinx.Ava.UI.Models.Input return config; } + + public void NotifyKeyLabelsChanged() + { + OnPropertiesChanged(nameof(LeftStickUp), + nameof(LeftStickDown), + nameof(LeftStickLeft), + nameof(LeftStickRight), + nameof(LeftStickButton), + nameof(RightStickUp), + nameof(RightStickDown), + nameof(RightStickLeft), + nameof(RightStickRight), + nameof(RightStickButton), + nameof(DpadUp), + nameof(DpadDown), + nameof(DpadLeft), + nameof(DpadRight), + nameof(ButtonMinus), + nameof(ButtonPlus), + nameof(ButtonA), + nameof(ButtonB), + nameof(ButtonX), + nameof(ButtonY), + nameof(ButtonL), + nameof(ButtonR), + nameof(ButtonZl), + nameof(ButtonZr), + nameof(LeftButtonSl), + nameof(LeftButtonSr), + nameof(RightButtonSl), + nameof(RightButtonSr)); + } } } diff --git a/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs b/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs index 43ebef6f4..1ae54b325 100644 --- a/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs @@ -1,6 +1,7 @@ using Avalonia.Collections; using Avalonia.Controls; using Avalonia.Svg.Skia; +using Avalonia.Threading; using CommunityToolkit.Mvvm.ComponentModel; using Gommon; using Ryujinx.Ava.Common.Locale; @@ -293,6 +294,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input AvaloniaKeyboardDriver keyboardDriver = new(owner, KeyboardInputMode.Physical); keyboardDriver.KeyPressed += PhysicalKeyLabelHelper.ObserveKeyPress; AvaloniaKeyboardDriver = keyboardDriver; + PhysicalKeyLabelHelper.LabelsChanged += OnPhysicalKeyLabelsChanged; _mainWindow.InputManager.GamepadDriver.OnGamepadConnected += HandleOnGamepadConnected; _mainWindow.InputManager.GamepadDriver.OnGamepadDisconnected += HandleOnGamepadDisconnected; @@ -1062,9 +1064,18 @@ namespace Ryujinx.Ava.UI.ViewModels.Input NotifyChangesEvent?.Invoke(); } + private void OnPhysicalKeyLabelsChanged() + { + if (ConfigViewModel is KeyboardInputViewModel keyboardInputViewModel) + { + Dispatcher.UIThread.Post(keyboardInputViewModel.Config.NotifyKeyLabelsChanged); + } + } + public void Dispose() { GC.SuppressFinalize(this); + PhysicalKeyLabelHelper.LabelsChanged -= OnPhysicalKeyLabelsChanged; _mainWindow.InputManager.GamepadDriver.OnGamepadConnected -= HandleOnGamepadConnected; _mainWindow.InputManager.GamepadDriver.OnGamepadDisconnected -= HandleOnGamepadDisconnected;