diff options
| author | sharmander <saldabain.dev@gmail.com> | 2021-02-19 19:34:41 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-02-20 01:34:41 +0100 |
| commit | d5081e3f93a3283ca7e73358d24d76d110ea962f (patch) | |
| tree | 32edbbcab8a51e25b5b1a35a35976295ba56de03 /Ryujinx.Common/System | |
| parent | 65eb9901f17f210aab467eabfc090c872c08755a (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.cs | 45 |
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); + } + } +} |
