From ce7333413bbfb927a57e64c2d2990ba564b094e3 Mon Sep 17 00:00:00 2001 From: Jumar Macato <16554748+jmacato@users.noreply.github.com> Date: Thu, 23 Sep 2021 10:14:07 +0800 Subject: [PATCH] Make a separate DBus connections so that things doesnt mix up in one session and cause ObjectPath conflicts. --- src/Avalonia.FreeDesktop/DBusHelper.cs | 7 ++- src/Avalonia.FreeDesktop/DBusMenuExporter.cs | 7 +-- .../DBusSystemTray/DBusSysTray.cs | 13 +++-- src/Avalonia.X11/X11TrayIconImpl.cs | 47 +++++++++---------- 4 files changed, 38 insertions(+), 36 deletions(-) diff --git a/src/Avalonia.FreeDesktop/DBusHelper.cs b/src/Avalonia.FreeDesktop/DBusHelper.cs index 7996a94dd0..4e23711ed4 100644 --- a/src/Avalonia.FreeDesktop/DBusHelper.cs +++ b/src/Avalonia.FreeDesktop/DBusHelper.cs @@ -51,8 +51,11 @@ namespace Avalonia.FreeDesktop public static Connection TryInitialize(string dbusAddress = null) { - if (Connection != null) - return Connection; + return Connection ?? TryGetConnection(dbusAddress); + } + + public static Connection TryGetConnection(string dbusAddress = null) + { var oldContext = SynchronizationContext.Current; try { diff --git a/src/Avalonia.FreeDesktop/DBusMenuExporter.cs b/src/Avalonia.FreeDesktop/DBusMenuExporter.cs index b4b3b23942..dbfa04c1f0 100644 --- a/src/Avalonia.FreeDesktop/DBusMenuExporter.cs +++ b/src/Avalonia.FreeDesktop/DBusMenuExporter.cs @@ -25,12 +25,9 @@ namespace Avalonia.FreeDesktop return new DBusMenuExporterImpl(DBusHelper.Connection, xid); } - public static INativeMenuExporter TryCreateDetachedNativeMenu(ObjectPath path) + public static INativeMenuExporter TryCreateDetachedNativeMenu(ObjectPath path, Connection currentConection) { - if (DBusHelper.Connection == null) - return null; - - return new DBusMenuExporterImpl(DBusHelper.Connection, path); + return new DBusMenuExporterImpl(currentConection, path); } public static ObjectPath GenerateDBusMenuObjPath => "/net/avaloniaui/dbusmenu/" diff --git a/src/Avalonia.FreeDesktop/DBusSystemTray/DBusSysTray.cs b/src/Avalonia.FreeDesktop/DBusSystemTray/DBusSysTray.cs index 7c0b0f6e55..ce3e7da726 100644 --- a/src/Avalonia.FreeDesktop/DBusSystemTray/DBusSysTray.cs +++ b/src/Avalonia.FreeDesktop/DBusSystemTray/DBusSysTray.cs @@ -14,16 +14,22 @@ namespace Avalonia.FreeDesktop.DBusSystemTray public class DBusSysTray : IDisposable { private static int s_trayIconInstanceId = 0; + private IStatusNotifierWatcher _statusNotifierWatcher; private string _sysTrayServiceName; private StatusNotifierItemDbusObj _statusNotifierItemDbusObj; - + + private Connection con; + private static int GetTID() => s_trayIconInstanceId++; + public DBusSysTray(Connection connection) + { + con = connection; + } + public async void Initialize(ObjectPath dbusmenuPath) { - var con = DBusHelper.Connection; - _statusNotifierWatcher = con.CreateProxy("org.kde.StatusNotifierWatcher", "/StatusNotifierWatcher"); @@ -88,7 +94,6 @@ namespace Avalonia.FreeDesktop.DBusSystemTray public StatusNotifierItemDbusObj(ObjectPath dbusmenuPath) { - var ID = Guid.NewGuid().ToString().Replace("-", ""); ObjectPath = new ObjectPath($"/StatusNotifierItem"); _backingProperties = new StatusNotifierItemProperties diff --git a/src/Avalonia.X11/X11TrayIconImpl.cs b/src/Avalonia.X11/X11TrayIconImpl.cs index dc81a85b7a..3d6a3cc20b 100644 --- a/src/Avalonia.X11/X11TrayIconImpl.cs +++ b/src/Avalonia.X11/X11TrayIconImpl.cs @@ -5,30 +5,33 @@ using Avalonia.Controls.Platform; using Avalonia.FreeDesktop; using Avalonia.FreeDesktop.DBusSystemTray; using Avalonia.Platform; +using Tmds.DBus; namespace Avalonia.X11 { - internal class X11TrayIconImpl : ITrayIconImpl - { - - private readonly DBusSysTray _dBusSysTray; - private X11IconData lastIcon; - + internal class X11TrayIconImpl : ITrayIconImpl + { + private DBusSysTray _dBusSysTray; + private readonly ObjectPath _dbusmenuPath; + public INativeMenuExporter MenuExporter { get; } public Action OnClicked { get; set; } - + public X11TrayIconImpl() { - _dBusSysTray = new DBusSysTray(); - + var con = DBusHelper.TryGetConnection(); - var dbusmenuPath = DBusMenuExporter.GenerateDBusMenuObjPath; - MenuExporter = DBusMenuExporter.TryCreateDetachedNativeMenu(dbusmenuPath); + _dbusmenuPath = DBusMenuExporter.GenerateDBusMenuObjPath; + MenuExporter = DBusMenuExporter.TryCreateDetachedNativeMenu(_dbusmenuPath, con); - - _dBusSysTray.Initialize(dbusmenuPath); - + _dBusSysTray = new DBusSysTray(con); + _dBusSysTray.Initialize(_dbusmenuPath); + + _dBusSysTray.SetActivationDelegate(() => + { + OnClicked?.Invoke(); + }); } public void Dispose() @@ -39,9 +42,7 @@ namespace Avalonia.X11 public void SetIcon(IWindowIconImpl icon) { if (!(icon is X11IconData x11icon)) return; - - lastIcon = x11icon; - + var w = (int)x11icon.Data[0]; var h = (int)x11icon.Data[1]; @@ -61,22 +62,18 @@ namespace Avalonia.X11 } _dBusSysTray.SetIcon(new DbusPixmap(w, h, pixByteArray)); - - _dBusSysTray.SetActivationDelegate(() => - { - OnClicked?.Invoke(); - }); } public void SetIsVisible(bool visible) { - if (visible && lastIcon != null) + if (visible) { - SetIcon(lastIcon); + // _dBusSysTray = new DBusSysTray(); + // _dBusSysTray.Initialize(_dbusmenuPath); } else { - _dBusSysTray.SetIcon(new DbusPixmap(1, 1, new byte[] { 0, 0, 0, 0 })); + // _dBusSysTray?.Dispose(); } }