Browse Source

Fix: Unable to input numbers, symbols, and English letters in Avalonia on X11 with fcitx5 ForwardKey messages (#19207)

SeWZC 3 months ago
parent
commit
7808957a65

+ 4 - 2
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,
             });
         }
 

+ 1 - 0
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

+ 20 - 9
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);