diff --git a/native/Avalonia.Native/src/OSX/AvnView.mm b/native/Avalonia.Native/src/OSX/AvnView.mm index 11155afb2b..ee8dbcedc1 100644 --- a/native/Avalonia.Native/src/OSX/AvnView.mm +++ b/native/Avalonia.Native/src/OSX/AvnView.mm @@ -21,8 +21,8 @@ NSObject* _renderTarget; AvnPlatformResizeReason _resizeReason; AvnAccessibilityElement* _accessibilityChild; - AvnRect _cursorRect; - NSString* _text; + NSRect _cursorRect; + NSMutableString* _text; NSRange _selection; } @@ -525,7 +525,7 @@ - (void)keyDown:(NSEvent *)event { [self keyboardEvent:event withType:KeyDown]; - [[self inputContext] handleEvent:event]; + _lastKeyHandled = [[self inputContext] handleEvent:event]; [super keyDown:event]; } @@ -576,7 +576,7 @@ - (NSRange)selectedRange { - return NSMakeRange(NSNotFound, 0); + return _selection; } - (void)setMarkedText:(id)string selectedRange:(NSRange)selectedRange replacementRange:(NSRange)replacementRange @@ -606,6 +606,8 @@ } _parent->InputMethod->Client->SetPreeditText(nullptr); + + [[self inputContext] discardMarkedText]; } - (NSArray *)validAttributesForMarkedText @@ -615,18 +617,24 @@ - (NSAttributedString *)attributedSubstringForProposedRange:(NSRange)range actualRange:(NSRangePointer)actualRange { - return [NSAttributedString new]; + return nullptr; } - (void)insertText:(id)string replacementRange:(NSRange)replacementRange { - if(!_lastKeyHandled) - { + //[_text replaceCharactersInRange:replacementRange withString:string]; + + [self unmarkText]; + + //if(!_lastKeyHandled) + //{ if(_parent != nullptr) { _lastKeyHandled = _parent->BaseEvents->RawTextInputEvent(0, [string UTF8String]); } - } + //} + + [[self inputContext] invalidateCharacterCoordinates]; } - (NSUInteger)characterIndexForPoint:(NSPoint)point @@ -640,7 +648,7 @@ return NSZeroRect; } - return ToNSRect(_cursorRect); + return _cursorRect; } - (NSDragOperation)triggerAvnDragEvent: (AvnDragEventType) type info: (id )info @@ -746,15 +754,27 @@ } - (void) setText:(NSString *)text{ - _text = text; + [_text setString:text]; + + [[self inputContext] discardMarkedText]; } - (void) setSelection:(int)start :(int)end{ _selection = NSMakeRange(start, end - start); + + [[self inputContext] invalidateCharacterCoordinates]; } - (void) setCursorRect:(AvnRect)rect{ - _cursorRect = rect; + NSRect cursorRect = ToNSRect(rect); + NSRect windowRectOnScreen = [[self window] convertRectToScreen:self.frame]; + + windowRectOnScreen.size = cursorRect.size; + windowRectOnScreen.origin = NSMakePoint(windowRectOnScreen.origin.x + cursorRect.origin.x, windowRectOnScreen.origin.y + self.frame.size.height - cursorRect.origin.y - cursorRect.size.height); + + _cursorRect = windowRectOnScreen; + + [[self inputContext] invalidateCharacterCoordinates]; } @end diff --git a/src/Avalonia.Native/WindowImpl.cs b/src/Avalonia.Native/WindowImpl.cs index cbfebbbec4..5d0e6a2d18 100644 --- a/src/Avalonia.Native/WindowImpl.cs +++ b/src/Avalonia.Native/WindowImpl.cs @@ -71,7 +71,7 @@ namespace Avalonia.Native } } - public IAvnWindow Native => _native; + public new IAvnWindow Native => _native; public void CanResize(bool value) { @@ -93,8 +93,6 @@ namespace Avalonia.Native _native.SetTitle(title ?? ""); } - public ITextInputMethodImpl TextInputMethod => _inputMethod; - public WindowState WindowState { get => (WindowState)_native.WindowState; @@ -235,6 +233,11 @@ namespace Avalonia.Native public override object TryGetFeature(Type featureType) { + if(featureType == typeof(ITextInputMethodImpl)) + { + return _inputMethod; + } + if (featureType == typeof(ITopLevelNativeMenuExporter)) { return _nativeMenuExporter;