From 060e2b6600a450c5209402940f4a73f64f433112 Mon Sep 17 00:00:00 2001 From: Jumar Macato <16554748+jmacato@users.noreply.github.com> Date: Sat, 18 Sep 2021 16:33:22 +0800 Subject: [PATCH] simplifying stuff --- .../{SNIDBus.cs => DBusSysTray.cs} | 28 +++---- src/Avalonia.X11/X11Platform.cs | 2 +- src/Avalonia.X11/X11TrayIconImpl.cs | 73 +++++-------------- 3 files changed, 29 insertions(+), 74 deletions(-) rename src/Avalonia.FreeDesktop/DBusSystemTray/{SNIDBus.cs => DBusSysTray.cs} (94%) diff --git a/src/Avalonia.FreeDesktop/DBusSystemTray/SNIDBus.cs b/src/Avalonia.FreeDesktop/DBusSystemTray/DBusSysTray.cs similarity index 94% rename from src/Avalonia.FreeDesktop/DBusSystemTray/SNIDBus.cs rename to src/Avalonia.FreeDesktop/DBusSystemTray/DBusSysTray.cs index 398411a81a..82091d3af7 100644 --- a/src/Avalonia.FreeDesktop/DBusSystemTray/SNIDBus.cs +++ b/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 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"); diff --git a/src/Avalonia.X11/X11Platform.cs b/src/Avalonia.X11/X11Platform.cs index eb805c0f0b..5d80c860a7 100644 --- a/src/Avalonia.X11/X11Platform.cs +++ b/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() diff --git a/src/Avalonia.X11/X11TrayIconImpl.cs b/src/Avalonia.X11/X11TrayIconImpl.cs index 8fa5cea427..459bc72342 100644 --- a/src/Avalonia.X11/X11TrayIconImpl.cs +++ b/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(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)