Browse Source

Make a separate DBus connections so that things doesnt mix up in one session and cause ObjectPath conflicts.

pull/6610/head
Jumar Macato 5 years ago
parent
commit
ce7333413b
  1. 7
      src/Avalonia.FreeDesktop/DBusHelper.cs
  2. 7
      src/Avalonia.FreeDesktop/DBusMenuExporter.cs
  3. 13
      src/Avalonia.FreeDesktop/DBusSystemTray/DBusSysTray.cs
  4. 47
      src/Avalonia.X11/X11TrayIconImpl.cs

7
src/Avalonia.FreeDesktop/DBusHelper.cs

@ -51,8 +51,11 @@ namespace Avalonia.FreeDesktop
public static Connection TryInitialize(string dbusAddress = null) public static Connection TryInitialize(string dbusAddress = null)
{ {
if (Connection != null) return Connection ?? TryGetConnection(dbusAddress);
return Connection; }
public static Connection TryGetConnection(string dbusAddress = null)
{
var oldContext = SynchronizationContext.Current; var oldContext = SynchronizationContext.Current;
try try
{ {

7
src/Avalonia.FreeDesktop/DBusMenuExporter.cs

@ -25,12 +25,9 @@ namespace Avalonia.FreeDesktop
return new DBusMenuExporterImpl(DBusHelper.Connection, xid); 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 new DBusMenuExporterImpl(currentConection, path);
return null;
return new DBusMenuExporterImpl(DBusHelper.Connection, path);
} }
public static ObjectPath GenerateDBusMenuObjPath => "/net/avaloniaui/dbusmenu/" public static ObjectPath GenerateDBusMenuObjPath => "/net/avaloniaui/dbusmenu/"

13
src/Avalonia.FreeDesktop/DBusSystemTray/DBusSysTray.cs

@ -14,16 +14,22 @@ namespace Avalonia.FreeDesktop.DBusSystemTray
public class DBusSysTray : IDisposable public class DBusSysTray : IDisposable
{ {
private static int s_trayIconInstanceId = 0; private static int s_trayIconInstanceId = 0;
private IStatusNotifierWatcher _statusNotifierWatcher; private IStatusNotifierWatcher _statusNotifierWatcher;
private string _sysTrayServiceName; private string _sysTrayServiceName;
private StatusNotifierItemDbusObj _statusNotifierItemDbusObj; private StatusNotifierItemDbusObj _statusNotifierItemDbusObj;
private Connection con;
private static int GetTID() => s_trayIconInstanceId++; private static int GetTID() => s_trayIconInstanceId++;
public DBusSysTray(Connection connection)
{
con = connection;
}
public async void Initialize(ObjectPath dbusmenuPath) public async void Initialize(ObjectPath dbusmenuPath)
{ {
var con = DBusHelper.Connection;
_statusNotifierWatcher = con.CreateProxy<IStatusNotifierWatcher>("org.kde.StatusNotifierWatcher", _statusNotifierWatcher = con.CreateProxy<IStatusNotifierWatcher>("org.kde.StatusNotifierWatcher",
"/StatusNotifierWatcher"); "/StatusNotifierWatcher");
@ -88,7 +94,6 @@ namespace Avalonia.FreeDesktop.DBusSystemTray
public StatusNotifierItemDbusObj(ObjectPath dbusmenuPath) public StatusNotifierItemDbusObj(ObjectPath dbusmenuPath)
{ {
var ID = Guid.NewGuid().ToString().Replace("-", "");
ObjectPath = new ObjectPath($"/StatusNotifierItem"); ObjectPath = new ObjectPath($"/StatusNotifierItem");
_backingProperties = new StatusNotifierItemProperties _backingProperties = new StatusNotifierItemProperties

47
src/Avalonia.X11/X11TrayIconImpl.cs

@ -5,30 +5,33 @@ using Avalonia.Controls.Platform;
using Avalonia.FreeDesktop; using Avalonia.FreeDesktop;
using Avalonia.FreeDesktop.DBusSystemTray; using Avalonia.FreeDesktop.DBusSystemTray;
using Avalonia.Platform; using Avalonia.Platform;
using Tmds.DBus;
namespace Avalonia.X11 namespace Avalonia.X11
{ {
internal class X11TrayIconImpl : ITrayIconImpl internal class X11TrayIconImpl : ITrayIconImpl
{ {
private DBusSysTray _dBusSysTray;
private readonly DBusSysTray _dBusSysTray; private readonly ObjectPath _dbusmenuPath;
private X11IconData lastIcon;
public INativeMenuExporter MenuExporter { get; } public INativeMenuExporter MenuExporter { get; }
public Action OnClicked { get; set; } public Action OnClicked { get; set; }
public X11TrayIconImpl() public X11TrayIconImpl()
{ {
_dBusSysTray = new DBusSysTray(); var con = DBusHelper.TryGetConnection();
var dbusmenuPath = DBusMenuExporter.GenerateDBusMenuObjPath; _dbusmenuPath = DBusMenuExporter.GenerateDBusMenuObjPath;
MenuExporter = DBusMenuExporter.TryCreateDetachedNativeMenu(dbusmenuPath); MenuExporter = DBusMenuExporter.TryCreateDetachedNativeMenu(_dbusmenuPath, con);
_dBusSysTray = new DBusSysTray(con);
_dBusSysTray.Initialize(dbusmenuPath); _dBusSysTray.Initialize(_dbusmenuPath);
_dBusSysTray.SetActivationDelegate(() =>
{
OnClicked?.Invoke();
});
} }
public void Dispose() public void Dispose()
@ -39,9 +42,7 @@ namespace Avalonia.X11
public void SetIcon(IWindowIconImpl icon) public void SetIcon(IWindowIconImpl icon)
{ {
if (!(icon is X11IconData x11icon)) return; if (!(icon is X11IconData x11icon)) return;
lastIcon = x11icon;
var w = (int)x11icon.Data[0]; var w = (int)x11icon.Data[0];
var h = (int)x11icon.Data[1]; var h = (int)x11icon.Data[1];
@ -61,22 +62,18 @@ namespace Avalonia.X11
} }
_dBusSysTray.SetIcon(new DbusPixmap(w, h, pixByteArray)); _dBusSysTray.SetIcon(new DbusPixmap(w, h, pixByteArray));
_dBusSysTray.SetActivationDelegate(() =>
{
OnClicked?.Invoke();
});
} }
public void SetIsVisible(bool visible) public void SetIsVisible(bool visible)
{ {
if (visible && lastIcon != null) if (visible)
{ {
SetIcon(lastIcon); // _dBusSysTray = new DBusSysTray();
// _dBusSysTray.Initialize(_dbusmenuPath);
} }
else else
{ {
_dBusSysTray.SetIcon(new DbusPixmap(1, 1, new byte[] { 0, 0, 0, 0 })); // _dBusSysTray?.Dispose();
} }
} }

Loading…
Cancel
Save