From d5081e3f93a3283ca7e73358d24d76d110ea962f Mon Sep 17 00:00:00 2001 From: sharmander Date: Fri, 19 Feb 2021 19:34:41 -0500 Subject: Make windows DPI aware to display properly on high-resolution screens. (#1983) * Make Windows DPI aware to display properly on high-resolution screens. * remove empty line * Don't use app manifest, set process dpi aware programatically. Store variables in Program.cs for use instead of re-creating them per class/ method. * Fix for linux/osx * Add braces * Re-use manifest. It appears to be required on linux. * Undo previous commit -- it appears linux was simply never affected. * Addressed AcK's comments * Remove unused usings * Address comments by AcK #2 * Re-order * Move FromHwnd call to ForceDpiAware class. Wrap in Try-Catch to prevent crashes on systems that don't support it. * Additional code cleanup * Remove "global::" reference. --- Ryujinx.Common/System/ForceDpiAware.cs | 45 ++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 Ryujinx.Common/System/ForceDpiAware.cs (limited to 'Ryujinx.Common/System') diff --git a/Ryujinx.Common/System/ForceDpiAware.cs b/Ryujinx.Common/System/ForceDpiAware.cs new file mode 100644 index 00000000..81c69376 --- /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); + } + } +} -- cgit v1.2.3