From ffcfeaa956d7fdd27e4a126c0f4334f1b4059a87 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 25 Sep 2019 20:37:21 +0100 Subject: [PATCH] work towards menu per window. --- native/Avalonia.Native/inc/avalonia-native.h | 3 +- .../project.pbxproj | 2 -- native/Avalonia.Native/src/OSX/common.h | 1 - native/Avalonia.Native/src/OSX/main.mm | 6 ---- native/Avalonia.Native/src/OSX/menu.mm | 12 ++++---- native/Avalonia.Native/src/OSX/window.h | 1 + native/Avalonia.Native/src/OSX/window.mm | 30 +++++++++++++++++++ .../AvaloniaNativeMenuExporter.cs | 6 ++-- 8 files changed, 44 insertions(+), 17 deletions(-) diff --git a/native/Avalonia.Native/inc/avalonia-native.h b/native/Avalonia.Native/inc/avalonia-native.h index 16d4fa4107..4cec243d0b 100644 --- a/native/Avalonia.Native/inc/avalonia-native.h +++ b/native/Avalonia.Native/inc/avalonia-native.h @@ -175,7 +175,6 @@ public: virtual HRESULT CreateClipboard(IAvnClipboard** ppv) = 0; virtual HRESULT CreateCursorFactory(IAvnCursorFactory** ppv) = 0; virtual HRESULT ObtainGlFeature(IAvnGlFeature** ppv) = 0; - virtual HRESULT ObtainAppMenu (IAvnAppMenu** ppv) = 0; virtual HRESULT CreateMenu (IAvnAppMenu** ppv) = 0; virtual HRESULT CreateMenuItem (IAvnAppMenuItem** ppv) = 0; }; @@ -208,6 +207,8 @@ AVNCOM(IAvnWindowBase, 02) : IUnknown virtual HRESULT SetCursor(IAvnCursor* cursor) = 0; virtual HRESULT CreateGlRenderTarget(IAvnGlSurfaceRenderTarget** ret) = 0; virtual HRESULT GetSoftwareFramebuffer(AvnFramebuffer*ret) = 0; + virtual HRESULT SetMainMenu(IAvnAppMenu* menu) = 0; + virtual HRESULT GetMainMenu(IAvnAppMenu** ret) = 0; virtual bool TryLock() = 0; virtual void Unlock() = 0; }; diff --git a/native/Avalonia.Native/src/OSX/Avalonia.Native.OSX.xcodeproj/project.pbxproj b/native/Avalonia.Native/src/OSX/Avalonia.Native.OSX.xcodeproj/project.pbxproj index 84c3a84b91..a0c138b241 100644 --- a/native/Avalonia.Native/src/OSX/Avalonia.Native.OSX.xcodeproj/project.pbxproj +++ b/native/Avalonia.Native/src/OSX/Avalonia.Native.OSX.xcodeproj/project.pbxproj @@ -34,7 +34,6 @@ 37DDA9B121933371002E132B /* AvnString.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AvnString.h; sourceTree = ""; }; 37E2330E21583241000CB7E2 /* KeyTransform.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = KeyTransform.mm; sourceTree = ""; }; 520624B222973F4100C4DCEF /* menu.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = menu.mm; sourceTree = ""; }; - 5296D43022F30EBC005B125D /* menu.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = menu.h; path = ../../../../../../../../System/Volumes/Data/Users/danwalmsley/repos/Avalonia/native/Avalonia.Native/src/OSX/menu.h; sourceTree = ""; }; 5B21A981216530F500CEE36E /* cursor.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = cursor.mm; sourceTree = ""; }; 5B8BD94E215BFEA6005ED2A7 /* clipboard.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = clipboard.mm; sourceTree = ""; }; 5BF943652167AD1D009CAE35 /* cursor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = cursor.h; sourceTree = ""; }; @@ -89,7 +88,6 @@ 37C09D8A21581EF2006A6758 /* window.h */, AB00E4F62147CA920032A60A /* main.mm */, 520624B222973F4100C4DCEF /* menu.mm */, - 5296D43022F30EBC005B125D /* menu.h */, 37A517B22159597E00FBA241 /* Screens.mm */, 37C09D8721580FE4006A6758 /* SystemDialogs.mm */, AB7A61F02147C815003C5833 /* Products */, diff --git a/native/Avalonia.Native/src/OSX/common.h b/native/Avalonia.Native/src/OSX/common.h index c066ebb498..ccd0a5a9b9 100644 --- a/native/Avalonia.Native/src/OSX/common.h +++ b/native/Avalonia.Native/src/OSX/common.h @@ -19,7 +19,6 @@ extern IAvnClipboard* CreateClipboard(); extern IAvnCursorFactory* CreateCursorFactory(); extern IAvnGlFeature* GetGlFeature(); extern IAvnGlSurfaceRenderTarget* CreateGlRenderTarget(NSWindow* window, NSView* view); -extern IAvnAppMenu* GetAppMenu(); extern IAvnAppMenu* CreateAppMenu(); extern IAvnAppMenuItem* CreateAppMenuItem(); diff --git a/native/Avalonia.Native/src/OSX/main.mm b/native/Avalonia.Native/src/OSX/main.mm index 159f01d1d7..bdea26b761 100644 --- a/native/Avalonia.Native/src/OSX/main.mm +++ b/native/Avalonia.Native/src/OSX/main.mm @@ -225,12 +225,6 @@ public: return S_OK; } - virtual HRESULT ObtainAppMenu(IAvnAppMenu** ppv) override - { - *ppv = ::GetAppMenu(); - return S_OK; - } - virtual HRESULT CreateMenu (IAvnAppMenu** ppv) override { *ppv = ::CreateAppMenu(); diff --git a/native/Avalonia.Native/src/OSX/menu.mm b/native/Avalonia.Native/src/OSX/menu.mm index f861774b29..89ae31cc35 100644 --- a/native/Avalonia.Native/src/OSX/menu.mm +++ b/native/Avalonia.Native/src/OSX/menu.mm @@ -170,12 +170,13 @@ HRESULT AvnAppMenu::Clear() return S_OK; } -static IAvnAppMenu* s_AppMenu = nullptr; +//static IAvnAppMenu* s_AppMenu = nullptr; -extern IAvnAppMenu* GetAppMenu() +/*extern IAvnAppMenu* GetAppMenu() { @autoreleasepool { + //todo get rid of this method. if(s_AppMenu == nullptr) { id menubar = [NSMenu new]; @@ -183,7 +184,7 @@ extern IAvnAppMenu* GetAppMenu() [NSApp setMainMenu:menubar]; id appMenuItem = [AvnMenuItem new]; - [[NSApp mainMenu] addItem:appMenuItem]; + [menubar addItem:appMenuItem]; [appMenuItem setSubmenu:[AvnMenu new]]; @@ -192,13 +193,14 @@ extern IAvnAppMenu* GetAppMenu() return s_AppMenu; } -} +}*/ extern IAvnAppMenu* CreateAppMenu() { @autoreleasepool { - return new AvnAppMenu(); + id menuBar = [NSMenu new]; + return new AvnAppMenu(menuBar); } } diff --git a/native/Avalonia.Native/src/OSX/window.h b/native/Avalonia.Native/src/OSX/window.h index e2221217f3..1e9cdcfbf8 100644 --- a/native/Avalonia.Native/src/OSX/window.h +++ b/native/Avalonia.Native/src/OSX/window.h @@ -20,6 +20,7 @@ class WindowBaseImpl; -(void) pollModalSession: (NSModalSession _Nonnull) session; -(void) restoreParentWindow; -(bool) shouldTryToHandleEvents; +-(void) setMenu:(NSMenu *)menu; @end struct INSWindowHolder diff --git a/native/Avalonia.Native/src/OSX/window.mm b/native/Avalonia.Native/src/OSX/window.mm index 3347d58004..205b1421d3 100644 --- a/native/Avalonia.Native/src/OSX/window.mm +++ b/native/Avalonia.Native/src/OSX/window.mm @@ -63,9 +63,11 @@ public: SoftwareDrawingOperation CurrentSwDrawingOperation; AvnPoint lastPositionSet; NSString* _lastTitle; + IAvnAppMenu* _mainMenu; WindowBaseImpl(IAvnWindowBaseEvents* events) { + _mainMenu = nullptr; BaseEvents = events; View = [[AvnView alloc] initWithParent:this]; @@ -209,6 +211,27 @@ public: } } + virtual HRESULT SetMainMenu(IAvnAppMenu* menu) override + { + _mainMenu = menu; + + + + return S_OK; + } + + virtual HRESULT GetMainMenu(IAvnAppMenu** ret) override + { + if(ret == nullptr) + { + return E_POINTER; + } + + *ret = _mainMenu; + + return S_OK; + } + virtual bool TryLock() override { @autoreleasepool @@ -1042,6 +1065,7 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent ComPtr _parent; bool _canBecomeKeyAndMain; bool _closed; + NSMenu* _menu; } - (void)dealloc @@ -1065,6 +1089,12 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent } } +-(void) setMenu:(NSMenu *)menu +{ + _menu = menu; + [NSApp setMenu:menu]; +} + -(void) setCanBecomeKeyAndMain { _canBecomeKeyAndMain = true; diff --git a/src/Avalonia.Native/AvaloniaNativeMenuExporter.cs b/src/Avalonia.Native/AvaloniaNativeMenuExporter.cs index 1fade4b1a1..5e473d9aa8 100644 --- a/src/Avalonia.Native/AvaloniaNativeMenuExporter.cs +++ b/src/Avalonia.Native/AvaloniaNativeMenuExporter.cs @@ -114,7 +114,8 @@ namespace Avalonia.Native LayoutUpdated?.Invoke((_revision, 0)); SetMenu(_menu.Items); - + + _exported = true; } @@ -228,8 +229,9 @@ namespace Avalonia.Native } } - private void SetMenu(ICollection menuItems) + private void SetMenu(IAvnWindow avnWindow, ICollection menuItems) { + var appMenu = _factory.ObtainAppMenu(); appMenu.Clear();