diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3 (Package)/Package.appxmanifest b/BetterLyrics.WinUI3/BetterLyrics.WinUI3 (Package)/Package.appxmanifest
index a6327c8..26c7e99 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3 (Package)/Package.appxmanifest
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3 (Package)/Package.appxmanifest
@@ -12,7 +12,7 @@
+ Version="1.0.22.0" />
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/ForegroundWindowWatcher.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/ForegroundWindowWatcher.cs
index 5b5ffc1..3c3fe47 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/ForegroundWindowWatcher.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/ForegroundWindowWatcher.cs
@@ -4,6 +4,7 @@ using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
+using CommunityToolkit.WinUI;
using Microsoft.UI.Xaml;
using Vanara.PInvoke;
using Windows.System;
@@ -16,6 +17,7 @@ namespace BetterLyrics.WinUI3.Helper
private readonly List _hooks = new();
private HWND _currentForeground = HWND.NULL;
private readonly IntPtr _selfHwnd;
+ private readonly ThrottleHelper _winEventProcThrottle = new(TimeSpan.FromSeconds(1));
public delegate void WindowChangedHandler(HWND hwnd);
private readonly WindowChangedHandler _onWindowChanged;
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/SystemVolumeHelper.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/SystemVolumeHelper.cs
index 8e36042..fdf39a8 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/SystemVolumeHelper.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/SystemVolumeHelper.cs
@@ -63,7 +63,7 @@ namespace BetterLyrics.WinUI3.Helper
{
var data = pNotify.ToStructure();
_masterVolume = (int)(data.fMasterVolume * 100);
- _dispatcherQueue.TryEnqueue(() =>
+ _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () =>
{
VolumeChanged?.Invoke(_masterVolume);
});
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/LibWatcherService.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/LibWatcherService.cs
index a276d50..ffd1d84 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/LibWatcherService.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/LibWatcherService.cs
@@ -6,18 +6,17 @@ using System.IO;
using System.Linq;
using BetterLyrics.WinUI3.Events;
using BetterLyrics.WinUI3.Models;
+using BetterLyrics.WinUI3.ViewModels;
+using Microsoft.UI.Dispatching;
namespace BetterLyrics.WinUI3.Services
{
- public class LibWatcherService : IDisposable, ILibWatcherService
+ public class LibWatcherService : BaseViewModel, IDisposable, ILibWatcherService
{
- private readonly ISettingsService _settingsService;
-
private readonly Dictionary _watchers = [];
- public LibWatcherService(ISettingsService settingsService)
+ public LibWatcherService(ISettingsService settingsService) : base(settingsService)
{
- _settingsService = settingsService;
UpdateWatchers(_settingsService.LocalMediaFolders);
}
@@ -69,14 +68,13 @@ namespace BetterLyrics.WinUI3.Services
private void OnChanged(string folder, FileSystemEventArgs e)
{
- App.DispatcherQueue!.TryEnqueue(() =>
- {
- MusicLibraryFilesChanged?.Invoke(
- this,
- new LibChangedEventArgs(folder, e.FullPath, e.ChangeType)
- );
- }
- );
+ _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () =>
+ {
+ MusicLibraryFilesChanged?.Invoke(
+ this,
+ new LibChangedEventArgs(folder, e.FullPath, e.ChangeType)
+ );
+ });
}
}
}
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/PlaybackService.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/PlaybackService.cs
index d2768c6..07dbcdf 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/PlaybackService.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/PlaybackService.cs
@@ -110,8 +110,8 @@ namespace BetterLyrics.WinUI3.Services
{
if (!IsMediaSourceEnabled(mediaSession.ControlSession.SourceAppUserModelId) || mediaSession != _mediaManager.GetFocusedSession()) return;
- _dispatcherQueue.TryEnqueue(() =>
- {
+ _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () =>
+ {
PositionChanged?.Invoke(this, new PositionChangedEventArgs(timelineProperties.Position));
}
);
@@ -128,8 +128,8 @@ namespace BetterLyrics.WinUI3.Services
_ => false,
};
- _dispatcherQueue.TryEnqueue(() =>
- {
+ _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () =>
+ {
IsPlayingChanged?.Invoke(this, new IsPlayingChangedEventArgs(_cachedIsPlaying));
}
);
@@ -184,7 +184,7 @@ namespace BetterLyrics.WinUI3.Services
if (!token.IsCancellationRequested)
{
- _dispatcherQueue.TryEnqueue(() =>
+ _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () =>
{
SongInfoChanged?.Invoke(this, new SongInfoChangedEventArgs(_cachedSongInfo));
});
@@ -215,7 +215,7 @@ namespace BetterLyrics.WinUI3.Services
{
_mediaSourceProvidersInfo.Add(new MediaSourceProviderInfo(id, true));
_settingsService.MediaSourceProvidersInfo = _mediaSourceProvidersInfo;
- _dispatcherQueue.TryEnqueue(() =>
+ _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () =>
{
MediaSourceProvidersInfoChanged?.Invoke(this, new MediaSourceProvidersInfoEventArgs(_mediaSourceProvidersInfo));
});
@@ -224,7 +224,7 @@ namespace BetterLyrics.WinUI3.Services
private void SendNullMessages()
{
- _dispatcherQueue.TryEnqueue(() =>
+ _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () =>
{
_cachedSongInfo = null;
_cachedIsPlaying = false;
@@ -270,7 +270,7 @@ namespace BetterLyrics.WinUI3.Services
var _albumArtAccentColor = ImageHelper.GetAccentColorsFromByte(bytes).FirstOrDefault();
- _dispatcherQueue.TryEnqueue(() =>
+ _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () =>
{
AlbumArtChangedChanged?.Invoke(this, new AlbumArtChangedEventArgs(_albumArtSwBitmap, _albumArtAccentColor));
});
@@ -287,7 +287,7 @@ namespace BetterLyrics.WinUI3.Services
catch (Exception)
{
_logger.LogError("Failed to start SSE connection for LX Music.");
- _dispatcherQueue.TryEnqueue(() =>
+ _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () =>
{
App.Current.LyricsWindowNotificationPanel?.Notify(App.ResourceLoader!.GetString("FailToStartLXMusicServer"), Microsoft.UI.Xaml.Controls.InfoBarSeverity.Error);
});
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/TranslateService.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/TranslateService.cs
index ef88d7d..1ed8e35 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/TranslateService.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/TranslateService.cs
@@ -3,6 +3,7 @@ using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Serialization;
using BetterLyrics.WinUI3.ViewModels;
using Lyricify.Lyrics.Helpers.General;
+using Microsoft.UI.Dispatching;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -46,7 +47,7 @@ namespace BetterLyrics.WinUI3.Services
if (string.IsNullOrEmpty(_settingsService.LibreTranslateServer))
{
- _dispatcherQueue.TryEnqueue(() =>
+ _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () =>
{
App.Current.LyricsWindowNotificationPanel?.Notify(
App.ResourceLoader!.GetString("TranslateServerNotSet"),
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsPageViewModel.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsPageViewModel.cs
index b7eaa56..0c7d2a7 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsPageViewModel.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsPageViewModel.cs
@@ -260,7 +260,7 @@ namespace BetterLyrics.WinUI3.ViewModels
{
if (_timelineThrottle.CanTrigger())
{
- _dispatcherQueue.TryEnqueue(() =>
+ _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () =>
{
TimelinePositionSeconds = message.NewValue.TotalSeconds;
});
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel.Messages.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel.Messages.cs
index 33d96ce..cfc8c3a 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel.Messages.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel.Messages.cs
@@ -91,20 +91,23 @@ namespace BetterLyrics.WinUI3.ViewModels
{
_isDockMode = message.NewValue;
UpdateColorConfig();
+ UpdateImmersiveBackgroundOpacity();
}
else if (message.PropertyName == nameof(LyricsWindowViewModel.IsDesktopMode))
{
_isDesktopMode = message.NewValue;
UpdateColorConfig();
+ UpdateImmersiveBackgroundOpacity();
}
else if (message.PropertyName == nameof(LyricsWindowViewModel.IsLyricsWindowLocked))
{
_isLyricsWindowLocked = message.NewValue;
+ UpdateImmersiveBackgroundOpacity();
}
else if (message.PropertyName == nameof(LyricsWindowViewModel.IsMouseWithinWindow))
{
_isMouseWithinWindow = message.NewValue;
- _immersiveBgOpacityTransition.StartTransition(_isDesktopMode ? (_isMouseWithinWindow ? 1f : 0f) : 1f);
+ UpdateImmersiveBackgroundOpacity();
}
}
else if (message.Sender is LyricsPageViewModel)
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel.Update.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel.Update.cs
index 7e904e0..82d1da2 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel.Update.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel.Update.cs
@@ -411,5 +411,33 @@ namespace BetterLyrics.WinUI3.ViewModels
line.HighlightOpacityTransition.Update(_elapsedTime);
}
}
+
+ private void UpdateImmersiveBackgroundOpacity()
+ {
+ float targetOpacity;
+ if (_isDesktopMode)
+ {
+ if (_isLyricsWindowLocked)
+ {
+ targetOpacity = 0;
+ }
+ else
+ {
+ if (_isMouseWithinWindow)
+ {
+ targetOpacity = 1f;
+ }
+ else
+ {
+ targetOpacity = 0f;
+ }
+ }
+ }
+ else
+ {
+ targetOpacity = 1f;
+ }
+ _immersiveBgOpacityTransition.StartTransition(targetOpacity);
+ }
}
}
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsWindowViewModel.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsWindowViewModel.cs
index de755dd..ab9a549 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsWindowViewModel.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsWindowViewModel.cs
@@ -11,6 +11,7 @@ using CommunityToolkit.Mvvm.DependencyInjection;
using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.Mvvm.Messaging;
using CommunityToolkit.Mvvm.Messaging.Messages;
+using CommunityToolkit.WinUI;
using Microsoft.UI;
using Microsoft.UI.Windowing;
using Microsoft.UI.Xaml;
@@ -231,11 +232,14 @@ namespace BetterLyrics.WinUI3
hwnd,
onWindowChanged =>
{
- if (_ignoreFullscreenWindow && window.AppWindow.Presenter is OverlappedPresenter presenter)
+ _dispatcherQueueTimer.Debounce(() =>
{
- presenter.IsAlwaysOnTop = true;
- }
- UpdateAccentColor(hwnd);
+ if (_ignoreFullscreenWindow && window.AppWindow.Presenter is OverlappedPresenter presenter)
+ {
+ presenter.IsAlwaysOnTop = true;
+ }
+ UpdateAccentColor(hwnd);
+ }, TimeSpan.FromMilliseconds(300));
}
);
_windowWatcher.Start();
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/MusicGalleryViewModel.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/MusicGalleryViewModel.cs
index e30ea43..6c4c064 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/MusicGalleryViewModel.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/MusicGalleryViewModel.cs
@@ -5,6 +5,7 @@ using BetterLyrics.WinUI3.Services;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Messaging;
using CommunityToolkit.Mvvm.Messaging.Messages;
+using Microsoft.UI.Dispatching;
using Microsoft.UI.Xaml.Controls;
using System;
using System.Collections.Generic;
@@ -94,7 +95,7 @@ namespace BetterLyrics.WinUI3.ViewModels
foreach (var file in Directory.GetFiles(folder.Path, $"*.*", SearchOption.AllDirectories))
{
Track track = new(file);
- _dispatcherQueue.TryEnqueue(() =>
+ _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () =>
{
Tracks.Add(track);
});
@@ -102,7 +103,7 @@ namespace BetterLyrics.WinUI3.ViewModels
}
}
- _dispatcherQueue.TryEnqueue(() =>
+ _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () =>
{
IsDataLoading = false;
});
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SettingsPageViewModel.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SettingsPageViewModel.cs
index 7510daa..386ffbe 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SettingsPageViewModel.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SettingsPageViewModel.cs
@@ -7,6 +7,7 @@ using BetterLyrics.WinUI3.Services;
using BetterLyrics.WinUI3.Views;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
+using Microsoft.UI.Dispatching;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using System;
@@ -16,7 +17,6 @@ using System.Linq;
using System.Threading.Tasks;
using Windows.ApplicationModel;
using Windows.Globalization;
-using Windows.System;
using Windows.UI;
using WinRT.Interop;
using MetadataHelper = BetterLyrics.WinUI3.Helper.MetadataHelper;
@@ -411,13 +411,13 @@ namespace BetterLyrics.WinUI3.ViewModels
[RelayCommand]
private async Task LaunchProjectGitHubPageAsync()
{
- await Launcher.LaunchUriAsync(new Uri(MetadataHelper.GithubUrl));
+ await Windows.System.Launcher.LaunchUriAsync(new Uri(MetadataHelper.GithubUrl));
}
[RelayCommand]
private static async Task OpenCacheFolderAsync()
{
- await Launcher.LaunchFolderPathAsync(PathHelper.CacheFolder);
+ await Windows.System.Launcher.LaunchFolderPathAsync(PathHelper.CacheFolder);
}
[RelayCommand]
@@ -456,7 +456,7 @@ namespace BetterLyrics.WinUI3.ViewModels
{
string targetLangCode = LanguageHelper.SupportedTargetLanguages[SelectedTargetLanguageIndex].Code;
string result = await _libreTranslateService.TranslateTextAsync("Hello, world!", targetLangCode, null);
- _dispatcherQueue.TryEnqueue(() =>
+ _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () =>
{
App.Current.SettingsWindowNotificationPanel?.Notify(App.ResourceLoader!.GetString("SettingsPageServerTestSuccessInfo"), Microsoft.UI.Xaml.Controls.InfoBarSeverity.Success);
IsLibreTranslateServerTesting = false;
@@ -464,7 +464,7 @@ namespace BetterLyrics.WinUI3.ViewModels
}
catch (Exception)
{
- _dispatcherQueue.TryEnqueue(() =>
+ _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () =>
{
App.Current.SettingsWindowNotificationPanel?.Notify(App.ResourceLoader!.GetString("SettingsPageServerTestFailedInfo"), Microsoft.UI.Xaml.Controls.InfoBarSeverity.Error);
IsLibreTranslateServerTesting = false;
@@ -480,7 +480,7 @@ namespace BetterLyrics.WinUI3.ViewModels
Task.Run(async () =>
{
bool testResult = await NetHelper.CheckConnectivity($"{LXMusicServer}/status");
- _dispatcherQueue.TryEnqueue(() =>
+ _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () =>
{
App.Current.SettingsWindowNotificationPanel?.Notify(
App.ResourceLoader!.GetString($"SettingsPageServerTest{(testResult ? "Success" : "Failed")}Info"),
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SystemTrayViewModel.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SystemTrayViewModel.cs
index a433bd6..df4d5d8 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SystemTrayViewModel.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SystemTrayViewModel.cs
@@ -5,6 +5,7 @@ using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.Mvvm.Messaging;
using CommunityToolkit.Mvvm.Messaging.Messages;
+using Microsoft.UI.Xaml;
namespace BetterLyrics.WinUI3.ViewModels
{
@@ -39,7 +40,7 @@ namespace BetterLyrics.WinUI3.ViewModels
{
DockModeHelper.Disable(lyricsWindow);
}
- App.Current.Exit();
+ Application.Current.Exit();
}
[RelayCommand]
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsWindow.xaml b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsWindow.xaml
index a0c7cdc..a86a458 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsWindow.xaml
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsWindow.xaml
@@ -26,6 +26,7 @@
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsWindow.xaml.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsWindow.xaml.cs
index f0c5086..28b3427 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsWindow.xaml.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsWindow.xaml.cs
@@ -270,7 +270,7 @@ namespace BetterLyrics.WinUI3.Views
private void CloseButton_Click(object sender, RoutedEventArgs e)
{
DockModeHelper.Disable(this);
- App.Current.Exit();
+ Application.Current.Exit();
}
private void MaximiseButton_Click(object sender, RoutedEventArgs e)