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

2
src/Avalonia.X11/X11Platform.cs

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

73
src/Avalonia.X11/X11TrayIconImpl.cs

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

Loading…
Cancel
Save