diff --git a/native/Avalonia.Native/inc/avalonia-native.h b/native/Avalonia.Native/inc/avalonia-native.h index 757c0bc85a..fe6dfbc8b8 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) = 0; + virtual HRESULT CreateMenu (IAvnMenuEvents* cb, IAvnMenu** ppv, bool isTopLevel) = 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 7a433bfd9f..ad492264fd 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); +extern IAvnMenu* CreateAppMenu(IAvnMenuEvents* events, bool isTopLevel); 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 a63353bc0a..216b531e0f 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) override + virtual HRESULT CreateMenu (IAvnMenuEvents* cb, IAvnMenu** ppv, bool isTopLevel) override { - *ppv = ::CreateAppMenu(cb); + *ppv = ::CreateAppMenu(cb, isTopLevel); return S_OK; } diff --git a/native/Avalonia.Native/src/OSX/menu.h b/native/Avalonia.Native/src/OSX/menu.h index e4353d10ac..6af5d4c7b4 100644 --- a/native/Avalonia.Native/src/OSX/menu.h +++ b/native/Avalonia.Native/src/OSX/menu.h @@ -59,11 +59,12 @@ class AvnAppMenu : public ComSingleObject private: AvnMenu* _native; ComPtr _baseEvents; + bool _isTopLevel; public: FORWARD_IUNKNOWN() - AvnAppMenu(IAvnMenuEvents* events); + AvnAppMenu(IAvnMenuEvents* events, bool isTopLevel); AvnMenu* GetNative(); diff --git a/native/Avalonia.Native/src/OSX/menu.mm b/native/Avalonia.Native/src/OSX/menu.mm index 29bed72980..da85955019 100644 --- a/native/Avalonia.Native/src/OSX/menu.mm +++ b/native/Avalonia.Native/src/OSX/menu.mm @@ -169,11 +169,18 @@ void AvnAppMenuItem::RaiseOnClicked() } } -AvnAppMenu::AvnAppMenu(IAvnMenuEvents* events) +AvnAppMenu::AvnAppMenu(IAvnMenuEvents* events, bool isTopLevel) { + _isTopLevel = isTopLevel; _baseEvents = events; id del = [[AvnMenuDelegate alloc] initWithParent: this]; _native = [[AvnMenu alloc] initWithDelegate: del]; + + + if(_isTopLevel) + { + [_native insertItem: [NSMenuItem new] atIndex:0]; + } } @@ -194,6 +201,11 @@ HRESULT AvnAppMenu::InsertItem(int index, IAvnMenuItem *item) { @autoreleasepool { + if(_isTopLevel) + { + index++; + } + auto avnMenuItem = dynamic_cast(item); if(avnMenuItem != nullptr) @@ -272,11 +284,11 @@ HRESULT AvnAppMenu::Clear() @end -extern IAvnMenu* CreateAppMenu(IAvnMenuEvents* cb) +extern IAvnMenu* CreateAppMenu(IAvnMenuEvents* cb, bool isTopLevel) { @autoreleasepool { - return new AvnAppMenu(cb); + return new AvnAppMenu(cb, isTopLevel); } } diff --git a/src/Avalonia.Native/AvaloniaNativeMenuExporter.cs b/src/Avalonia.Native/AvaloniaNativeMenuExporter.cs index 50df814ac8..2b682b37c2 100644 --- a/src/Avalonia.Native/AvaloniaNativeMenuExporter.cs +++ b/src/Avalonia.Native/AvaloniaNativeMenuExporter.cs @@ -84,9 +84,11 @@ namespace Avalonia.Native if (appMenu == null) { - appMenu = CreateDefaultAppMenu(); - SetMenu(appMenu); + appMenu = CreateDefaultAppMenu(); + NativeMenu.SetMenu(Application.Current, appMenu); } + + SetMenu(appMenu); } else { @@ -131,7 +133,7 @@ namespace Avalonia.Native if (_nativeMenu is null) { - _nativeMenu = IAvnMenu.Create(_factory); + _nativeMenu = IAvnMenu.Create(_factory, false); _nativeMenu.Initialise(this, appMenuHolder, ""); @@ -150,7 +152,7 @@ namespace Avalonia.Native { if (_nativeMenu is null) { - _nativeMenu = IAvnMenu.Create(_factory); + _nativeMenu = IAvnMenu.Create(_factory, true); _nativeMenu.Initialise(this, menu, ""); } diff --git a/src/Avalonia.Native/IAvnMenu.cs b/src/Avalonia.Native/IAvnMenu.cs index 8a49559a02..555f1074b1 100644 --- a/src/Avalonia.Native/IAvnMenu.cs +++ b/src/Avalonia.Native/IAvnMenu.cs @@ -39,11 +39,11 @@ namespace Avalonia.Native.Interop internal NativeMenu ManagedMenu { get; private set; } - public static IAvnMenu Create(IAvaloniaNativeFactory factory) + public static IAvnMenu Create(IAvaloniaNativeFactory factory, bool isTopLevel) { var events = new MenuEvents(); - var menu = factory.CreateMenu(events); + var menu = factory.CreateMenu(events, isTopLevel); events.Initialise(menu); diff --git a/src/Avalonia.Native/IAvnMenuItem.cs b/src/Avalonia.Native/IAvnMenuItem.cs index a9730920f1..cd15f27eb7 100644 --- a/src/Avalonia.Native/IAvnMenuItem.cs +++ b/src/Avalonia.Native/IAvnMenuItem.cs @@ -114,7 +114,7 @@ namespace Avalonia.Native.Interop { if (_subMenu == null) { - _subMenu = IAvnMenu.Create(factory); + _subMenu = IAvnMenu.Create(factory, false); _subMenu.Initialise(exporter, item.Menu, item.Header);