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();