Browse Source

Add trayicon menu export support for osx.

pull/6610/head
Dan Walmsley 5 years ago
parent
commit
0e703c9209
  1. 6
      native/Avalonia.Native/src/OSX/trayicon.mm
  2. 52
      src/Avalonia.Native/AvaloniaNativeMenuExporter.cs
  3. 2
      src/Avalonia.Native/TrayIconImpl.cs

6
native/Avalonia.Native/src/OSX/trayicon.mm

@ -1,5 +1,6 @@
#include "common.h"
#include "trayicon.h"
#include "menu.h"
extern IAvnTrayIcon* CreateTrayIcon(IAvnTrayIconEvents* cb)
{
@ -52,7 +53,12 @@ HRESULT AvnTrayIcon::SetMenu (IAvnMenu* menu)
@autoreleasepool
{
auto appMenu = dynamic_cast<AvnAppMenu*>(menu);
if(appMenu != nullptr)
{
[_native setMenu:appMenu->GetNative()];
}
}
return S_OK;

52
src/Avalonia.Native/AvaloniaNativeMenuExporter.cs

@ -17,6 +17,7 @@ namespace Avalonia.Native
private IAvnWindow _nativeWindow;
private NativeMenu _menu;
private __MicroComIAvnMenuProxy _nativeMenu;
private IAvnTrayIcon _trayIcon;
public AvaloniaNativeMenuExporter(IAvnWindow nativeWindow, IAvaloniaNativeFactory factory)
{
@ -33,6 +34,14 @@ namespace Avalonia.Native
DoLayoutReset();
}
public AvaloniaNativeMenuExporter(IAvnTrayIcon trayIcon, IAvaloniaNativeFactory factory)
{
_factory = factory;
_trayIcon = trayIcon;
DoLayoutReset();
}
public bool IsNativeMenuExported => _exported;
public event EventHandler OnIsNativeMenuExportedChanged;
@ -82,15 +91,25 @@ namespace Avalonia.Native
if (_nativeWindow is null)
{
var appMenu = NativeMenu.GetMenu(Application.Current);
if (_trayIcon is null)
{
var appMenu = NativeMenu.GetMenu(Application.Current);
if (appMenu == null)
{
appMenu = CreateDefaultAppMenu();
NativeMenu.SetMenu(Application.Current, appMenu);
}
if (appMenu == null)
SetMenu(appMenu);
}
else
{
appMenu = CreateDefaultAppMenu();
NativeMenu.SetMenu(Application.Current, appMenu);
if (_menu != null)
{
SetMenu(_trayIcon, _menu);
}
}
SetMenu(appMenu);
}
else
{
@ -171,5 +190,26 @@ namespace Avalonia.Native
avnWindow.SetMainMenu(_nativeMenu);
}
}
private void SetMenu(IAvnTrayIcon trayIcon, NativeMenu menu)
{
var setMenu = false;
if (_nativeMenu is null)
{
_nativeMenu = __MicroComIAvnMenuProxy.Create(_factory);
_nativeMenu.Initialize(this, menu, "");
setMenu = true;
}
_nativeMenu.Update(_factory, menu);
if(setMenu)
{
trayIcon.SetMenu(_nativeMenu);
}
}
}
}

2
src/Avalonia.Native/TrayIconImpl.cs

@ -31,6 +31,8 @@ namespace Avalonia.Native
public TrayIconImpl(IAvaloniaNativeFactory factory)
{
_native = factory.CreateTrayIcon(new TrayIconEvents(this));
MenuExporter = new AvaloniaNativeMenuExporter(_native, factory);
}
public void Dispose()

Loading…
Cancel
Save