Skip to content

Commit 7808957

Browse files
authored
Fix: Unable to input numbers, symbols, and English letters in Avalonia on X11 with fcitx5 ForwardKey messages (#19207)
1 parent 44295dd commit 7808957

File tree

3 files changed

+25
-11
lines changed

3 files changed

+25
-11
lines changed

src/Avalonia.FreeDesktop/DBusIme/Fcitx/FcitxX11TextInputMethod.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,13 +180,15 @@ private void OnForward(Exception? e, (uint keyval, uint state, int type) ev)
180180
mods |= KeyModifiers.Shift;
181181
if (state.HasAllFlags(FcitxKeyState.FcitxKeyState_Super))
182182
mods |= KeyModifiers.Meta;
183+
var isPressKey = ev.type == (int)FcitxKeyEventType.FCITX_PRESS_KEY;
183184
FireForward(new X11InputMethodForwardedKey
184185
{
185186
Modifiers = mods,
186187
KeyVal = (int)ev.keyval,
187-
Type = ev.type == (int)FcitxKeyEventType.FCITX_PRESS_KEY ?
188+
Type = isPressKey ?
188189
RawKeyEventType.KeyDown :
189-
RawKeyEventType.KeyUp
190+
RawKeyEventType.KeyUp,
191+
WithText = isPressKey,
190192
});
191193
}
192194

src/Avalonia.FreeDesktop/IX11InputMethod.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ internal struct X11InputMethodForwardedKey
1818
public int KeyVal { get; set; }
1919
public KeyModifiers Modifiers { get; set; }
2020
public RawKeyEventType Type { get; set; }
21+
public bool WithText { get; set; }
2122
}
2223

2324
internal interface IX11InputMethodControl : IDisposable

src/Avalonia.X11/X11Window.Ime.cs

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -88,15 +88,26 @@ private void OnImeControlForwardKey(X11InputMethodForwardedKey forwardedKey)
8888
var x11Key = (X11Key)forwardedKey.KeyVal;
8989
var keySymbol = _x11.HasXkb ? GetKeySymbolXkb(x11Key) : GetKeySymbolXCore(x11Key);
9090

91-
ScheduleInput(new RawKeyEventArgs(
92-
_keyboard,
93-
(ulong)_x11.LastActivityTimestamp.ToInt64(),
94-
InputRoot,
95-
forwardedKey.Type,
96-
X11KeyTransform.KeyFromX11Key(x11Key),
97-
(RawInputModifiers)forwardedKey.Modifiers,
98-
PhysicalKey.None,
99-
keySymbol));
91+
ScheduleInput(forwardedKey.WithText ?
92+
new RawKeyEventArgsWithText(
93+
_keyboard,
94+
(ulong)_x11.LastActivityTimestamp.ToInt64(),
95+
InputRoot,
96+
forwardedKey.Type,
97+
X11KeyTransform.KeyFromX11Key(x11Key),
98+
(RawInputModifiers)forwardedKey.Modifiers,
99+
PhysicalKey.None,
100+
keySymbol,
101+
keySymbol) :
102+
new RawKeyEventArgs(
103+
_keyboard,
104+
(ulong)_x11.LastActivityTimestamp.ToInt64(),
105+
InputRoot,
106+
forwardedKey.Type,
107+
X11KeyTransform.KeyFromX11Key(x11Key),
108+
(RawInputModifiers)forwardedKey.Modifiers,
109+
PhysicalKey.None,
110+
keySymbol));
100111
}
101112

102113
private void UpdateImePosition() => _imeControl?.UpdateWindowInfo(_position ?? default, RenderScaling);

0 commit comments

Comments
 (0)