Browse Source

refactor to remove redundant X11TrayIconImpl.cs

pull/6779/head
Jumar Macato 5 years ago
parent
commit
c1b68b1836
  1. 17
      src/Avalonia.FreeDesktop/DBusTrayIconImpl.cs
  2. 15
      src/Avalonia.X11/X11Platform.cs
  3. 114
      src/Avalonia.X11/X11TrayIconImpl.cs
  4. 11
      src/Avalonia.X11/XEmbedTrayIconImpl.cs

17
src/Avalonia.FreeDesktop/DBusTrayIconImpl.cs

@ -7,6 +7,7 @@ using System.Runtime.CompilerServices;
using System.Threading.Tasks; using System.Threading.Tasks;
using Avalonia.Controls.Platform; using Avalonia.Controls.Platform;
using Avalonia.Logging; using Avalonia.Logging;
using Avalonia.Platform;
using Tmds.DBus; using Tmds.DBus;
[assembly: InternalsVisibleTo(Connection.DynamicAssemblyName)] [assembly: InternalsVisibleTo(Connection.DynamicAssemblyName)]
@ -19,7 +20,7 @@ using Tmds.DBus;
namespace Avalonia.FreeDesktop namespace Avalonia.FreeDesktop
{ {
internal class DBusTrayIconImpl internal class DBusTrayIconImpl : ITrayIconImpl
{ {
private static int s_trayIconInstanceId; private static int s_trayIconInstanceId;
@ -40,7 +41,8 @@ namespace Avalonia.FreeDesktop
public bool IsActive { get; private set; } public bool IsActive { get; private set; }
public INativeMenuExporter? MenuExporter { get; } public INativeMenuExporter? MenuExporter { get; }
public Action? OnClicked { get; set; } public Action? OnClicked { get; set; }
public Func<IWindowIconImpl, uint[]> IconConverterDelegate { get; set; }
public DBusTrayIconImpl() public DBusTrayIconImpl()
{ {
_connection = DBusHelper.TryCreateNewConnection(); _connection = DBusHelper.TryCreateNewConnection();
@ -158,10 +160,15 @@ namespace Avalonia.FreeDesktop
_serviceWatchDisposable?.Dispose(); _serviceWatchDisposable?.Dispose();
} }
public void SetIcon(UIntPtr[] x11iconData) public void SetIcon(IWindowIconImpl icon)
{ {
if (_isDisposed) if (_isDisposed)
return; return;
var x11iconData = IconConverterDelegate(icon);
if(x11iconData.Length == 0) return;
var w = (int)x11iconData[0]; var w = (int)x11iconData[0];
var h = (int)x11iconData[1]; var h = (int)x11iconData[1];
@ -171,7 +178,7 @@ namespace Avalonia.FreeDesktop
for (var i = 0; i < pixLength; i++) for (var i = 0; i < pixLength; i++)
{ {
var rawPixel = x11iconData[i + 2].ToUInt32(); var rawPixel = x11iconData[i + 2];
pixByteArray[pixByteArrayCounter++] = (byte)((rawPixel & 0xFF000000) >> 24); pixByteArray[pixByteArrayCounter++] = (byte)((rawPixel & 0xFF000000) >> 24);
pixByteArray[pixByteArrayCounter++] = (byte)((rawPixel & 0xFF0000) >> 16); pixByteArray[pixByteArrayCounter++] = (byte)((rawPixel & 0xFF0000) >> 16);
pixByteArray[pixByteArrayCounter++] = (byte)((rawPixel & 0xFF00) >> 8); pixByteArray[pixByteArrayCounter++] = (byte)((rawPixel & 0xFF00) >> 8);
@ -360,7 +367,7 @@ namespace Avalonia.FreeDesktop
Task<IDisposable> WatchNewOverlayIconAsync(Action handler, Action<Exception> onError); Task<IDisposable> WatchNewOverlayIconAsync(Action handler, Action<Exception> onError);
Task<IDisposable> WatchNewToolTipAsync(Action handler, Action<Exception> onError); Task<IDisposable> WatchNewToolTipAsync(Action handler, Action<Exception> onError);
Task<IDisposable> WatchNewStatusAsync(Action<string> handler, Action<Exception> onError); Task<IDisposable> WatchNewStatusAsync(Action<string> handler, Action<Exception> onError);
Task<object> GetAsync(string prop); Task<object?> GetAsync(string prop);
Task<StatusNotifierItemProperties> GetAllAsync(); Task<StatusNotifierItemProperties> GetAllAsync();
Task SetAsync(string prop, object val); Task SetAsync(string prop, object val);
Task<IDisposable> WatchPropertiesAsync(Action<PropertyChanges> handler); Task<IDisposable> WatchPropertiesAsync(Action<PropertyChanges> handler);

15
src/Avalonia.X11/X11Platform.cs

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Reflection; using System.Reflection;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using Avalonia.Controls; using Avalonia.Controls;
@ -106,7 +107,19 @@ namespace Avalonia.X11
public ITrayIconImpl CreateTrayIcon () public ITrayIconImpl CreateTrayIcon ()
{ {
return new X11TrayIconImpl(); var dbusTrayIcon = new DBusTrayIconImpl();
if (!dbusTrayIcon.IsActive) return new XEmbedTrayIconImpl();
dbusTrayIcon.IconConverterDelegate = (icon) =>
{
if (!(icon is X11IconData x11icon))
return Array.Empty<uint>();
return x11icon.Data.Select(x=>x.ToUInt32()).ToArray();
};
return dbusTrayIcon;
} }
public IWindowImpl CreateWindow() public IWindowImpl CreateWindow()

114
src/Avalonia.X11/X11TrayIconImpl.cs

@ -1,114 +0,0 @@
using System;
using Avalonia.Controls.Platform;
using Avalonia.FreeDesktop;
using Avalonia.Logging;
using Avalonia.Platform;
namespace Avalonia.X11
{
internal class X11TrayIconImpl : ITrayIconImpl
{
public X11TrayIconImpl()
{
_xEmbedTrayIcon = new XEmbedTrayIconImpl();
_dBusTrayIcon = new DBusTrayIconImpl();
}
private readonly DBusTrayIconImpl _dBusTrayIcon;
private readonly XEmbedTrayIconImpl _xEmbedTrayIcon;
private bool _isDisposed;
public void Dispose()
{
_dBusTrayIcon?.Dispose();
_xEmbedTrayIcon?.Dispose();
_isDisposed = true;
}
public void SetIcon(IWindowIconImpl? icon)
{
if (_isDisposed) return;
if (_dBusTrayIcon?.IsActive ?? false)
{
if (!(icon is X11IconData x11icon))
return;
_dBusTrayIcon.SetIcon(x11icon.Data);
}
else
{
_xEmbedTrayIcon.SetIcon(icon);
}
}
public void SetToolTipText(string? text)
{
if (_isDisposed) return;
if (_dBusTrayIcon?.IsActive ?? false)
{
_dBusTrayIcon.SetToolTipText(text);
}
else
{
_xEmbedTrayIcon.SetToolTipText(text);
}
}
public void SetIsVisible(bool visible)
{
if (_isDisposed) return;
if (_dBusTrayIcon?.IsActive ?? false)
{
_dBusTrayIcon.SetIsVisible(visible);
}
else
{
_xEmbedTrayIcon.SetIsVisible(visible);
}
}
public INativeMenuExporter? MenuExporter
{
get
{
if (_dBusTrayIcon?.IsActive ?? false)
{
return _dBusTrayIcon.MenuExporter;
}
else
{
return _xEmbedTrayIcon.MenuExporter;
}
}
}
public Action? OnClicked
{
get
{
if (_dBusTrayIcon?.IsActive ?? false)
{
return _dBusTrayIcon.OnClicked;
}
else
{
return _xEmbedTrayIcon.OnClicked;
}
}
set
{
if (_dBusTrayIcon?.IsActive ?? false)
{
_dBusTrayIcon.OnClicked = value;
}
else
{
_xEmbedTrayIcon.OnClicked = value;
}
}
}
}
}

11
src/Avalonia.X11/XEmbedTrayIconImpl.cs

@ -5,10 +5,11 @@ using Avalonia.Platform;
namespace Avalonia.X11 namespace Avalonia.X11
{ {
internal class XEmbedTrayIconImpl internal class XEmbedTrayIconImpl : ITrayIconImpl
{ {
public XEmbedTrayIconImpl() public XEmbedTrayIconImpl()
{ {
MenuExporter = null;
} }
private bool _isCalled; private bool _isCalled;
@ -29,12 +30,12 @@ namespace Avalonia.X11
NotImplemented(); NotImplemented();
} }
public void SetIcon(IWindowIconImpl? icon) public void SetIcon(IWindowIconImpl icon)
{ {
NotImplemented(); NotImplemented();
} }
public void SetToolTipText(string? text) public void SetToolTipText(string text)
{ {
NotImplemented(); NotImplemented();
} }
@ -44,7 +45,7 @@ namespace Avalonia.X11
NotImplemented(); NotImplemented();
} }
public INativeMenuExporter? MenuExporter { get; } public INativeMenuExporter MenuExporter { get; }
public Action? OnClicked { get; set; } public Action OnClicked { get; set; }
} }
} }

Loading…
Cancel
Save