From 6f2102389daba2545978dad7851ef3512c82a268 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 3 Sep 2025 05:56:06 +0000 Subject: [PATCH 1/6] Initial plan From 8ab939de85d22b39a927e51034aea01cbbbb1819 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 3 Sep 2025 06:03:04 +0000 Subject: [PATCH 2/6] Add auto full screen setting and UI controls Co-authored-by: huynhsontung <31434093+huynhsontung@users.noreply.github.com> --- Screenbox.Core/Services/SettingsService.cs | 8 ++++++++ Screenbox.Core/ViewModels/PlayerPageViewModel.cs | 5 +++++ Screenbox.Core/ViewModels/SettingsPageViewModel.cs | 8 ++++++++ Screenbox/Pages/SettingsPage.xaml | 9 +++++++++ Screenbox/Strings/en-US/Resources.resw | 6 ++++++ 5 files changed, 36 insertions(+) diff --git a/Screenbox.Core/Services/SettingsService.cs b/Screenbox.Core/Services/SettingsService.cs index 7aed0928b..f7940eba2 100644 --- a/Screenbox.Core/Services/SettingsService.cs +++ b/Screenbox.Core/Services/SettingsService.cs @@ -35,6 +35,7 @@ public sealed class SettingsService : ISettingsService private const string PersistentRepeatModeKey = "Values/RepeatMode"; private const string PersistentSubtitleLanguageKey = "Values/SubtitleLanguage"; private const string PlayerShowChaptersKey = "Player/ShowChapters"; + private const string PlayerAutoFullScreenKey = "Player/AutoFullScreen"; public bool UseIndexer { @@ -162,6 +163,12 @@ public bool PlayerShowChapters set => SetValue(PlayerShowChaptersKey, value); } + public bool PlayerAutoFullScreen + { + get => GetValue(PlayerAutoFullScreenKey); + set => SetValue(PlayerAutoFullScreenKey, value); + } + public SettingsService() { SetDefault(PlayerAutoResizeKey, (int)PlayerAutoResizeOption.Never); @@ -180,6 +187,7 @@ public SettingsService() SetDefault(AdvancedMultipleInstancesKey, false); SetDefault(GlobalArgumentsKey, string.Empty); SetDefault(PlayerShowChaptersKey, true); + SetDefault(PlayerAutoFullScreenKey, false); // Device family specific overrides if (SystemInformation.IsXbox) diff --git a/Screenbox.Core/ViewModels/PlayerPageViewModel.cs b/Screenbox.Core/ViewModels/PlayerPageViewModel.cs index 6cb387ea2..27b39f61f 100644 --- a/Screenbox.Core/ViewModels/PlayerPageViewModel.cs +++ b/Screenbox.Core/ViewModels/PlayerPageViewModel.cs @@ -615,6 +615,11 @@ private async void ProcessOpeningMedia(MediaViewModel? current) // If it's audio only, don't resize on next video playback _resizeNext = false; } + else if (_settingsService.PlayerAutoFullScreen && _windowService.ViewMode != WindowViewMode.FullScreen) + { + // Auto enter full screen for video files if setting is enabled and not already in full screen + _windowService.TryEnterFullScreen(); + } } else if (PlayerVisibility == PlayerVisibilityState.Minimal) { diff --git a/Screenbox.Core/ViewModels/SettingsPageViewModel.cs b/Screenbox.Core/ViewModels/SettingsPageViewModel.cs index 839bda72f..ff32f5214 100644 --- a/Screenbox.Core/ViewModels/SettingsPageViewModel.cs +++ b/Screenbox.Core/ViewModels/SettingsPageViewModel.cs @@ -29,6 +29,7 @@ public sealed partial class SettingsPageViewModel : ObservableRecipient [ObservableProperty] private bool _playerTapGesture; [ObservableProperty] private bool _playerShowControls; [ObservableProperty] private bool _playerShowChapters; + [ObservableProperty] private bool _playerAutoFullScreen; [ObservableProperty] private int _volumeBoost; [ObservableProperty] private bool _useIndexer; [ObservableProperty] private bool _showRecent; @@ -99,6 +100,7 @@ public SettingsPageViewModel(ISettingsService settingsService, ILibraryService l _playerTapGesture = _settingsService.PlayerTapGesture; _playerShowControls = _settingsService.PlayerShowControls; _playerShowChapters = _settingsService.PlayerShowChapters; + _playerAutoFullScreen = _settingsService.PlayerAutoFullScreen; _useIndexer = _settingsService.UseIndexer; _showRecent = _settingsService.ShowRecent; _theme = ((int)_settingsService.Theme + 2) % 3; @@ -187,6 +189,12 @@ partial void OnPlayerShowChaptersChanged(bool value) Messenger.Send(new SettingsChangedMessage(nameof(PlayerShowChapters), typeof(SettingsPageViewModel))); } + partial void OnPlayerAutoFullScreenChanged(bool value) + { + _settingsService.PlayerAutoFullScreen = value; + Messenger.Send(new SettingsChangedMessage(nameof(PlayerAutoFullScreen), typeof(SettingsPageViewModel))); + } + partial void OnUseIndexerChanged(bool value) { _settingsService.UseIndexer = value; diff --git a/Screenbox/Pages/SettingsPage.xaml b/Screenbox/Pages/SettingsPage.xaml index 3715519ed..54216608d 100644 --- a/Screenbox/Pages/SettingsPage.xaml +++ b/Screenbox/Pages/SettingsPage.xaml @@ -379,6 +379,15 @@ + + + + Resize the app window to best match a video's native resolution on playback + + Auto full screen + + + Automatically enter full screen mode when opening a media file + Volume boost From 01ca8feeae5dd78a551f6f20653aa8392294795c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 3 Sep 2025 06:04:27 +0000 Subject: [PATCH 3/6] Improve full screen logic to respect compact overlay mode Co-authored-by: huynhsontung <31434093+huynhsontung@users.noreply.github.com> --- Screenbox.Core/ViewModels/PlayerPageViewModel.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Screenbox.Core/ViewModels/PlayerPageViewModel.cs b/Screenbox.Core/ViewModels/PlayerPageViewModel.cs index 27b39f61f..2ac13cc7f 100644 --- a/Screenbox.Core/ViewModels/PlayerPageViewModel.cs +++ b/Screenbox.Core/ViewModels/PlayerPageViewModel.cs @@ -615,9 +615,9 @@ private async void ProcessOpeningMedia(MediaViewModel? current) // If it's audio only, don't resize on next video playback _resizeNext = false; } - else if (_settingsService.PlayerAutoFullScreen && _windowService.ViewMode != WindowViewMode.FullScreen) + else if (_settingsService.PlayerAutoFullScreen && _windowService.ViewMode == WindowViewMode.Default) { - // Auto enter full screen for video files if setting is enabled and not already in full screen + // Auto enter full screen for video files if setting is enabled and in default window mode _windowService.TryEnterFullScreen(); } } From 4791d9c0fd8c6e3769b5c0d9479308a6af4eae64 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 3 Sep 2025 16:29:40 +0000 Subject: [PATCH 4/6] Implement PreferredLaunchWindowingMode approach and remove audio/video distinction Co-authored-by: United600 <698155+United600@users.noreply.github.com> --- Screenbox.Core/Services/SettingsService.cs | 32 ++++++++++++++++++- .../ViewModels/PlayerPageViewModel.cs | 5 --- Screenbox/App.xaml.cs | 12 +++++++ 3 files changed, 43 insertions(+), 6 deletions(-) diff --git a/Screenbox.Core/Services/SettingsService.cs b/Screenbox.Core/Services/SettingsService.cs index f7940eba2..30305054c 100644 --- a/Screenbox.Core/Services/SettingsService.cs +++ b/Screenbox.Core/Services/SettingsService.cs @@ -7,6 +7,7 @@ using Windows.Foundation.Collections; using Windows.Media; using Windows.Storage; +using Windows.UI.ViewManagement; namespace Screenbox.Core.Services { @@ -166,7 +167,23 @@ public bool PlayerShowChapters public bool PlayerAutoFullScreen { get => GetValue(PlayerAutoFullScreenKey); - set => SetValue(PlayerAutoFullScreenKey, value); + set + { + SetValue(PlayerAutoFullScreenKey, value); + + // Update preferred launch windowing mode based on setting + try + { + var view = Windows.UI.ViewManagement.ApplicationView.GetForCurrentView(); + view.PreferredLaunchWindowingMode = value + ? Windows.UI.ViewManagement.ApplicationViewWindowingMode.FullScreen + : Windows.UI.ViewManagement.ApplicationViewWindowingMode.Auto; + } + catch + { + // Ignore errors when ApplicationView is not available (e.g., during testing) + } + } } public SettingsService() @@ -189,6 +206,19 @@ public SettingsService() SetDefault(PlayerShowChaptersKey, true); SetDefault(PlayerAutoFullScreenKey, false); + // Initialize preferred launch windowing mode based on current setting + try + { + var view = ApplicationView.GetForCurrentView(); + view.PreferredLaunchWindowingMode = PlayerAutoFullScreen + ? ApplicationViewWindowingMode.FullScreen + : ApplicationViewWindowingMode.Auto; + } + catch + { + // Ignore errors when ApplicationView is not available (e.g., during testing) + } + // Device family specific overrides if (SystemInformation.IsXbox) { diff --git a/Screenbox.Core/ViewModels/PlayerPageViewModel.cs b/Screenbox.Core/ViewModels/PlayerPageViewModel.cs index 2ac13cc7f..6cb387ea2 100644 --- a/Screenbox.Core/ViewModels/PlayerPageViewModel.cs +++ b/Screenbox.Core/ViewModels/PlayerPageViewModel.cs @@ -615,11 +615,6 @@ private async void ProcessOpeningMedia(MediaViewModel? current) // If it's audio only, don't resize on next video playback _resizeNext = false; } - else if (_settingsService.PlayerAutoFullScreen && _windowService.ViewMode == WindowViewMode.Default) - { - // Auto enter full screen for video files if setting is enabled and in default window mode - _windowService.TryEnterFullScreen(); - } } else if (PlayerVisibility == PlayerVisibilityState.Minimal) { diff --git a/Screenbox/App.xaml.cs b/Screenbox/App.xaml.cs index b233ebe2a..4cfc71f64 100644 --- a/Screenbox/App.xaml.cs +++ b/Screenbox/App.xaml.cs @@ -187,6 +187,18 @@ protected override void OnFileActivated(FileActivatedEventArgs args) } Window.Current.Activate(); + + // Auto enter full screen if setting is enabled and we're not already in a special mode + var settings = CommunityToolkit.Mvvm.DependencyInjection.Ioc.Default.GetRequiredService(); + if (settings.PlayerAutoFullScreen) + { + var view = Windows.UI.ViewManagement.ApplicationView.GetForCurrentView(); + if (!view.IsFullScreenMode && view.ViewMode == Windows.UI.ViewManagement.ApplicationViewMode.Default) + { + view.TryEnterFullScreenMode(); + } + } + WeakReferenceMessenger.Default.Send(new PlayFilesMessage(args.Files, args.NeighboringFilesQuery)); } From 256678a1ed4818879ffd6a1c9acda39a7a6d9b72 Mon Sep 17 00:00:00 2001 From: United600 Date: Wed, 3 Sep 2025 17:48:17 +0100 Subject: [PATCH 5/6] fix build errors and add PlayerAutoFullScreen --- Screenbox.Core/Services/ISettingsService.cs | 1 + Screenbox.Core/Services/SettingsService.cs | 20 +++++++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/Screenbox.Core/Services/ISettingsService.cs b/Screenbox.Core/Services/ISettingsService.cs index cf456da4e..1533da88b 100644 --- a/Screenbox.Core/Services/ISettingsService.cs +++ b/Screenbox.Core/Services/ISettingsService.cs @@ -26,5 +26,6 @@ public interface ISettingsService bool UseMultipleInstances { get; set; } string LivelyActivePath { get; set; } MediaPlaybackAutoRepeatMode PersistentRepeatMode { get; set; } + bool PlayerAutoFullScreen { get; set; } } } diff --git a/Screenbox.Core/Services/SettingsService.cs b/Screenbox.Core/Services/SettingsService.cs index 30305054c..39258765f 100644 --- a/Screenbox.Core/Services/SettingsService.cs +++ b/Screenbox.Core/Services/SettingsService.cs @@ -174,10 +174,13 @@ public bool PlayerAutoFullScreen // Update preferred launch windowing mode based on setting try { - var view = Windows.UI.ViewManagement.ApplicationView.GetForCurrentView(); - view.PreferredLaunchWindowingMode = value - ? Windows.UI.ViewManagement.ApplicationViewWindowingMode.FullScreen - : Windows.UI.ViewManagement.ApplicationViewWindowingMode.Auto; + var view = ApplicationView.GetForCurrentView(); + if (view != null) + { + ApplicationView.PreferredLaunchWindowingMode = value + ? ApplicationViewWindowingMode.FullScreen + : ApplicationViewWindowingMode.Auto; + } } catch { @@ -210,9 +213,12 @@ public SettingsService() try { var view = ApplicationView.GetForCurrentView(); - view.PreferredLaunchWindowingMode = PlayerAutoFullScreen - ? ApplicationViewWindowingMode.FullScreen - : ApplicationViewWindowingMode.Auto; + if (view != null) + { + ApplicationView.PreferredLaunchWindowingMode = PlayerAutoFullScreen + ? ApplicationViewWindowingMode.FullScreen + : ApplicationViewWindowingMode.Auto; + } } catch { From 1e4aaaca3b990cece6fced1018904c5001ce16a8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 3 Sep 2025 17:02:21 +0000 Subject: [PATCH 6/6] Fix PreferredLaunchWindowingMode forcing all app launches into fullscreen Co-authored-by: United600 <698155+United600@users.noreply.github.com> --- Screenbox.Core/Services/SettingsService.cs | 37 +--------------------- 1 file changed, 1 insertion(+), 36 deletions(-) diff --git a/Screenbox.Core/Services/SettingsService.cs b/Screenbox.Core/Services/SettingsService.cs index 39258765f..08100a671 100644 --- a/Screenbox.Core/Services/SettingsService.cs +++ b/Screenbox.Core/Services/SettingsService.cs @@ -167,26 +167,7 @@ public bool PlayerShowChapters public bool PlayerAutoFullScreen { get => GetValue(PlayerAutoFullScreenKey); - set - { - SetValue(PlayerAutoFullScreenKey, value); - - // Update preferred launch windowing mode based on setting - try - { - var view = ApplicationView.GetForCurrentView(); - if (view != null) - { - ApplicationView.PreferredLaunchWindowingMode = value - ? ApplicationViewWindowingMode.FullScreen - : ApplicationViewWindowingMode.Auto; - } - } - catch - { - // Ignore errors when ApplicationView is not available (e.g., during testing) - } - } + set => SetValue(PlayerAutoFullScreenKey, value); } public SettingsService() @@ -209,22 +190,6 @@ public SettingsService() SetDefault(PlayerShowChaptersKey, true); SetDefault(PlayerAutoFullScreenKey, false); - // Initialize preferred launch windowing mode based on current setting - try - { - var view = ApplicationView.GetForCurrentView(); - if (view != null) - { - ApplicationView.PreferredLaunchWindowingMode = PlayerAutoFullScreen - ? ApplicationViewWindowingMode.FullScreen - : ApplicationViewWindowingMode.Auto; - } - } - catch - { - // Ignore errors when ApplicationView is not available (e.g., during testing) - } - // Device family specific overrides if (SystemInformation.IsXbox) {