From 448b549034f60bbe895dbf164ad79f7c0a012dd1 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 25 Sep 2019 21:01:51 +0100 Subject: [PATCH] set menu on per window basis. --- native/Avalonia.Native/inc/avalonia-native.h | 2 +- .../AvaloniaNativeMenuExporter.cs | 17 ++++++++++++----- src/Avalonia.Native/WindowImpl.cs | 2 +- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/native/Avalonia.Native/inc/avalonia-native.h b/native/Avalonia.Native/inc/avalonia-native.h index 4cec243d0b..cbd90e1dcf 100644 --- a/native/Avalonia.Native/inc/avalonia-native.h +++ b/native/Avalonia.Native/inc/avalonia-native.h @@ -208,7 +208,7 @@ AVNCOM(IAvnWindowBase, 02) : IUnknown 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 HRESULT ObtainMainMenu(IAvnAppMenu** retOut) = 0; virtual bool TryLock() = 0; virtual void Unlock() = 0; }; diff --git a/src/Avalonia.Native/AvaloniaNativeMenuExporter.cs b/src/Avalonia.Native/AvaloniaNativeMenuExporter.cs index 5e473d9aa8..1ec5db149c 100644 --- a/src/Avalonia.Native/AvaloniaNativeMenuExporter.cs +++ b/src/Avalonia.Native/AvaloniaNativeMenuExporter.cs @@ -49,10 +49,12 @@ namespace Avalonia.Native private Dictionary _itemsToIds = new Dictionary(); private uint _revision = 1; private bool _exported = false; + private IAvnWindow _nativeWindow; - public AvaloniaNativeMenuExporter(IAvaloniaNativeFactory factory) + public AvaloniaNativeMenuExporter(IAvnWindow nativeWindow, IAvaloniaNativeFactory factory) { _factory = factory; + _nativeWindow = nativeWindow; } public bool IsNativeMenuExported => _exported; @@ -113,8 +115,7 @@ namespace Avalonia.Native LayoutUpdated?.Invoke((_revision, 0)); - SetMenu(_menu.Items); - + SetMenu(_nativeWindow, _menu.Items); _exported = true; } @@ -231,8 +232,14 @@ namespace Avalonia.Native private void SetMenu(IAvnWindow avnWindow, ICollection menuItems) { - - var appMenu = _factory.ObtainAppMenu(); + var appMenu = avnWindow.ObtainMainMenu(); + + if(appMenu is null) + { + appMenu = _factory.CreateMenu(); + + avnWindow.SetMainMenu(appMenu); + } appMenu.Clear(); diff --git a/src/Avalonia.Native/WindowImpl.cs b/src/Avalonia.Native/WindowImpl.cs index 02c20b04ee..a7828bedaf 100644 --- a/src/Avalonia.Native/WindowImpl.cs +++ b/src/Avalonia.Native/WindowImpl.cs @@ -24,7 +24,7 @@ namespace Avalonia.Native Init(_native = factory.CreateWindow(e), factory.CreateScreens()); } - NativeMenuExporter = new AvaloniaNativeMenuExporter(factory); + NativeMenuExporter = new AvaloniaNativeMenuExporter(_native, factory); } class WindowEvents : WindowBaseEvents, IAvnWindowEvents