diff --git a/native/Avalonia.Native/src/OSX/window.h b/native/Avalonia.Native/src/OSX/window.h index 505900d584..8092db3663 100644 --- a/native/Avalonia.Native/src/OSX/window.h +++ b/native/Avalonia.Native/src/OSX/window.h @@ -19,6 +19,8 @@ class WindowBaseImpl; -(void) pollModalSession: (NSModalSession _Nonnull) session; -(void) restoreParentWindow; -(bool) shouldTryToHandleEvents; +-(bool) isModal; +-(void) setModal: (bool) isModal; -(void) showAppMenuOnly; -(void) showWindowMenuWithAppMenu; -(void) applyMenu:(NSMenu* _Nullable)menu; diff --git a/native/Avalonia.Native/src/OSX/window.mm b/native/Avalonia.Native/src/OSX/window.mm index 109ed63e6f..f53f4d641f 100644 --- a/native/Avalonia.Native/src/OSX/window.mm +++ b/native/Avalonia.Native/src/OSX/window.mm @@ -433,6 +433,9 @@ private: { if([Window parentWindow] != nil) [[Window parentWindow] removeChildWindow:Window]; + + [Window setModal:FALSE]; + WindowBaseImpl::Show(); return SetWindowState(_lastWindowState); @@ -450,6 +453,8 @@ private: if(cparent == nullptr) return E_INVALIDARG; + [Window setModal:TRUE]; + [cparent->Window addChildWindow:Window ordered:NSWindowAbove]; WindowBaseImpl::Show(); @@ -1144,6 +1149,7 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent ComPtr _parent; bool _canBecomeKeyAndMain; bool _closed; + bool _isModal; AvnMenu* _menu; double _lastScaling; } @@ -1322,11 +1328,25 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent auto ch = objc_cast(uch); if(ch == nil) continue; + + if(![ch isModal]) + continue; + return FALSE; } return TRUE; } +-(bool) isModal +{ + return _isModal; +} + +-(void) setModal: (bool) isModal +{ + _isModal = isModal; +} + -(void)makeKeyWindow { if([self activateAppropriateChild: true])