aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Common/System
diff options
context:
space:
mode:
authorsharmander <saldabain.dev@gmail.com>2021-02-19 19:34:41 -0500
committerGitHub <noreply@github.com>2021-02-20 01:34:41 +0100
commitd5081e3f93a3283ca7e73358d24d76d110ea962f (patch)
tree32edbbcab8a51e25b5b1a35a35976295ba56de03 /Ryujinx.Common/System
parent65eb9901f17f210aab467eabfc090c872c08755a (diff)
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.
Diffstat (limited to 'Ryujinx.Common/System')
-rw-r--r--Ryujinx.Common/System/ForceDpiAware.cs45
1 files changed, 45 insertions, 0 deletions
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;
+
+ /// <summary>
+ /// Marks the application as DPI-Aware when running on the Windows operating system.
+ /// </summary>
+ 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);
+ }
+ }
+}