Browse Source

Tray icon osx, implement visibility toggle and lifetime management.

pull/6610/head
Dan Walmsley 4 years ago
parent
commit
a3c8396cf5
  1. 4
      native/Avalonia.Native/src/OSX/trayicon.h
  2. 26
      native/Avalonia.Native/src/OSX/trayicon.mm
  3. 11
      src/Avalonia.Controls/TrayIcon.cs
  4. 4
      src/Avalonia.Native/TrayIconImpl.cs
  5. 1
      src/Avalonia.Native/avn.idl

4
native/Avalonia.Native/src/OSX/trayicon.h

@ -22,9 +22,13 @@ public:
AvnTrayIcon(IAvnTrayIconEvents* events);
~AvnTrayIcon ();
virtual HRESULT SetIcon (void* data, size_t length) override;
virtual HRESULT SetMenu (IAvnMenu* menu) override;
virtual HRESULT SetIsVisible (bool isVisible) override;
};
#endif /* trayicon_h */

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

@ -14,7 +14,17 @@ AvnTrayIcon::AvnTrayIcon(IAvnTrayIconEvents* events)
{
_events = events;
_native = [[NSStatusBar systemStatusBar] statusItemWithLength: NSSquareStatusItemLength];
_native = [[NSStatusBar systemStatusBar] statusItemWithLength: NSSquareStatusItemLength];
}
AvnTrayIcon::~AvnTrayIcon()
{
if(_native != nullptr)
{
[[_native statusBar] removeStatusItem:_native];
_native = nullptr;
}
}
HRESULT AvnTrayIcon::SetIcon (void* data, size_t length)
@ -57,9 +67,21 @@ HRESULT AvnTrayIcon::SetMenu (IAvnMenu* menu)
if(appMenu != nullptr)
{
[_native setMenu:appMenu->GetNative()];
[_native setMenu:appMenu->GetNative()];
}
}
return S_OK;
}
HRESULT AvnTrayIcon::SetIsVisible(bool isVisible)
{
START_COM_CALL;
@autoreleasepool
{
[_native setVisible:isVisible];
}
return S_OK;
}

11
src/Avalonia.Controls/TrayIcon.cs

@ -26,17 +26,6 @@ namespace Avalonia.Controls
_impl.SetIsVisible(IsVisible);
_impl.OnClicked = () => Clicked?.Invoke(this, EventArgs.Empty);
var timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(1);
timer.Tick += Timer_Tick;
timer.Start();
}
private void Timer_Tick(object sender, EventArgs e)
{
IsVisible = !IsVisible;
}
public TrayIcon () : this(PlatformManager.CreateTrayIcon())

4
src/Avalonia.Native/TrayIconImpl.cs

@ -41,7 +41,7 @@ namespace Avalonia.Native
public void Dispose()
{
_native.Dispose();
}
public unsafe void SetIcon(IWindowIconImpl? icon)
@ -73,7 +73,7 @@ namespace Avalonia.Native
public void SetIsVisible(bool visible)
{
_native.SetIsVisible(visible.AsComBool());
}
public INativeMenuExporter? MenuExporter { get; }

1
src/Avalonia.Native/avn.idl

@ -671,6 +671,7 @@ interface IAvnTrayIcon : IUnknown
{
HRESULT SetIcon(void* data, size_t length);
HRESULT SetMenu(IAvnMenu* menu);
HRESULT SetIsVisible(bool isVisible);
}
[uuid(a687a6d9-73aa-4fef-9b4a-61587d7285d3)]

Loading…
Cancel
Save