diff --git a/src/Avalonia.FreeDesktop/DBusSystemTray/DBusSysTray.cs b/src/Avalonia.FreeDesktop/DBusSystemTray/DBusSysTray.cs index 83ae9686d1..8fd324e84c 100644 --- a/src/Avalonia.FreeDesktop/DBusSystemTray/DBusSysTray.cs +++ b/src/Avalonia.FreeDesktop/DBusSystemTray/DBusSysTray.cs @@ -17,6 +17,7 @@ namespace Avalonia.FreeDesktop.DBusSystemTray private IStatusNotifierWatcher _statusNotifierWatcher; private string _sysTrayServiceName; private StatusNotifierItemDbusObj _statusNotifierItemDbusObj; + private Action _activateDelegate; public INativeMenuExporter NativeMenuExporter { get; private set; } @@ -63,21 +64,33 @@ namespace Avalonia.FreeDesktop.DBusSystemTray { _statusNotifierItemDbusObj.SetTitleAndTooltip(text); } - } + public void SetActivationDelegate(Action activationDelegate) + { + _statusNotifierItemDbusObj.ActivationDelegate = activationDelegate; + } + } + + /// + /// DBus Object used for setting system tray icons. + /// + /// + /// Useful guide: https://web.archive.org/web/20210818173850/https://www.notmart.org/misc/statusnotifieritem/statusnotifieritem.html + /// internal class StatusNotifierItemDbusObj : IStatusNotifierItem { + private readonly StatusNotifierItemProperties _backingProperties; private event Action OnPropertyChange; public event Action OnTitleChanged; public event Action OnIconChanged; public event Action OnAttentionIconChanged; public event Action OnOverlayIconChanged; public event Action OnTooltipChanged; - + public INativeMenuExporter NativeMenuExporter { get; set; } + public Action NewStatusAsync { get; set; } + public Action ActivationDelegate { get; set; } public ObjectPath ObjectPath { get; } - - readonly StatusNotifierItemProperties _backingProperties; - + public StatusNotifierItemDbusObj() { var ID = Guid.NewGuid().ToString().Replace("-", ""); @@ -95,20 +108,17 @@ namespace Avalonia.FreeDesktop.DBusSystemTray }; } - public INativeMenuExporter NativeMenuExporter; - public async Task ContextMenuAsync(int X, int Y) { } public async Task ActivateAsync(int X, int Y) { - // OnPropertyChange?.Invoke(new PropertyChanges()); + ActivationDelegate?.Invoke(); } public async Task SecondaryActivateAsync(int X, int Y) { - //throw new NotImplementedException();5 } public async Task ScrollAsync(int Delta, string Orientation) @@ -129,8 +139,7 @@ namespace Avalonia.FreeDesktop.DBusSystemTray OnTitleChanged += handler; return Disposable.Create(() => OnTitleChanged -= handler); } - - + public async Task WatchNewIconAsync(Action handler, Action onError = null) { OnIconChanged += handler; @@ -171,8 +180,6 @@ namespace Avalonia.FreeDesktop.DBusSystemTray return _backingProperties; } - public Action NewStatusAsync { get; set; } - public Task SetAsync(string prop, object val) => Task.CompletedTask; public async Task WatchPropertiesAsync(Action handler) diff --git a/src/Avalonia.X11/X11TrayIconImpl.cs b/src/Avalonia.X11/X11TrayIconImpl.cs index 069b501245..0971ee51ee 100644 --- a/src/Avalonia.X11/X11TrayIconImpl.cs +++ b/src/Avalonia.X11/X11TrayIconImpl.cs @@ -14,6 +14,9 @@ namespace Avalonia.X11 private readonly DBusSysTray _dBusSysTray; + private X11IconData lastIcon; + + public X11TrayIconImpl() { _dBusSysTray = new DBusSysTray(); @@ -30,6 +33,8 @@ namespace Avalonia.X11 { if (!(icon is X11IconData x11icon)) return; + lastIcon = x11icon; + var w = (int)x11icon.Data[0]; var h = (int)x11icon.Data[1]; @@ -49,11 +54,23 @@ namespace Avalonia.X11 } _dBusSysTray.SetIcon(new Pixmap(w, h, pixByteArray)); + + _dBusSysTray.SetActivationDelegate(() => + { + OnClicked?.Invoke(); + }); } public void SetIsVisible(bool visible) { - + if (visible && lastIcon != null) + { + SetIcon(lastIcon); + } + else + { + _dBusSysTray.SetIcon(new Pixmap(1, 1, new byte[] { 0, 0, 0, 0 })); + } } public void SetToolTipText(string text)