diff --git a/Ryujinx.Common/Ryujinx.Common.csproj b/Ryujinx.Common/Ryujinx.Common.csproj index 4bb52c6d2..a7e9c66c9 100644 --- a/Ryujinx.Common/Ryujinx.Common.csproj +++ b/Ryujinx.Common/Ryujinx.Common.csproj @@ -7,6 +7,7 @@ + diff --git a/Ryujinx.Common/System/ForceDpiAware.cs b/Ryujinx.Common/System/ForceDpiAware.cs new file mode 100644 index 000000000..81c69376c --- /dev/null +++ b/Ryujinx.Common/System/ForceDpiAware.cs @@ -0,0 +1,45 @@ +using Ryujinx.Common.Logging; +using System; +using System.Drawing; +using System.Runtime.InteropServices; + +namespace Ryujinx.Common.System +{ + public static class ForceDpiAware + { + [DllImport("user32.dll")] + private static extern bool SetProcessDPIAware(); + + private static readonly double _standardDpiScale = 96.0; + private static readonly double _maxScaleFactor = 1.25; + + /// + /// Marks the application as DPI-Aware when running on the Windows operating system. + /// + public static void Windows() + { + // Make process DPI aware for proper window sizing on high-res screens. + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && Environment.OSVersion.Version.Major >= 6) + { + SetProcessDPIAware(); + } + } + + public static double GetWindowScaleFactor() + { + double userDpiScale; + + try + { + userDpiScale = Graphics.FromHwnd(IntPtr.Zero).DpiX; + } + catch (Exception e) + { + Logger.Warning?.Print(LogClass.Application, $"Couldn't determine monitor DPI: {e.Message}"); + userDpiScale = 96.0; + } + + return Math.Min(userDpiScale / _standardDpiScale, _maxScaleFactor); + } + } +} diff --git a/Ryujinx/Program.cs b/Ryujinx/Program.cs index c6d3b1bd1..5d50e9d2a 100644 --- a/Ryujinx/Program.cs +++ b/Ryujinx/Program.cs @@ -18,12 +18,14 @@ namespace Ryujinx { class Program { + public static double WindowScaleFactor { get; private set; } + public static string Version { get; private set; } public static string ConfigurationPath { get; set; } static void Main(string[] args) - { + { // Parse Arguments. string launchPathArg = null; string baseDirPathArg = null; @@ -54,6 +56,10 @@ namespace Ryujinx } } + // Make process DPI aware for proper window sizing on high-res screens. + ForceDpiAware.Windows(); + WindowScaleFactor = ForceDpiAware.GetWindowScaleFactor(); + // Delete backup files after updating. Task.Run(Updater.CleanupUpdate); diff --git a/Ryujinx/Ui/MainWindow.cs b/Ryujinx/Ui/MainWindow.cs index 92a2b4f1c..2118076a7 100644 --- a/Ryujinx/Ui/MainWindow.cs +++ b/Ryujinx/Ui/MainWindow.cs @@ -1113,7 +1113,10 @@ namespace Ryujinx.Ui private void Settings_Pressed(object sender, EventArgs args) { - new SettingsWindow(this, _virtualFileSystem, _contentManager).Show(); + SettingsWindow settingsWindow = new SettingsWindow(this, _virtualFileSystem, _contentManager); + + settingsWindow.SetSizeRequest((int)(settingsWindow.DefaultWidth * Program.WindowScaleFactor), (int)(settingsWindow.DefaultHeight * Program.WindowScaleFactor)); + settingsWindow.Show(); } private void Simulate_WakeUp_Message_Pressed(object sender, EventArgs args) @@ -1134,7 +1137,10 @@ namespace Ryujinx.Ui private void About_Pressed(object sender, EventArgs args) { - new AboutWindow().Show(); + AboutWindow aboutWindow = new AboutWindow(); + + aboutWindow.SetSizeRequest((int)(aboutWindow.DefaultWidth * Program.WindowScaleFactor), (int)(aboutWindow.DefaultHeight * Program.WindowScaleFactor)); + aboutWindow.Show(); } private void Fav_Toggled(object sender, EventArgs args) diff --git a/Ryujinx/Ui/Windows/SettingsWindow.cs b/Ryujinx/Ui/Windows/SettingsWindow.cs index e839a366c..0938783ff 100644 --- a/Ryujinx/Ui/Windows/SettingsWindow.cs +++ b/Ryujinx/Ui/Windows/SettingsWindow.cs @@ -570,7 +570,10 @@ namespace Ryujinx.Ui.Windows { ((ToggleButton)sender).SetStateFlags(StateFlags.Normal, true); - new ControllerWindow(playerIndex).Show(); + ControllerWindow controllerWindow = new ControllerWindow(playerIndex); + + controllerWindow.SetSizeRequest((int)(controllerWindow.DefaultWidth * Program.WindowScaleFactor), (int)(controllerWindow.DefaultHeight * Program.WindowScaleFactor)); + controllerWindow.Show(); } private void SaveToggle_Activated(object sender, EventArgs args)