Browse Source

make native menu work

pull/6610/head
Jumar Macato 5 years ago
parent
commit
602dcff35d
  1. 28
      src/Avalonia.FreeDesktop/DBusSystemTray/DBusSysTray.cs
  2. 11
      src/Avalonia.X11/X11TrayIconImpl.cs

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

@ -17,13 +17,10 @@ namespace Avalonia.FreeDesktop.DBusSystemTray
private IStatusNotifierWatcher _statusNotifierWatcher; private IStatusNotifierWatcher _statusNotifierWatcher;
private string _sysTrayServiceName; private string _sysTrayServiceName;
private StatusNotifierItemDbusObj _statusNotifierItemDbusObj; private StatusNotifierItemDbusObj _statusNotifierItemDbusObj;
private Action _activateDelegate;
public INativeMenuExporter NativeMenuExporter { get; private set; }
private static int GetTID() => s_trayIconInstanceId++; private static int GetTID() => s_trayIconInstanceId++;
public async void Initialize() public async void Initialize(ObjectPath dbusmenuPath)
{ {
var con = DBusHelper.Connection; var con = DBusHelper.Connection;
@ -34,16 +31,14 @@ namespace Avalonia.FreeDesktop.DBusSystemTray
var tid = GetTID(); var tid = GetTID();
_sysTrayServiceName = $"org.kde.StatusNotifierItem-{pid}-{tid}"; _sysTrayServiceName = $"org.kde.StatusNotifierItem-{pid}-{tid}";
_statusNotifierItemDbusObj = new StatusNotifierItemDbusObj(); _statusNotifierItemDbusObj = new StatusNotifierItemDbusObj(dbusmenuPath);
await con.RegisterObjectAsync(_statusNotifierItemDbusObj); await con.RegisterObjectAsync(_statusNotifierItemDbusObj);
await con.RegisterServiceAsync(_sysTrayServiceName); await con.RegisterServiceAsync(_sysTrayServiceName);
await _statusNotifierWatcher.RegisterStatusNotifierItemAsync(_sysTrayServiceName); await _statusNotifierWatcher.RegisterStatusNotifierItemAsync(_sysTrayServiceName);
}
NativeMenuExporter = _statusNotifierItemDbusObj.NativeMenuExporter;
}
public async void Dispose() public async void Dispose()
{ {
@ -86,26 +81,22 @@ namespace Avalonia.FreeDesktop.DBusSystemTray
public event Action OnAttentionIconChanged; public event Action OnAttentionIconChanged;
public event Action OnOverlayIconChanged; public event Action OnOverlayIconChanged;
public event Action OnTooltipChanged; public event Action OnTooltipChanged;
public INativeMenuExporter NativeMenuExporter { get; set; } public Action<INativeMenuExporter> SetNativeMenuExporter { get; set; }
public Action<string> NewStatusAsync { get; set; } public Action<string> NewStatusAsync { get; set; }
public Action ActivationDelegate { get; set; } public Action ActivationDelegate { get; set; }
public ObjectPath ObjectPath { get; } public ObjectPath ObjectPath { get; }
public StatusNotifierItemDbusObj() public StatusNotifierItemDbusObj(ObjectPath dbusmenuPath)
{ {
var ID = Guid.NewGuid().ToString().Replace("-", ""); var ID = Guid.NewGuid().ToString().Replace("-", "");
ObjectPath = new ObjectPath($"/StatusNotifierItem"); ObjectPath = new ObjectPath($"/StatusNotifierItem");
var dbusmenuPath = DBusMenuExporter.GenerateDBusMenuObjPath;
NativeMenuExporter = DBusMenuExporter.TryCreateDetachedNativeMenu(dbusmenuPath);
_backingProperties = new StatusNotifierItemProperties _backingProperties = new StatusNotifierItemProperties
{ {
Menu = dbusmenuPath, // Needs a dbus menu somehow Menu = dbusmenuPath, // Needs a dbus menu somehow
ToolTip = new ToolTip("") ToolTip = new ToolTip("")
}; };
InvalidateAll(); InvalidateAll();
} }
@ -175,8 +166,9 @@ namespace Avalonia.FreeDesktop.DBusSystemTray
{ {
if (prop.Contains("Menu")) if (prop.Contains("Menu"))
{ {
return _backingProperties.Menu; return _backingProperties.Menu;
} }
return default; return default;
} }

11
src/Avalonia.X11/X11TrayIconImpl.cs

@ -2,6 +2,7 @@
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using Avalonia.Controls.Platform; using Avalonia.Controls.Platform;
using Avalonia.FreeDesktop;
using Avalonia.FreeDesktop.DBusSystemTray; using Avalonia.FreeDesktop.DBusSystemTray;
using Avalonia.Platform; using Avalonia.Platform;
@ -20,8 +21,14 @@ namespace Avalonia.X11
public X11TrayIconImpl() public X11TrayIconImpl()
{ {
_dBusSysTray = new DBusSysTray(); _dBusSysTray = new DBusSysTray();
_dBusSysTray.Initialize();
MenuExporter = _dBusSysTray.NativeMenuExporter;
var dbusmenuPath = DBusMenuExporter.GenerateDBusMenuObjPath;
MenuExporter = DBusMenuExporter.TryCreateDetachedNativeMenu(dbusmenuPath);
_dBusSysTray.Initialize(dbusmenuPath);
} }
public void Dispose() public void Dispose()

Loading…
Cancel
Save