Browse Source

Merge branch 'master' into render-loop-skpaint-cache

pull/9441/head
Max Katz 4 years ago
committed by GitHub
parent
commit
15100364e5
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 50
      src/Avalonia.X11/X11Window.Ime.cs
  2. 10
      src/Avalonia.X11/X11Window.cs

50
src/Avalonia.X11/X11Window.Ime.cs

@ -8,6 +8,7 @@ using Avalonia.Input;
using Avalonia.Input.Raw; using Avalonia.Input.Raw;
using Avalonia.Input.TextInput; using Avalonia.Input.TextInput;
using Avalonia.Platform.Interop; using Avalonia.Platform.Interop;
using JetBrains.Annotations;
using static Avalonia.X11.XLib; using static Avalonia.X11.XLib;
namespace Avalonia.X11 namespace Avalonia.X11
@ -104,13 +105,18 @@ namespace Avalonia.X11
if (ev.KeyEvent.state.HasAllFlags(XModifierMask.Mod2Mask) if (ev.KeyEvent.state.HasAllFlags(XModifierMask.Mod2Mask)
&& key > X11Key.Num_Lock && key <= X11Key.KP_9) && key > X11Key.Num_Lock && key <= X11Key.KP_9)
key = (X11Key)XKeycodeToKeysym(_x11.Display, ev.KeyEvent.keycode, index ? 0 : 1).ToInt32(); key = (X11Key)XKeycodeToKeysym(_x11.Display, ev.KeyEvent.keycode, index ? 0 : 1).ToInt32();
var filtered = ScheduleKeyInput(new RawKeyEventArgs(_keyboard, (ulong)ev.KeyEvent.time.ToInt64(), _inputRoot, var convertedKey = X11KeyTransform.ConvertKey(key);
ev.type == XEventName.KeyPress ? RawKeyEventType.KeyDown : RawKeyEventType.KeyUp, var modifiers = TranslateModifiers(ev.KeyEvent.state);
X11KeyTransform.ConvertKey(key), TranslateModifiers(ev.KeyEvent.state)), ref ev, (int)key, ev.KeyEvent.keycode); var timestamp = (ulong)ev.KeyEvent.time.ToInt64();
RawKeyEventArgs args =
if (ev.type == XEventName.KeyPress && !filtered) ev.type == XEventName.KeyPress
TriggerClassicTextInputEvent(ref ev); ? new RawKeyEventArgsWithText(_keyboard, timestamp, _inputRoot, RawKeyEventType.KeyDown,
convertedKey, modifiers, TranslateEventToString(ref ev))
: new RawKeyEventArgs(_keyboard, timestamp, _inputRoot, RawKeyEventType.KeyUp, convertedKey,
modifiers);
ScheduleKeyInput(args, ref ev, (int)key, ev.KeyEvent.keycode);
} }
void TriggerClassicTextInputEvent(ref XEvent ev) void TriggerClassicTextInputEvent(ref XEvent ev)
@ -156,16 +162,15 @@ namespace Avalonia.X11
} }
bool ScheduleKeyInput(RawKeyEventArgs args, ref XEvent xev, int keyval, int keycode) void ScheduleKeyInput(RawKeyEventArgs args, ref XEvent xev, int keyval, int keycode)
{ {
_x11.LastActivityTimestamp = xev.ButtonEvent.time; _x11.LastActivityTimestamp = xev.ButtonEvent.time;
if (_imeControl != null && _imeControl.IsEnabled)
{ if (_imeControl is { IsEnabled: true }
if (FilterIme(args, xev, keyval, keycode)) && FilterIme(args, xev, keyval, keycode))
return true; return;
}
ScheduleInput(args); ScheduleInput(args);
return false;
} }
bool FilterIme(RawKeyEventArgs args, XEvent xev, int keyval, int keycode) bool FilterIme(RawKeyEventArgs args, XEvent xev, int keyval, int keycode)
@ -190,11 +195,7 @@ namespace Avalonia.X11
{ {
var ev = _imeQueue.Dequeue(); var ev = _imeQueue.Dequeue();
if (_imeControl == null || !await _imeControl.HandleEventAsync(ev.args, ev.keyval, ev.keycode)) if (_imeControl == null || !await _imeControl.HandleEventAsync(ev.args, ev.keyval, ev.keycode))
{
ScheduleInput(ev.args); ScheduleInput(ev.args);
if (ev.args.Type == RawKeyEventType.KeyDown)
TriggerClassicTextInputEvent(ref ev.xev);
}
} }
} }
finally finally
@ -202,5 +203,18 @@ namespace Avalonia.X11
_processingIme = false; _processingIme = false;
} }
} }
// This class is used to attach the text value of the key to an asynchronously dispatched KeyDown event
class RawKeyEventArgsWithText : RawKeyEventArgs
{
public RawKeyEventArgsWithText([NotNull] IKeyboardDevice device, ulong timestamp, [NotNull] IInputRoot root,
RawKeyEventType type, Key key, RawInputModifiers modifiers, string text) :
base(device, timestamp, root, type, key, modifiers)
{
Text = text;
}
public string Text { get; }
}
} }
} }

10
src/Avalonia.X11/X11Window.cs

@ -190,7 +190,7 @@ namespace Avalonia.X11
UpdateMotifHints(); UpdateMotifHints();
UpdateSizeHints(null); UpdateSizeHints(null);
_rawEventGrouper = new RawEventGrouper(e => Input?.Invoke(e)); _rawEventGrouper = new RawEventGrouper(DispatchInput);
_transparencyHelper = new TransparencyHelper(_x11, _handle, platform.Globals); _transparencyHelper = new TransparencyHelper(_x11, _handle, platform.Globals);
_transparencyHelper.SetTransparencyRequest(WindowTransparencyLevel.None); _transparencyHelper.SetTransparencyRequest(WindowTransparencyLevel.None);
@ -724,7 +724,13 @@ namespace Avalonia.X11
_x11.LastActivityTimestamp = xev.ButtonEvent.time; _x11.LastActivityTimestamp = xev.ButtonEvent.time;
ScheduleInput(args); ScheduleInput(args);
} }
void DispatchInput(RawInputEventArgs args)
{
Input?.Invoke(args);
if (!args.Handled && args is RawKeyEventArgsWithText text && !string.IsNullOrWhiteSpace(text.Text))
Input?.Invoke(new RawTextInputEventArgs(_keyboard, args.Timestamp, _inputRoot, text.Text));
}
public void ScheduleXI2Input(RawInputEventArgs args) public void ScheduleXI2Input(RawInputEventArgs args)
{ {

Loading…
Cancel
Save