From 7808957a65d1f05abec5edbaaea1c78724dd034d Mon Sep 17 00:00:00 2001 From: SeWZC <36623158+SeWZC@users.noreply.github.com> Date: Tue, 8 Jul 2025 20:31:47 +0800 Subject: [PATCH] Fix: Unable to input numbers, symbols, and English letters in Avalonia on X11 with fcitx5 ForwardKey messages (#19207) --- .../DBusIme/Fcitx/FcitxX11TextInputMethod.cs | 6 ++-- src/Avalonia.FreeDesktop/IX11InputMethod.cs | 1 + src/Avalonia.X11/X11Window.Ime.cs | 29 +++++++++++++------ 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/Avalonia.FreeDesktop/DBusIme/Fcitx/FcitxX11TextInputMethod.cs b/src/Avalonia.FreeDesktop/DBusIme/Fcitx/FcitxX11TextInputMethod.cs index ac4da69a07..f50c33a5d8 100644 --- a/src/Avalonia.FreeDesktop/DBusIme/Fcitx/FcitxX11TextInputMethod.cs +++ b/src/Avalonia.FreeDesktop/DBusIme/Fcitx/FcitxX11TextInputMethod.cs @@ -180,13 +180,15 @@ namespace Avalonia.FreeDesktop.DBusIme.Fcitx mods |= KeyModifiers.Shift; if (state.HasAllFlags(FcitxKeyState.FcitxKeyState_Super)) mods |= KeyModifiers.Meta; + var isPressKey = ev.type == (int)FcitxKeyEventType.FCITX_PRESS_KEY; FireForward(new X11InputMethodForwardedKey { Modifiers = mods, KeyVal = (int)ev.keyval, - Type = ev.type == (int)FcitxKeyEventType.FCITX_PRESS_KEY ? + Type = isPressKey ? RawKeyEventType.KeyDown : - RawKeyEventType.KeyUp + RawKeyEventType.KeyUp, + WithText = isPressKey, }); } diff --git a/src/Avalonia.FreeDesktop/IX11InputMethod.cs b/src/Avalonia.FreeDesktop/IX11InputMethod.cs index 7274b58876..51176485c0 100644 --- a/src/Avalonia.FreeDesktop/IX11InputMethod.cs +++ b/src/Avalonia.FreeDesktop/IX11InputMethod.cs @@ -18,6 +18,7 @@ namespace Avalonia.FreeDesktop public int KeyVal { get; set; } public KeyModifiers Modifiers { get; set; } public RawKeyEventType Type { get; set; } + public bool WithText { get; set; } } internal interface IX11InputMethodControl : IDisposable diff --git a/src/Avalonia.X11/X11Window.Ime.cs b/src/Avalonia.X11/X11Window.Ime.cs index a5a0df926a..768a79af3d 100644 --- a/src/Avalonia.X11/X11Window.Ime.cs +++ b/src/Avalonia.X11/X11Window.Ime.cs @@ -88,15 +88,26 @@ namespace Avalonia.X11 var x11Key = (X11Key)forwardedKey.KeyVal; var keySymbol = _x11.HasXkb ? GetKeySymbolXkb(x11Key) : GetKeySymbolXCore(x11Key); - ScheduleInput(new RawKeyEventArgs( - _keyboard, - (ulong)_x11.LastActivityTimestamp.ToInt64(), - InputRoot, - forwardedKey.Type, - X11KeyTransform.KeyFromX11Key(x11Key), - (RawInputModifiers)forwardedKey.Modifiers, - PhysicalKey.None, - keySymbol)); + ScheduleInput(forwardedKey.WithText ? + new RawKeyEventArgsWithText( + _keyboard, + (ulong)_x11.LastActivityTimestamp.ToInt64(), + InputRoot, + forwardedKey.Type, + X11KeyTransform.KeyFromX11Key(x11Key), + (RawInputModifiers)forwardedKey.Modifiers, + PhysicalKey.None, + keySymbol, + keySymbol) : + new RawKeyEventArgs( + _keyboard, + (ulong)_x11.LastActivityTimestamp.ToInt64(), + InputRoot, + forwardedKey.Type, + X11KeyTransform.KeyFromX11Key(x11Key), + (RawInputModifiers)forwardedKey.Modifiers, + PhysicalKey.None, + keySymbol)); } private void UpdateImePosition() => _imeControl?.UpdateWindowInfo(_position ?? default, RenderScaling);