From 3fb583c98c39da58f0752c652ca60be87ff1f566 Mon Sep 17 00:00:00 2001
From: TSRBerry <20988865+TSRBerry@users.noreply.github.com>
Date: Wed, 30 Nov 2022 23:34:25 +0100
Subject: [PATCH] Avalonia: Clean up leftover RenderTimer & Fix minimum and
 initial window size (#3935)

* ava: Cleanup RenderTimer

* ava: Remove ContentControl from RendererHost

* ava: Remove unused actual scale factor

* ava: Enable UseGpu for Linux

* ava: Set better initial size & Scale the window properly

* ava: Realign properties

* ava: Use explicit type & specify where the note applies
---
 Ryujinx.Ava/Program.cs                        |  27 +----
 Ryujinx.Ava/Ui/Controls/RenderTimer.cs        | 100 ------------------
 Ryujinx.Ava/Ui/Controls/RendererHost.axaml    |   7 --
 Ryujinx.Ava/Ui/Controls/RendererHost.axaml.cs |   2 +-
 Ryujinx.Ava/Ui/Windows/MainWindow.axaml       |   5 +-
 Ryujinx.Ava/Ui/Windows/MainWindow.axaml.cs    |   4 +-
 6 files changed, 13 insertions(+), 132 deletions(-)
 delete mode 100644 Ryujinx.Ava/Ui/Controls/RenderTimer.cs

diff --git a/Ryujinx.Ava/Program.cs b/Ryujinx.Ava/Program.cs
index a941302b2d..9104039703 100644
--- a/Ryujinx.Ava/Program.cs
+++ b/Ryujinx.Ava/Program.cs
@@ -1,8 +1,5 @@
 using ARMeilleure.Translation.PTC;
 using Avalonia;
-using Avalonia.Rendering;
-using Avalonia.Threading;
-using Ryujinx.Ava.Ui.Controls;
 using Ryujinx.Ava.Ui.Windows;
 using Ryujinx.Common;
 using Ryujinx.Common.Configuration;
@@ -23,18 +20,15 @@ namespace Ryujinx.Ava
 {
     internal class Program
     {
-        public static double      WindowScaleFactor { get; set; }
-        public static double      ActualScaleFactor { get; set; }
-        public static string      Version           { get; private set; }
-        public static string      ConfigurationPath { get; private set; }
-        public static bool        PreviewerDetached { get; private set; }
-        public static RenderTimer RenderTimer       { get; private set; }
+        public static double WindowScaleFactor { get; set; }
+        public static string Version           { get; private set; }
+        public static string ConfigurationPath { get; private set; }
+        public static bool   PreviewerDetached { get; private set; }
 
         [DllImport("user32.dll", SetLastError = true)]
         public static extern int MessageBoxA(IntPtr hWnd, string text, string caption, uint type);
 
         private const uint MB_ICONWARNING = 0x30;
-        private const int  BaseDpi        = 96;
 
         public static void Main(string[] args)
         {
@@ -49,11 +43,7 @@ namespace Ryujinx.Ava
 
             Initialize(args);
 
-            RenderTimer = new RenderTimer();
-
             BuildAvaloniaApp().StartWithClassicDesktopLifetime(args);
-
-            RenderTimer.Dispose();
         }
 
         public static AppBuilder BuildAvaloniaApp()
@@ -65,7 +55,7 @@ namespace Ryujinx.Ava
                     EnableMultiTouch = true,
                     EnableIme        = true,
                     UseEGL           = false,
-                    UseGpu           = false
+                    UseGpu           = true
                 })
                 .With(new Win32PlatformOptions
                 {
@@ -75,12 +65,6 @@ namespace Ryujinx.Ava
                     CompositionBackdropCornerRadius = 8.0f,
                 })
                 .UseSkia()
-                .AfterSetup(_ =>
-                {
-                    AvaloniaLocator.CurrentMutable
-                        .Bind<IRenderTimer>().ToConstant(RenderTimer)
-                        .Bind<IRenderLoop>().ToConstant(new RenderLoop(RenderTimer, Dispatcher.UIThread));
-                })
                 .LogToTrace();
         }
 
@@ -115,7 +99,6 @@ namespace Ryujinx.Ava
             ForceDpiAware.Windows();
 
             WindowScaleFactor = ForceDpiAware.GetWindowScaleFactor();
-            ActualScaleFactor = ForceDpiAware.GetActualScaleFactor() / BaseDpi;
 
             // Logging system information.
             PrintSystemInfo();
diff --git a/Ryujinx.Ava/Ui/Controls/RenderTimer.cs b/Ryujinx.Ava/Ui/Controls/RenderTimer.cs
deleted file mode 100644
index 577115ea6b..0000000000
--- a/Ryujinx.Ava/Ui/Controls/RenderTimer.cs
+++ /dev/null
@@ -1,100 +0,0 @@
-using Avalonia.Rendering;
-using System;
-using System.Threading;
-using System.Timers;
-
-namespace Ryujinx.Ava.Ui.Controls
-{
-    internal class RenderTimer : IRenderTimer, IDisposable
-    {
-        public event Action<TimeSpan> Tick
-        {
-            add
-            {
-                _tick += value;
-
-                if (_subscriberCount++ == 0)
-                {
-                    Start();
-                }
-            }
-
-            remove
-            {
-                if (--_subscriberCount == 0)
-                {
-                    Stop();
-                }
-
-                _tick -= value;
-            }
-        }
-
-        private Thread _tickThread;
-        private readonly System.Timers.Timer _timer;
-
-        private Action<TimeSpan> _tick;
-        private int _subscriberCount;
-
-        private bool _isRunning;
-
-        private AutoResetEvent _resetEvent;
-
-        public RenderTimer()
-        {
-            _timer = new System.Timers.Timer(15);
-            _resetEvent = new AutoResetEvent(true);
-            _timer.Elapsed += Timer_Elapsed;
-        }
-
-        private void Timer_Elapsed(object sender, ElapsedEventArgs e)
-        {
-            TickNow();
-        }
-
-        public void Start()
-        {
-            _timer.Start();
-            if (_tickThread == null)
-            {
-                _tickThread = new Thread(RunTick);
-                _tickThread.Name = "RenderTimerTickThread";
-                _tickThread.IsBackground = true;
-                _isRunning = true;
-                _tickThread.Start();
-            }
-        }
-
-        public void RunTick()
-        {
-            while (_isRunning)
-            {
-                _resetEvent.WaitOne();
-                _tick?.Invoke(TimeSpan.FromMilliseconds(Environment.TickCount));
-            }
-        }
-
-        public void TickNow()
-        {
-            lock (_timer)
-            {
-                _resetEvent.Set();
-            }
-        }
-
-        public void Stop()
-        {
-            _timer.Stop();
-        }
-
-        public void Dispose()
-        {
-            _timer.Elapsed -= Timer_Elapsed;
-            _timer.Stop();
-            _isRunning = false;
-            _resetEvent.Set();
-            _tickThread.Join();
-            _resetEvent.Dispose();
-        }
-    }
-}
diff --git a/Ryujinx.Ava/Ui/Controls/RendererHost.axaml b/Ryujinx.Ava/Ui/Controls/RendererHost.axaml
index be72fd61ee..5b27182dfd 100644
--- a/Ryujinx.Ava/Ui/Controls/RendererHost.axaml
+++ b/Ryujinx.Ava/Ui/Controls/RendererHost.axaml
@@ -4,11 +4,4 @@
              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
              mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
              x:Class="Ryujinx.Ava.Ui.Controls.RendererHost">
-    <ContentControl
-        HorizontalAlignment="Stretch"
-        HorizontalContentAlignment="Stretch"
-        VerticalAlignment="Stretch"
-        VerticalContentAlignment="Stretch"
-        Name="View"
-        />
 </UserControl>
diff --git a/Ryujinx.Ava/Ui/Controls/RendererHost.axaml.cs b/Ryujinx.Ava/Ui/Controls/RendererHost.axaml.cs
index 0d1984fd5b..b6986b7c80 100644
--- a/Ryujinx.Ava/Ui/Controls/RendererHost.axaml.cs
+++ b/Ryujinx.Ava/Ui/Controls/RendererHost.axaml.cs
@@ -41,7 +41,7 @@ namespace Ryujinx.Ava.Ui.Controls
         {
             _currentWindow.WindowCreated += CurrentWindow_WindowCreated;
             _currentWindow.SizeChanged += CurrentWindow_SizeChanged;
-            View.Content = _currentWindow;
+            Content = _currentWindow;
         }
 
         public void CreateVulkan()
diff --git a/Ryujinx.Ava/Ui/Windows/MainWindow.axaml b/Ryujinx.Ava/Ui/Windows/MainWindow.axaml
index 313e701c8c..5b9dd8f910 100644
--- a/Ryujinx.Ava/Ui/Windows/MainWindow.axaml
+++ b/Ryujinx.Ava/Ui/Windows/MainWindow.axaml
@@ -13,7 +13,7 @@
     Title="Ryujinx"
     Width="1280"
     Height="785"
-    MinWidth="1024"
+    MinWidth="1092"
     MinHeight="680"
     d:DesignHeight="720"
     d:DesignWidth="1280"
@@ -57,6 +57,8 @@
                 <RowDefinition Height="Auto" />
             </Grid.RowDefinitions>
             <StackPanel
+                Name="MenuBar"
+                MinHeight="35"
                 Grid.Row="0"
                 Margin="0"
                 HorizontalAlignment="Stretch"
@@ -549,6 +551,7 @@
             <Grid
                 Name="StatusBar"
                 Grid.Row="2"
+                MinHeight="30"
                 Height="30"
                 Margin="0,0"
                 HorizontalAlignment="Stretch"
diff --git a/Ryujinx.Ava/Ui/Windows/MainWindow.axaml.cs b/Ryujinx.Ava/Ui/Windows/MainWindow.axaml.cs
index e874982abb..8b5a39a7d7 100644
--- a/Ryujinx.Ava/Ui/Windows/MainWindow.axaml.cs
+++ b/Ryujinx.Ava/Ui/Windows/MainWindow.axaml.cs
@@ -90,7 +90,9 @@ namespace Ryujinx.Ava.Ui.Windows
 
             Title = $"Ryujinx {Program.Version}";
 
-            Height /= Program.WindowScaleFactor;
+            // NOTE: Height of MenuBar and StatusBar is not usable here, since it would still be 0 at this point.
+            double barHeight = MenuBar.MinHeight + StatusBar.MinHeight;
+            Height = ((Height - barHeight) / Program.WindowScaleFactor) + barHeight;
             Width /= Program.WindowScaleFactor;
 
             if (Program.PreviewerDetached)