Browse Source

Improve macOS window state management and rendering integration

Ruben 3 tháng trước cách đây
mục cha
commit
a08dec83e6
1 tập tin đã thay đổi với 23 bổ sung5 xóa
  1. 23 5
      src/PicView.Avalonia.MacOS/Views/MacMainWindow.axaml.cs

+ 23 - 5
src/PicView.Avalonia.MacOS/Views/MacMainWindow.axaml.cs

@@ -1,17 +1,26 @@
 using Avalonia.Controls;
 using PicView.Avalonia.MacOS.WindowImpl;
+using PicView.Avalonia.UI;
 using PicView.Avalonia.ViewModels;
 using PicView.Avalonia.WindowBehavior;
+using R3;
+using R3.Avalonia;
 using ReactiveUI;
 
 namespace PicView.Avalonia.MacOS.Views;
 
 public partial class MacMainWindow : Window
 {
+    private readonly AvaloniaRenderingFrameProvider _frameProvider;
+    private IDisposable? _windowStateSubscription;
+
     public MacMainWindow()
     {
         InitializeComponent();
 
+        _frameProvider = new AvaloniaRenderingFrameProvider(GetTopLevel(this));
+        UIHelper.SetFrameProvider(_frameProvider);
+
         Loaded += delegate
         {
             // Keep window position when resizing
@@ -23,21 +32,23 @@ public partial class MacMainWindow : Window
             {
                 return;
             }
-            this.WhenAnyValue(x => x.WindowState).Subscribe(async state =>
+            Observable.EveryValueChanged(this, x => x.WindowState, _frameProvider).SelectAwait(async (state, _) =>
             {
                 switch (state)
                 {
                     case WindowState.FullScreen:
                         if (!Settings.WindowProperties.Fullscreen)
                         {
-                            await MacOSWindow.Fullscreen(this, vm); 
+                            await MacOSWindow.Fullscreen(this, vm);
                         }
+
                         break;
                     case WindowState.Maximized:
                         if (!Settings.WindowProperties.Maximized)
                         {
-                            await MacOSWindow.Maximize(this, vm); 
+                            await MacOSWindow.Maximize(this, vm);
                         }
+
                         break;
                     case WindowState.Normal:
                         if (Settings.WindowProperties.Maximized || Settings.WindowProperties.Fullscreen)
@@ -46,9 +57,11 @@ public partial class MacMainWindow : Window
                         }
                         break;
                 }
-            });
+                return Unit.Default;
+            }).Subscribe();
+            
             // Hide macOS buttons when interface is hidden
-            vm.WhenAnyValue(x => x.IsTopToolbarShown).Subscribe(shown =>
+            Observable.EveryValueChanged(vm, x => x.IsTopToolbarShown, _frameProvider).Subscribe(shown =>
             {
                 SystemDecorations = shown ? SystemDecorations.Full : SystemDecorations.None;
             });
@@ -76,4 +89,9 @@ public partial class MacMainWindow : Window
         await WindowFunctions.WindowClosingBehavior(this);
         base.OnClosing(e);
     }
+
+    protected override void OnClosed(EventArgs e)
+    {
+        _frameProvider?.Dispose();
+    }
 }