From bc6773f93052300d30cbd1badba09d8b4e056db4 Mon Sep 17 00:00:00 2001 From: Benedikt Stebner Date: Fri, 14 Apr 2023 20:47:13 +0200 Subject: [PATCH 1/3] Fix InputContext event handling --- native/Avalonia.Native/src/OSX/AvnView.mm | 26 +++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/native/Avalonia.Native/src/OSX/AvnView.mm b/native/Avalonia.Native/src/OSX/AvnView.mm index fdc144e3a5..1c950f01a8 100644 --- a/native/Avalonia.Native/src/OSX/AvnView.mm +++ b/native/Avalonia.Native/src/OSX/AvnView.mm @@ -521,9 +521,17 @@ - (void)keyDown:(NSEvent *)event { - [self keyboardEvent:event withType:KeyDown]; - _lastKeyHandled = [[self inputContext] handleEvent:event]; - [super keyDown:event]; + _lastKeyHandled = false; + + [[self inputContext] handleEvent:event]; + + if(!_lastKeyHandled){ + [self keyboardEvent:event withType:KeyDown]; + } +} + +- (void) doCommandBySelector:(SEL)selector{ + } - (void)keyUp:(NSEvent *)event @@ -578,6 +586,8 @@ - (void)setMarkedText:(id)string selectedRange:(NSRange)selectedRange replacementRange:(NSRange)replacementRange { + _lastKeyHandled = true; + if([string isKindOfClass:[NSAttributedString class]]) { _markedText = [[NSMutableAttributedString alloc] initWithAttributedString:string]; @@ -619,11 +629,15 @@ - (void)insertText:(id)string replacementRange:(NSRange)replacementRange { + _lastKeyHandled = true; + [self unmarkText]; if(_parent != nullptr) { - _lastKeyHandled = _parent->BaseEvents->RawTextInputEvent(0, [string UTF8String]); + uint32_t timestamp = static_cast([NSDate timeIntervalSinceReferenceDate] * 1000); + + _lastKeyHandled = _parent->BaseEvents->RawTextInputEvent(timestamp, [string UTF8String]); } [[self inputContext] invalidateCharacterCoordinates]; @@ -746,9 +760,9 @@ } - (void) setText:(NSString *)text{ - [_text setString:text]; + [self unmarkText]; - [[self inputContext] discardMarkedText]; + [_text setString:text]; } - (void) setSelection:(int)start :(int)end{ From be40f919595cb5071a7da935365e72c8c5dfe14c Mon Sep 17 00:00:00 2001 From: Benedikt Stebner Date: Mon, 17 Apr 2023 12:28:49 +0200 Subject: [PATCH 2/3] Minor tweaks --- native/Avalonia.Native/src/OSX/AvnView.mm | 34 +++++++++++++---------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/native/Avalonia.Native/src/OSX/AvnView.mm b/native/Avalonia.Native/src/OSX/AvnView.mm index 1c950f01a8..f29508c851 100644 --- a/native/Avalonia.Native/src/OSX/AvnView.mm +++ b/native/Avalonia.Native/src/OSX/AvnView.mm @@ -22,7 +22,7 @@ AvnPlatformResizeReason _resizeReason; AvnAccessibilityElement* _accessibilityChild; NSRect _cursorRect; - NSMutableString* _text; + NSMutableAttributedString* _text; NSRange _selection; } @@ -59,6 +59,11 @@ [self registerForDraggedTypes: @[@"public.data", GetAvnCustomDataType()]]; _modifierState = AvnInputModifiersNone; + + _text = [[NSMutableAttributedString alloc] initWithString:@""]; + _markedText = [[NSMutableAttributedString alloc] initWithString:@""]; + _selection = NSMakeRange(NSNotFound, 0); + return self; } @@ -530,10 +535,6 @@ } } -- (void) doCommandBySelector:(SEL)selector{ - -} - - (void)keyUp:(NSEvent *)event { [self keyboardEvent:event withType:KeyUp]; @@ -575,7 +576,7 @@ - (NSRange)markedRange { if([_markedText length] > 0) - return NSMakeRange(0, [_markedText length] - 1); + return NSMakeRange(_selection.location, [_markedText length]); return NSMakeRange(NSNotFound, 0); } @@ -608,8 +609,11 @@ { [[_markedText mutableString] setString:@""]; - [[self inputContext] discardMarkedText]; - + if([self inputContext]) { + [[self inputContext] discardMarkedText]; + [[self inputContext] invalidateCharacterCoordinates]; + } + if(!_parent->InputMethod->IsActive()){ return; } @@ -631,8 +635,6 @@ { _lastKeyHandled = true; - [self unmarkText]; - if(_parent != nullptr) { uint32_t timestamp = static_cast([NSDate timeIntervalSinceReferenceDate] * 1000); @@ -640,7 +642,7 @@ _lastKeyHandled = _parent->BaseEvents->RawTextInputEvent(timestamp, [string UTF8String]); } - [[self inputContext] invalidateCharacterCoordinates]; + //[self unmarkText]; } - (NSUInteger)characterIndexForPoint:(NSPoint)point @@ -762,13 +764,15 @@ - (void) setText:(NSString *)text{ [self unmarkText]; - [_text setString:text]; + [[_text mutableString] setString:text]; } - (void) setSelection:(int)start :(int)end{ _selection = NSMakeRange(start, end - start); - [[self inputContext] invalidateCharacterCoordinates]; + if([self inputContext]) { + [[self inputContext] invalidateCharacterCoordinates]; + } } - (void) setCursorRect:(AvnRect)rect{ @@ -780,7 +784,9 @@ _cursorRect = windowRectOnScreen; - [[self inputContext] invalidateCharacterCoordinates]; + if([self inputContext]) { + [[self inputContext] invalidateCharacterCoordinates]; + } } @end From 6da9f884de1fc47d4ae638eba438c60aba962cd3 Mon Sep 17 00:00:00 2001 From: Benedikt Stebner Date: Wed, 19 Apr 2023 06:54:09 +0200 Subject: [PATCH 3/3] More fixes --- native/Avalonia.Native/src/OSX/AvnView.mm | 86 +++++++++++++---------- 1 file changed, 49 insertions(+), 37 deletions(-) diff --git a/native/Avalonia.Native/src/OSX/AvnView.mm b/native/Avalonia.Native/src/OSX/AvnView.mm index f29508c851..6d1ff7cf12 100644 --- a/native/Avalonia.Native/src/OSX/AvnView.mm +++ b/native/Avalonia.Native/src/OSX/AvnView.mm @@ -12,7 +12,6 @@ { ComPtr _parent; NSTrackingArea* _area; - NSMutableAttributedString* _markedText; bool _isLeftPressed, _isMiddlePressed, _isRightPressed, _isXButton1Pressed, _isXButton2Pressed; AvnInputModifiers _modifierState; NSEvent* _lastMouseDownEvent; @@ -23,7 +22,8 @@ AvnAccessibilityElement* _accessibilityChild; NSRect _cursorRect; NSMutableAttributedString* _text; - NSRange _selection; + NSRange _selectedRange; + NSRange _markedRange; } - (void)onClosed @@ -61,8 +61,8 @@ _modifierState = AvnInputModifiersNone; _text = [[NSMutableAttributedString alloc] initWithString:@""]; - _markedText = [[NSMutableAttributedString alloc] initWithString:@""]; - _selection = NSMakeRange(NSNotFound, 0); + _markedRange = NSMakeRange(0, 0); + _selectedRange = NSMakeRange(0, 0); return self; } @@ -541,6 +541,10 @@ [super keyUp:event]; } +- (void) doCommandBySelector:(SEL)selector{ + +} + - (AvnInputModifiers)getModifiers:(NSEventModifierFlags)mod { unsigned int rv = 0; @@ -570,55 +574,52 @@ - (BOOL)hasMarkedText { - return [_markedText length] > 0; + return _markedRange.length > 0; } - (NSRange)markedRange { - if([_markedText length] > 0) - return NSMakeRange(_selection.location, [_markedText length]); - return NSMakeRange(NSNotFound, 0); + return _markedRange; } - (NSRange)selectedRange { - return _selection; + return _selectedRange; } - (void)setMarkedText:(id)string selectedRange:(NSRange)selectedRange replacementRange:(NSRange)replacementRange { _lastKeyHandled = true; + NSString* markedText; + if([string isKindOfClass:[NSAttributedString class]]) { - _markedText = [[NSMutableAttributedString alloc] initWithAttributedString:string]; + markedText = [string string]; } else { - _markedText = [[NSMutableAttributedString alloc] initWithString:string]; + markedText = (NSString*) string; } - if(!_parent->InputMethod->IsActive()){ - return; + _markedRange = NSMakeRange(_selectedRange.location, [markedText length]); + + if(_parent->InputMethod->IsActive()){ + _parent->InputMethod->Client->SetPreeditText((char*)[markedText UTF8String]); } - - _parent->InputMethod->Client->SetPreeditText((char*)[_markedText.string UTF8String]); } - (void)unmarkText { - [[_markedText mutableString] setString:@""]; + if(_parent->InputMethod->IsActive()){ + _parent->InputMethod->Client->SetPreeditText(nullptr); + } + + _markedRange = NSMakeRange(_selectedRange.location, 0); if([self inputContext]) { [[self inputContext] discardMarkedText]; - [[self inputContext] invalidateCharacterCoordinates]; - } - - if(!_parent->InputMethod->IsActive()){ - return; } - - _parent->InputMethod->Client->SetPreeditText(nullptr); } - (NSArray *)validAttributesForMarkedText @@ -628,21 +629,38 @@ - (NSAttributedString *)attributedSubstringForProposedRange:(NSRange)range actualRange:(NSRangePointer)actualRange { - return nullptr; + if(actualRange){ + range = *actualRange; + } + + NSAttributedString* subString = [_text attributedSubstringFromRange:range]; + + return subString; } - (void)insertText:(id)string replacementRange:(NSRange)replacementRange { - _lastKeyHandled = true; + if(_parent == nullptr){ + return; + } - if(_parent != nullptr) - { - uint32_t timestamp = static_cast([NSDate timeIntervalSinceReferenceDate] * 1000); + NSString* text; - _lastKeyHandled = _parent->BaseEvents->RawTextInputEvent(timestamp, [string UTF8String]); + if([string isKindOfClass:[NSAttributedString class]]) + { + text = [string string]; + } + else + { + text = (NSString*) string; } - //[self unmarkText]; + [self unmarkText]; + + uint32_t timestamp = static_cast([NSDate timeIntervalSinceReferenceDate] * 1000); + + _lastKeyHandled = _parent->BaseEvents->RawTextInputEvent(timestamp, [text UTF8String]); + } - (NSUInteger)characterIndexForPoint:(NSPoint)point @@ -762,17 +780,11 @@ } - (void) setText:(NSString *)text{ - [self unmarkText]; - [[_text mutableString] setString:text]; } - (void) setSelection:(int)start :(int)end{ - _selection = NSMakeRange(start, end - start); - - if([self inputContext]) { - [[self inputContext] invalidateCharacterCoordinates]; - } + _selectedRange = NSMakeRange(start, end - start); } - (void) setCursorRect:(AvnRect)rect{