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)