Browse Source

simplifying stuff

pull/6610/head
Jumar Macato 5 years ago
parent
commit
060e2b6600
  1. 28
      src/Avalonia.FreeDesktop/DBusSystemTray/DBusSysTray.cs
  2. 2
      src/Avalonia.X11/X11Platform.cs
  3. 73
      src/Avalonia.X11/X11TrayIconImpl.cs

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

@ -8,24 +8,19 @@ using Avalonia.Controls.Platform;
using Tmds.DBus; using Tmds.DBus;
[assembly: InternalsVisibleTo(Tmds.DBus.Connection.DynamicAssemblyName)] [assembly: InternalsVisibleTo(Tmds.DBus.Connection.DynamicAssemblyName)]
namespace Avalonia.FreeDesktop.DBusSystemTray namespace Avalonia.FreeDesktop.DBusSystemTray
{ {
public class SNIDBus : IDisposable public class DBusSysTray : IDisposable
{ {
public SNIDBus()
{
}
private static int trayinstanceID = 0; private static int trayinstanceID = 0;
private IStatusNotifierWatcher _snw; private IStatusNotifierWatcher _snw;
private string _sysTraySrvName; private string _sysTraySrvName;
private StatusNotifierItem _statusNotifierItem; private StatusNotifierItemDbusObj _statusNotifierItemDbusObj;
public INativeMenuExporter NativeMenuExporter; public INativeMenuExporter NativeMenuExporter;
private static int GetTID() private static int GetTID()
{ {
return trayinstanceID = new Random().Next(0, 100); return trayinstanceID++;
} }
public async void Initialize() public async void Initialize()
@ -39,16 +34,15 @@ namespace Avalonia.FreeDesktop.DBusSystemTray
var y = GetTID(); var y = GetTID();
_sysTraySrvName = $"org.kde.StatusNotifierItem-{x}-{y}"; _sysTraySrvName = $"org.kde.StatusNotifierItem-{x}-{y}";
_statusNotifierItem = new StatusNotifierItem(); _statusNotifierItemDbusObj = new StatusNotifierItemDbusObj();
await con.RegisterObjectAsync(_statusNotifierItem); await con.RegisterObjectAsync(_statusNotifierItemDbusObj);
await con.RegisterServiceAsync(_sysTraySrvName); await con.RegisterServiceAsync(_sysTraySrvName);
await _snw.RegisterStatusNotifierItemAsync(_sysTraySrvName); await _snw.RegisterStatusNotifierItemAsync(_sysTraySrvName);
NativeMenuExporter = _statusNotifierItem.NativeMenuExporter; NativeMenuExporter = _statusNotifierItemDbusObj.NativeMenuExporter;
} }
public async void Dispose() public async void Dispose()
@ -57,17 +51,17 @@ namespace Avalonia.FreeDesktop.DBusSystemTray
if (await con.UnregisterServiceAsync(_sysTraySrvName)) if (await con.UnregisterServiceAsync(_sysTraySrvName))
{ {
con.UnregisterObject(_statusNotifierItem); con.UnregisterObject(_statusNotifierItemDbusObj);
} }
} }
public void SetIcon(Pixmap pixmap) public void SetIcon(Pixmap pixmap)
{ {
_statusNotifierItem.SetIcon(pixmap); _statusNotifierItemDbusObj.SetIcon(pixmap);
} }
} }
internal class StatusNotifierItem : IStatusNotifierItem internal class StatusNotifierItemDbusObj : IStatusNotifierItem
{ {
private event Action<PropertyChanges> OnPropertyChange; private event Action<PropertyChanges> OnPropertyChange;
public event Action OnTitleChanged; public event Action OnTitleChanged;
@ -81,7 +75,7 @@ namespace Avalonia.FreeDesktop.DBusSystemTray
readonly StatusNotifierItemProperties props; readonly StatusNotifierItemProperties props;
public StatusNotifierItem() public StatusNotifierItemDbusObj()
{ {
var ID = Guid.NewGuid().ToString().Replace("-", ""); var ID = Guid.NewGuid().ToString().Replace("-", "");
ObjectPath = new ObjectPath($"/StatusNotifierItem"); ObjectPath = new ObjectPath($"/StatusNotifierItem");

2
src/Avalonia.X11/X11Platform.cs

@ -103,7 +103,7 @@ namespace Avalonia.X11
public ITrayIconImpl CreateTrayIcon () public ITrayIconImpl CreateTrayIcon ()
{ {
return new X11TrayIconImpl(this); return new X11TrayIconImpl();
} }
public IWindowImpl CreateWindow() public IWindowImpl CreateWindow()

73
src/Avalonia.X11/X11TrayIconImpl.cs

@ -9,60 +9,21 @@ namespace Avalonia.X11
{ {
class X11TrayIconImpl : ITrayIconImpl class X11TrayIconImpl : ITrayIconImpl
{ {
private readonly AvaloniaX11Platform _avaloniaX11Platform;
public INativeMenuExporter MenuExporter { get; } public INativeMenuExporter MenuExporter { get; }
public Action OnClicked { get; set; } public Action OnClicked { get; set; }
private SNIDBus sni = new SNIDBus();
public X11TrayIconImpl(AvaloniaX11Platform avaloniaX11Platform)
{
_avaloniaX11Platform = avaloniaX11Platform;
sni.Initialize();
MenuExporter = sni.NativeMenuExporter;
}
public void Dispose() private DBusSysTray dBusSysTray;
{
sni?.Dispose();
}
[StructLayout(LayoutKind.Explicit)] public X11TrayIconImpl()
readonly struct BGRA32
{ {
[FieldOffset(3)] public readonly byte A; dBusSysTray = new DBusSysTray();
dBusSysTray.Initialize();
[FieldOffset(2)] public readonly byte R; MenuExporter = dBusSysTray.NativeMenuExporter;
[FieldOffset(1)] public readonly byte G;
[FieldOffset(0)] public readonly byte B;
public ARGB32 ToARGB32()
{
return new ARGB32(A, R, G, B);
}
} }
public void Dispose()
[StructLayout(LayoutKind.Explicit)]
readonly struct ARGB32
{ {
[FieldOffset(0)] public readonly byte A; dBusSysTray?.Dispose();
[FieldOffset(1)] public readonly byte R;
[FieldOffset(2)] public readonly byte G;
[FieldOffset(3)] public readonly byte B;
public ARGB32(byte a, byte r, byte g, byte b)
{
A = a;
R = r;
G = g;
B = b;
}
} }
public void SetIcon(IWindowIconImpl icon) public void SetIcon(IWindowIconImpl icon)
@ -74,25 +35,25 @@ namespace Avalonia.X11
var rx = x11icon.Data.AsSpan(2); var rx = x11icon.Data.AsSpan(2);
var pixLength = w * h; var pixLength = w * h;
var pixelArray = new ARGB32[pixLength];
var pixByteArrayCounter = 0;
var pixByteArray = new byte[w * h * 4];
for (var i = 0; i < pixLength; i++) for (var i = 0; i < pixLength; i++)
{ {
var u = rx[i].ToUInt32(); var u = rx[i].ToUInt32();
var a = (byte)((u & 0xFF000000) >> 24); pixByteArray[pixByteArrayCounter++] = (byte)((u & 0xFF000000) >> 24);
var r = (byte)((u & 0x00FF0000) >> 16); pixByteArray[pixByteArrayCounter++] = (byte)((u & 0xFF0000) >> 16);
var g = (byte)((u & 0x0000FF00) >> 8); pixByteArray[pixByteArrayCounter++] = (byte)((u & 0xFF00) >> 8);
var b = (byte)((u & 0x000000FF)); pixByteArray[pixByteArrayCounter++] = (byte)(u & 0xFF);
pixelArray[i] = new ARGB32(a, r, g, b);
} }
var pixmapBytes = MemoryMarshal.Cast<ARGB32, byte>(pixelArray).ToArray(); dBusSysTray.SetIcon(new Pixmap(w, h, pixByteArray));
sni.SetIcon(new Pixmap(w, h, pixmapBytes));
} }
public void SetIsVisible(bool visible) public void SetIsVisible(bool visible)
{ {
} }
public void SetToolTipText(string text) public void SetToolTipText(string text)

Loading…
Cancel
Save