diff --git a/native/Avalonia.Native/inc/avalonia-native.h b/native/Avalonia.Native/inc/avalonia-native.h index fe6dfbc8b8..757c0bc85a 100644 --- a/native/Avalonia.Native/inc/avalonia-native.h +++ b/native/Avalonia.Native/inc/avalonia-native.h @@ -190,7 +190,7 @@ public: virtual HRESULT CreateCursorFactory(IAvnCursorFactory** ppv) = 0; virtual HRESULT ObtainGlDisplay(IAvnGlDisplay** ppv) = 0; virtual HRESULT SetAppMenu(IAvnMenu* menu) = 0; - virtual HRESULT CreateMenu (IAvnMenuEvents* cb, IAvnMenu** ppv, bool isTopLevel) = 0; + virtual HRESULT CreateMenu (IAvnMenuEvents* cb, IAvnMenu** ppv) = 0; virtual HRESULT CreateMenuItem (IAvnMenuItem** ppv) = 0; virtual HRESULT CreateMenuItemSeperator (IAvnMenuItem** ppv) = 0; }; diff --git a/native/Avalonia.Native/src/OSX/common.h b/native/Avalonia.Native/src/OSX/common.h index ad492264fd..7a433bfd9f 100644 --- a/native/Avalonia.Native/src/OSX/common.h +++ b/native/Avalonia.Native/src/OSX/common.h @@ -15,7 +15,7 @@ extern IAvnScreens* CreateScreens(); extern IAvnClipboard* CreateClipboard(); extern IAvnCursorFactory* CreateCursorFactory(); extern IAvnGlDisplay* GetGlDisplay(); -extern IAvnMenu* CreateAppMenu(IAvnMenuEvents* events, bool isTopLevel); +extern IAvnMenu* CreateAppMenu(IAvnMenuEvents* events); extern IAvnMenuItem* CreateAppMenuItem(); extern IAvnMenuItem* CreateAppMenuItemSeperator(); extern void SetAppMenu (NSString* appName, IAvnMenu* appMenu); diff --git a/native/Avalonia.Native/src/OSX/main.mm b/native/Avalonia.Native/src/OSX/main.mm index 216b531e0f..a63353bc0a 100644 --- a/native/Avalonia.Native/src/OSX/main.mm +++ b/native/Avalonia.Native/src/OSX/main.mm @@ -227,9 +227,9 @@ public: return S_OK; } - virtual HRESULT CreateMenu (IAvnMenuEvents* cb, IAvnMenu** ppv, bool isTopLevel) override + virtual HRESULT CreateMenu (IAvnMenuEvents* cb, IAvnMenu** ppv) override { - *ppv = ::CreateAppMenu(cb, isTopLevel); + *ppv = ::CreateAppMenu(cb); return S_OK; } diff --git a/native/Avalonia.Native/src/OSX/menu.h b/native/Avalonia.Native/src/OSX/menu.h index 6af5d4c7b4..615f24cf85 100644 --- a/native/Avalonia.Native/src/OSX/menu.h +++ b/native/Avalonia.Native/src/OSX/menu.h @@ -16,6 +16,8 @@ class AvnAppMenu; @interface AvnMenu : NSMenu - (id) initWithDelegate: (NSObject*) del; +- (void) setIsReparented: (bool) value; +- (bool) isReparented; @end @interface AvnMenuItem : NSMenuItem @@ -59,12 +61,11 @@ class AvnAppMenu : public ComSingleObject private: AvnMenu* _native; ComPtr _baseEvents; - bool _isTopLevel; public: FORWARD_IUNKNOWN() - AvnAppMenu(IAvnMenuEvents* events, bool isTopLevel); + AvnAppMenu(IAvnMenuEvents* events); AvnMenu* GetNative(); diff --git a/native/Avalonia.Native/src/OSX/menu.mm b/native/Avalonia.Native/src/OSX/menu.mm index da85955019..915e11f6fa 100644 --- a/native/Avalonia.Native/src/OSX/menu.mm +++ b/native/Avalonia.Native/src/OSX/menu.mm @@ -5,16 +5,29 @@ @implementation AvnMenu { + bool _isReparented; NSObject* _wtf; } + - (id) initWithDelegate: (NSObject*)del { self = [super init]; self.delegate = del; _wtf = del; + _isReparented = false; return self; } +- (bool)isReparented +{ + return _isReparented; +} + +- (void)setIsReparented:(bool)value +{ + _isReparented = value; +} + @end @implementation AvnMenuItem @@ -169,18 +182,11 @@ void AvnAppMenuItem::RaiseOnClicked() } } -AvnAppMenu::AvnAppMenu(IAvnMenuEvents* events, bool isTopLevel) +AvnAppMenu::AvnAppMenu(IAvnMenuEvents* events) { - _isTopLevel = isTopLevel; _baseEvents = events; id del = [[AvnMenuDelegate alloc] initWithParent: this]; _native = [[AvnMenu alloc] initWithDelegate: del]; - - - if(_isTopLevel) - { - [_native insertItem: [NSMenuItem new] atIndex:0]; - } } @@ -201,7 +207,7 @@ HRESULT AvnAppMenu::InsertItem(int index, IAvnMenuItem *item) { @autoreleasepool { - if(_isTopLevel) + if([_native isReparented]) { index++; } @@ -284,11 +290,11 @@ HRESULT AvnAppMenu::Clear() @end -extern IAvnMenu* CreateAppMenu(IAvnMenuEvents* cb, bool isTopLevel) +extern IAvnMenu* CreateAppMenu(IAvnMenuEvents* cb) { @autoreleasepool { - return new AvnAppMenu(cb, isTopLevel); + return new AvnAppMenu(cb); } } diff --git a/native/Avalonia.Native/src/OSX/window.mm b/native/Avalonia.Native/src/OSX/window.mm index ece790150c..fcb4884b7d 100644 --- a/native/Avalonia.Native/src/OSX/window.mm +++ b/native/Avalonia.Native/src/OSX/window.mm @@ -1144,7 +1144,7 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent ComPtr _parent; bool _canBecomeKeyAndMain; bool _closed; - NSMenu* _menu; + AvnMenu* _menu; double _lastScaling; } @@ -1194,6 +1194,8 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent [appMenu removeItem:appMenuItem]; [_menu insertItem:appMenuItem atIndex:0]; + + [_menu setIsReparented:true]; } [NSApp setMenu:_menu]; @@ -1212,6 +1214,11 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent [[appMenuItem menu] removeItem:appMenuItem]; + if(_menu != nullptr) + { + [_menu setIsReparented:false]; + } + [nativeAppMenu->GetNative() addItem:appMenuItem]; [NSApp setMenu:nativeAppMenu->GetNative()]; @@ -1222,11 +1229,11 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent } } --(void) applyMenu:(NSMenu *)menu +-(void) applyMenu:(AvnMenu *)menu { if(menu == nullptr) { - menu = [NSMenu new]; + menu = [AvnMenu new]; } _menu = menu;