Browse Source

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

pull/19227/head
SeWZC 7 months ago
committed by GitHub
parent
commit
7808957a65
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 6
      src/Avalonia.FreeDesktop/DBusIme/Fcitx/FcitxX11TextInputMethod.cs
  2. 1
      src/Avalonia.FreeDesktop/IX11InputMethod.cs
  3. 29
      src/Avalonia.X11/X11Window.Ime.cs

6
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
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

29
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);

Loading…
Cancel
Save