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

52
src/Avalonia.Native/AvaloniaNativeMenuExporter.cs

@ -17,6 +17,7 @@ namespace Avalonia.Native
private IAvnWindow _nativeWindow; private IAvnWindow _nativeWindow;
private NativeMenu _menu; private NativeMenu _menu;
private __MicroComIAvnMenuProxy _nativeMenu; private __MicroComIAvnMenuProxy _nativeMenu;
private IAvnTrayIcon _trayIcon;
public AvaloniaNativeMenuExporter(IAvnWindow nativeWindow, IAvaloniaNativeFactory factory) public AvaloniaNativeMenuExporter(IAvnWindow nativeWindow, IAvaloniaNativeFactory factory)
{ {
@ -33,6 +34,14 @@ namespace Avalonia.Native
DoLayoutReset(); DoLayoutReset();
} }
public AvaloniaNativeMenuExporter(IAvnTrayIcon trayIcon, IAvaloniaNativeFactory factory)
{
_factory = factory;
_trayIcon = trayIcon;
DoLayoutReset();
}
public bool IsNativeMenuExported => _exported; public bool IsNativeMenuExported => _exported;
public event EventHandler OnIsNativeMenuExportedChanged; public event EventHandler OnIsNativeMenuExportedChanged;
@ -82,15 +91,25 @@ namespace Avalonia.Native
if (_nativeWindow is null) 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(); if (_menu != null)
NativeMenu.SetMenu(Application.Current, appMenu); {
SetMenu(_trayIcon, _menu);
}
} }
SetMenu(appMenu);
} }
else else
{ {
@ -171,5 +190,26 @@ namespace Avalonia.Native
avnWindow.SetMainMenu(_nativeMenu); 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) public TrayIconImpl(IAvaloniaNativeFactory factory)
{ {
_native = factory.CreateTrayIcon(new TrayIconEvents(this)); _native = factory.CreateTrayIcon(new TrayIconEvents(this));
MenuExporter = new AvaloniaNativeMenuExporter(_native, factory);
} }
public void Dispose() public void Dispose()

Loading…
Cancel
Save