Browse Source

Tray icon osx, implement visibility toggle and lifetime management.

Dan Walmsley 4 years ago
parent
commit
a3c8396cf5

+ 4 - 0
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 */

+ 24 - 2
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;
+}

+ 0 - 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())

+ 2 - 2
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 - 0
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)]