diff --git a/src/UniGetUI.Avalonia/Infrastructure/WindowsTrayService.cs b/src/UniGetUI.Avalonia/Infrastructure/TrayService.cs
similarity index 90%
rename from src/UniGetUI.Avalonia/Infrastructure/WindowsTrayService.cs
rename to src/UniGetUI.Avalonia/Infrastructure/TrayService.cs
index b3cbbeb35..8c72f26a0 100644
--- a/src/UniGetUI.Avalonia/Infrastructure/WindowsTrayService.cs
+++ b/src/UniGetUI.Avalonia/Infrastructure/TrayService.cs
@@ -1,9 +1,8 @@
-using System.Runtime.Versioning;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Platform;
+using Avalonia.Styling;
using Avalonia.Threading;
-using Microsoft.Win32;
using UniGetUI.Avalonia.Views;
using UniGetUI.Core.Data;
using UniGetUI.Core.Logging;
@@ -14,13 +13,12 @@
namespace UniGetUI.Avalonia.Infrastructure;
-[SupportedOSPlatform("windows")]
-internal sealed class WindowsTrayService : IDisposable
+internal sealed class TrayService : IDisposable
{
private readonly TrayIcon _trayIcon;
private string _lastIconUri = "";
- public WindowsTrayService(MainWindow owner)
+ public TrayService(MainWindow owner)
{
_trayIcon = new TrayIcon
{
@@ -96,12 +94,13 @@ public void UpdateStatus()
}
}
- // Windows reads SystemUsesLightTheme to pick dark vs light taskbar icons.
private static bool IsTaskbarLight()
{
+#if WINDOWS
+ // On Windows, read the registry to match the taskbar background colour.
try
{
- using var key = Registry.CurrentUser.OpenSubKey(
+ using var key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(
@"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize");
return key?.GetValue("SystemUsesLightTheme") is int v && v > 0;
}
@@ -109,6 +108,11 @@ private static bool IsTaskbarLight()
{
return false;
}
+#else
+ // On Linux (and other platforms), mirror the app's active theme variant so
+ // the icon remains legible regardless of the desktop colour scheme.
+ return Application.Current?.ActualThemeVariant == ThemeVariant.Light;
+#endif
}
private static NativeMenu BuildMenu(MainWindow owner)
diff --git a/src/UniGetUI.Avalonia/UniGetUI.Avalonia.csproj b/src/UniGetUI.Avalonia/UniGetUI.Avalonia.csproj
index 090b21a78..da7a2189f 100644
--- a/src/UniGetUI.Avalonia/UniGetUI.Avalonia.csproj
+++ b/src/UniGetUI.Avalonia/UniGetUI.Avalonia.csproj
@@ -131,7 +131,7 @@
-
+
diff --git a/src/UniGetUI.Avalonia/ViewModels/Pages/SettingsPages/NotificationsViewModel.cs b/src/UniGetUI.Avalonia/ViewModels/Pages/SettingsPages/NotificationsViewModel.cs
index efaa49d04..4375b1d55 100644
--- a/src/UniGetUI.Avalonia/ViewModels/Pages/SettingsPages/NotificationsViewModel.cs
+++ b/src/UniGetUI.Avalonia/ViewModels/Pages/SettingsPages/NotificationsViewModel.cs
@@ -10,8 +10,8 @@ public partial class NotificationsViewModel : ViewModelBase
[ObservableProperty] private bool _isSystemTrayEnabled;
[ObservableProperty] private bool _isNotificationsEnabled;
- /// True when the system-tray-disabled warning should be shown (Windows only).
- public bool IsSystemTrayWarningVisible => OperatingSystem.IsWindows() && !IsSystemTrayEnabled;
+ /// True when the system-tray-disabled warning should be shown.
+ public bool IsSystemTrayWarningVisible => !IsSystemTrayEnabled;
public NotificationsViewModel()
{
diff --git a/src/UniGetUI.Avalonia/Views/MainWindow.axaml.cs b/src/UniGetUI.Avalonia/Views/MainWindow.axaml.cs
index 4e7ff6f7c..1df5a75e6 100644
--- a/src/UniGetUI.Avalonia/Views/MainWindow.axaml.cs
+++ b/src/UniGetUI.Avalonia/Views/MainWindow.axaml.cs
@@ -48,7 +48,7 @@ public partial class MainWindow : Window
private const uint SWP_FRAMECHANGED = 0x0020;
private bool _focusSidebarSelectionOnNextPageChange;
- private WindowsTrayService? _trayService;
+ private TrayService? _trayService;
private bool _allowClose;
private NativeMethods.RECT? _windowsRestoreBoundsBeforeManualMaximize;
@@ -73,16 +73,13 @@ public MainWindow()
KeyDown += Window_KeyDown;
ViewModel.CurrentPageChanged += OnCurrentPageChanged;
- if (OperatingSystem.IsWindows())
- {
- _trayService = new WindowsTrayService(this);
- _trayService.UpdateStatus();
- }
+ _trayService = new TrayService(this);
+ _trayService.UpdateStatus();
}
protected override void OnClosing(WindowClosingEventArgs e)
{
- if (!_allowClose && OperatingSystem.IsWindows() && !Settings.Get(Settings.K.DisableSystemTray))
+ if (!_allowClose && !Settings.Get(Settings.K.DisableSystemTray))
{
e.Cancel = true;
Hide();
@@ -90,11 +87,8 @@ protected override void OnClosing(WindowClosingEventArgs e)
}
AvaloniaAutoUpdater.ReleaseLockForAutoupdate_Window = true;
- if (OperatingSystem.IsWindows())
- {
- _trayService?.Dispose();
- _trayService = null;
- }
+ _trayService?.Dispose();
+ _trayService = null;
base.OnClosing(e);
}
@@ -532,11 +526,7 @@ public void ShowBanner(string title, string message, RuntimeNotificationLevel le
ViewModel.ErrorBanner.IsOpen = true;
}
- public void UpdateSystemTrayStatus()
- {
- if (OperatingSystem.IsWindows())
- _trayService?.UpdateStatus();
- }
+ public void UpdateSystemTrayStatus() => _trayService?.UpdateStatus();
public void ShowRuntimeNotification(string title, string message, RuntimeNotificationLevel level) =>
ShowBanner(title, message, level);
diff --git a/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/Interface_P.axaml b/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/Interface_P.axaml
index 2a740179c..deb2d35fa 100644
--- a/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/Interface_P.axaml
+++ b/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/Interface_P.axaml
@@ -33,7 +33,7 @@
StateChangedCommand="{Binding ShowRestartRequiredCommand}"
CornerRadius="8"/>
-
+
diff --git a/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/Interface_P.axaml.cs b/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/Interface_P.axaml.cs
index a25213b76..128497ead 100644
--- a/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/Interface_P.axaml.cs
+++ b/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/Interface_P.axaml.cs
@@ -20,9 +20,6 @@ public Interface_P()
DataContext = new Interface_PViewModel();
InitializeComponent();
- if (OperatingSystem.IsMacOS())
- SystemTraySection.IsVisible = false;
-
VM.RestartRequired += (s, e) => RestartRequired?.Invoke(s, e);
_ = VM.LoadIconCacheSize();