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)
{
if (Connection != null)
return Connection;
return Connection ?? TryGetConnection(dbusAddress);
}
public static Connection TryGetConnection(string dbusAddress = null)
{
var oldContext = SynchronizationContext.Current;
try
{

7
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/"

13
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<IStatusNotifierWatcher>("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

47
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();
}
}

Loading…
Cancel
Save