Browse Source

Merge pull request #12970 from Gillibald/fixes/browserIme

[Browser] [IME] Fix event handling
release/11.0.5-rc1
Max Katz 2 years ago
committed by Steven Kirk
parent
commit
5c7659358f
  1. 20
      src/Browser/Avalonia.Browser/AvaloniaView.cs
  2. 2
      src/Browser/Avalonia.Browser/Interop/InputHelper.cs
  3. 12
      src/Browser/Avalonia.Browser/webapp/modules/avalonia/input.ts

20
src/Browser/Avalonia.Browser/AvaloniaView.cs

@ -101,7 +101,6 @@ namespace Avalonia.Browser
InputHelper.SubscribeTextEvents(
_inputElement,
OnBeforeInput,
OnTextInput,
OnCompositionStart,
OnCompositionUpdate,
OnCompositionEnd);
@ -368,16 +367,6 @@ namespace Avalonia.Browser
return _topLevelImpl.RawKeyboardEvent(RawKeyEventType.KeyUp, code, key, (RawInputModifiers)modifier);
}
private bool OnTextInput (string type, string? data)
{
if(data == null || IsComposing)
{
return false;
}
return _topLevelImpl.RawTextEvent(data);
}
private bool OnBeforeInput(JSObject arg, int start, int end)
{
var type = arg.GetPropertyAsString("inputType");
@ -429,8 +418,15 @@ namespace Avalonia.Browser
return false;
IsComposing = false;
_client.SetPreeditText(null);
_topLevelImpl.RawTextEvent(args.GetPropertyAsString("data")!);
var text = args.GetPropertyAsString("data");
if(text != null)
{
return _topLevelImpl.RawTextEvent(text);
}
return false;
}

2
src/Browser/Avalonia.Browser/Interop/InputHelper.cs

@ -20,8 +20,6 @@ internal static partial class InputHelper
JSObject htmlElement,
[JSMarshalAs<JSType.Function<JSType.Object, JSType.Number, JSType.Number, JSType.Boolean>>]
Func<JSObject, int, int, bool> onBeforeInput,
[JSMarshalAs<JSType.Function<JSType.String, JSType.String, JSType.Boolean>>]
Func<string, string?, bool> onInput,
[JSMarshalAs<JSType.Function<JSType.Object, JSType.Boolean>>]
Func<JSObject, bool> onCompositionStart,
[JSMarshalAs<JSType.Function<JSType.Object, JSType.Boolean>>]

12
src/Browser/Avalonia.Browser/webapp/modules/avalonia/input.ts

@ -105,20 +105,9 @@ export class InputHelper {
public static subscribeTextEvents(
element: HTMLInputElement,
beforeInputCallback: (args: InputEvent, start: number, end: number) => boolean,
inputCallback: (type: string, data: string | null) => boolean,
compositionStartCallback: (args: CompositionEvent) => boolean,
compositionUpdateCallback: (args: CompositionEvent) => boolean,
compositionEndCallback: (args: CompositionEvent) => boolean) {
const inputHandler = (args: Event) => {
const inputEvent = args as InputEvent;
// todo check cast
if (inputCallback(inputEvent.type, inputEvent.data)) {
args.preventDefault();
}
};
element.addEventListener("input", inputHandler);
const compositionStartHandler = (args: CompositionEvent) => {
if (compositionStartCallback(args)) {
args.preventDefault();
@ -160,7 +149,6 @@ export class InputHelper {
element.addEventListener("compositionend", compositionEndHandler);
return () => {
element.removeEventListener("input", inputHandler);
element.removeEventListener("compositionstart", compositionStartHandler);
element.removeEventListener("compositionupdate", compositionUpdateHandler);
element.removeEventListener("compositionend", compositionEndHandler);

Loading…
Cancel
Save