From 347b6a11a0f883c76221457996371e3d88bbd2a6 Mon Sep 17 00:00:00 2001 From: Benedikt Stebner Date: Fri, 17 Mar 2023 12:37:02 +0100 Subject: [PATCH 1/3] Translate cursor rect relative to the visual root --- native/Avalonia.Native/src/OSX/AvnView.mm | 19 +++++++------------ .../TextBoxTextInputMethodClient.cs | 6 ++++-- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/native/Avalonia.Native/src/OSX/AvnView.mm b/native/Avalonia.Native/src/OSX/AvnView.mm index 5440b76bfe..fdc144e3a5 100644 --- a/native/Avalonia.Native/src/OSX/AvnView.mm +++ b/native/Avalonia.Native/src/OSX/AvnView.mm @@ -598,13 +598,13 @@ { [[_markedText mutableString] setString:@""]; + [[self inputContext] discardMarkedText]; + if(!_parent->InputMethod->IsActive()){ return; } _parent->InputMethod->Client->SetPreeditText(nullptr); - - [[self inputContext] discardMarkedText]; } - (NSArray *)validAttributesForMarkedText @@ -619,17 +619,12 @@ - (void)insertText:(id)string replacementRange:(NSRange)replacementRange { - //[_text replaceCharactersInRange:replacementRange withString:string]; - [self unmarkText]; - - //if(!_lastKeyHandled) - //{ - if(_parent != nullptr) - { - _lastKeyHandled = _parent->BaseEvents->RawTextInputEvent(0, [string UTF8String]); - } - //} + + if(_parent != nullptr) + { + _lastKeyHandled = _parent->BaseEvents->RawTextInputEvent(0, [string UTF8String]); + } [[self inputContext] invalidateCharacterCoordinates]; } diff --git a/src/Avalonia.Controls/TextBoxTextInputMethodClient.cs b/src/Avalonia.Controls/TextBoxTextInputMethodClient.cs index e999d0bb74..b4f87ecc1d 100644 --- a/src/Avalonia.Controls/TextBoxTextInputMethodClient.cs +++ b/src/Avalonia.Controls/TextBoxTextInputMethodClient.cs @@ -30,7 +30,9 @@ namespace Avalonia.Controls return default; } - var transform = _presenter.TransformToVisual(_parent); + var visualRoot = _presenter.VisualRoot!; + + var transform = _presenter.TransformToVisual((Visual)visualRoot); if (transform == null) { @@ -38,7 +40,7 @@ namespace Avalonia.Controls } var rect = _presenter.GetCursorRectangle().TransformToAABB(transform.Value); - + return rect; } } From 90d47f4ffd488264165020adbe154baa9514be75 Mon Sep 17 00:00:00 2001 From: Benedikt Stebner Date: Fri, 17 Mar 2023 12:42:06 +0100 Subject: [PATCH 2/3] Remove extra whitespaces --- src/Avalonia.Controls/TextBoxTextInputMethodClient.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/TextBoxTextInputMethodClient.cs b/src/Avalonia.Controls/TextBoxTextInputMethodClient.cs index b4f87ecc1d..4a6ff3ae35 100644 --- a/src/Avalonia.Controls/TextBoxTextInputMethodClient.cs +++ b/src/Avalonia.Controls/TextBoxTextInputMethodClient.cs @@ -40,7 +40,7 @@ namespace Avalonia.Controls } var rect = _presenter.GetCursorRectangle().TransformToAABB(transform.Value); - + return rect; } } From 648b9bc3dc0333b2f4075c2ffb3460a85d38ab06 Mon Sep 17 00:00:00 2001 From: Benedikt Stebner Date: Tue, 21 Mar 2023 13:26:30 +0100 Subject: [PATCH 3/3] Use visual root coordinate space for caret rect instead of screen coordinates --- .../TextBoxTextInputMethodClient.cs | 4 +--- .../AvaloniaNativeTextInputMethod.cs | 13 ++++++++++++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/Avalonia.Controls/TextBoxTextInputMethodClient.cs b/src/Avalonia.Controls/TextBoxTextInputMethodClient.cs index 4a6ff3ae35..e999d0bb74 100644 --- a/src/Avalonia.Controls/TextBoxTextInputMethodClient.cs +++ b/src/Avalonia.Controls/TextBoxTextInputMethodClient.cs @@ -30,9 +30,7 @@ namespace Avalonia.Controls return default; } - var visualRoot = _presenter.VisualRoot!; - - var transform = _presenter.TransformToVisual((Visual)visualRoot); + var transform = _presenter.TransformToVisual(_parent); if (transform == null) { diff --git a/src/Avalonia.Native/AvaloniaNativeTextInputMethod.cs b/src/Avalonia.Native/AvaloniaNativeTextInputMethod.cs index b216970af3..796a0ced37 100644 --- a/src/Avalonia.Native/AvaloniaNativeTextInputMethod.cs +++ b/src/Avalonia.Native/AvaloniaNativeTextInputMethod.cs @@ -60,7 +60,18 @@ namespace Avalonia.Native return; } - _inputMethod.SetCursorRect(_client.CursorRectangle.ToAvnRect()); + var visualRoot = _client.TextViewVisual.VisualRoot; + + var transform = _client.TextViewVisual.TransformToVisual((Visual)visualRoot); + + if (transform == null) + { + return; + } + + var rect = _client.CursorRectangle.TransformToAABB(transform.Value); + + _inputMethod.SetCursorRect(rect.ToAvnRect()); } private void OnSurroundingTextChanged(object sender, EventArgs e)