diff --git a/src/Avalonia.Native.OSX/window.mm b/src/Avalonia.Native.OSX/window.mm index b7b3c82261..64deaa7932 100644 --- a/src/Avalonia.Native.OSX/window.mm +++ b/src/Avalonia.Native.OSX/window.mm @@ -233,6 +233,16 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent } - (BOOL)isOpaque +{ + return false; +} + +- (BOOL)acceptsFirstResponder +{ + return true; +} + +- (BOOL)canBecomeKeyView { return true; } @@ -365,6 +375,7 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent - (void)mouseEvent:(NSEvent *)event withType:(AvnRawMouseEventType) type { + [self becomeFirstResponder]; auto localPoint = [self convertPoint:[event locationInWindow] toView:self]; auto avnPoint = [self toAvnPoint:localPoint]; auto point = [self translateLocalPoint:avnPoint]; @@ -493,6 +504,11 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent auto modifiers = [self getModifiers:[event modifierFlags]]; _lastKeyHandled = _parent->BaseEvents->RawKeyEvent(type, timestamp, modifiers, key); + + if (modifiers != 0) + { + _lastKeyHandled = true; + } } - (BOOL)performKeyEquivalent:(NSEvent *)event @@ -503,6 +519,7 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent - (void)keyDown:(NSEvent *)event { [self keyboardEvent:event withType:KeyDown]; + [[self inputContext] handleEvent:event]; [super keyDown:event]; } @@ -535,11 +552,6 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent return (AvnInputModifiers)rv; } -- (BOOL)acceptsFirstResponder -{ - return true; -} - - (BOOL)hasMarkedText { return false; @@ -577,7 +589,7 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent - (void)insertText:(id)string replacementRange:(NSRange)replacementRange { - // todo input text to avalonia + _lastKeyHandled = _parent->BaseEvents->RawTextInputEvent(0, [string UTF8String]); } - (NSUInteger)characterIndexForPoint:(NSPoint)point @@ -625,8 +637,13 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent -(void)becomeKeyWindow { - [super becomeKeyWindow]; _parent->BaseEvents->Activated(); + [super becomeKeyWindow]; +} + +- (BOOL)windowShouldZoom:(NSWindow *)window toFrame:(NSRect)newFrame +{ + return true; } -(void)resignKeyWindow diff --git a/src/Avalonia.Native/WindowImplBase.cs b/src/Avalonia.Native/WindowImplBase.cs index 3428fbcb81..fd1f1ef39b 100644 --- a/src/Avalonia.Native/WindowImplBase.cs +++ b/src/Avalonia.Native/WindowImplBase.cs @@ -145,11 +145,17 @@ namespace Avalonia.Native _parent.RawMouseEvent(type, timeStamp, modifiers, point, delta); } - public bool RawKeyEvent(AvnRawKeyEventType type, uint timeStamp, AvnInputModifiers modifiers, uint key) + bool IAvnWindowBaseEvents.RawKeyEvent(AvnRawKeyEventType type, uint timeStamp, AvnInputModifiers modifiers, uint key) { return _parent.RawKeyEvent(type, timeStamp, modifiers, key); } - + + bool IAvnWindowBaseEvents.RawTextInputEvent(uint timeStamp, string text) + { + return _parent.RawTextInputEvent(timeStamp, text); + } + + void IAvnWindowBaseEvents.ScalingChanged(double scaling) { _parent._savedScaling = scaling; @@ -171,6 +177,15 @@ namespace Avalonia.Native _native.Activate(); } + public bool RawTextInputEvent(uint timeStamp, string text) + { + var args = new RawTextInputEventArgs(_keyboard, timeStamp, text); + + Input?.Invoke(args); + + return args.Handled; + } + public bool RawKeyEvent(AvnRawKeyEventType type, uint timeStamp, AvnInputModifiers modifiers, uint key) { var args = new RawKeyEventArgs(_keyboard, timeStamp, (RawKeyEventType)type, (Key)key, (InputModifiers)modifiers); diff --git a/src/headers/avalonia-native.h b/src/headers/avalonia-native.h index 9dd5a6436f..d51629052e 100644 --- a/src/headers/avalonia-native.h +++ b/src/headers/avalonia-native.h @@ -156,6 +156,7 @@ AVNCOM(IAvnWindowBaseEvents, 05) : IUnknown AvnPoint point, AvnVector delta) = 0; virtual bool RawKeyEvent (AvnRawKeyEventType type, unsigned int timeStamp, AvnInputModifiers modifiers, unsigned int key) = 0; + virtual bool RawTextInputEvent (unsigned int timeStamp, const char* text) = 0; virtual void ScalingChanged(double scaling) = 0; virtual void RunRenderPriorityJobs() = 0; };