summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMoonchild <moonchild@palemoon.org>2020-10-06 09:23:59 +0000
committerMoonchild <moonchild@palemoon.org>2020-10-06 09:23:59 +0000
commitbda6f1a93f915f4156bc344651dcfc9b7bb3b9ee (patch)
treee9029ee3547f541cb6d7c175c7e185e1529025dc
parent521f2b476c3cac4cbdd0eee676a0dfedaa537041 (diff)
downloadUXP-bda6f1a93f915f4156bc344651dcfc9b7bb3b9ee.tar
UXP-bda6f1a93f915f4156bc344651dcfc9b7bb3b9ee.tar.gz
UXP-bda6f1a93f915f4156bc344651dcfc9b7bb3b9ee.tar.lz
UXP-bda6f1a93f915f4156bc344651dcfc9b7bb3b9ee.tar.xz
UXP-bda6f1a93f915f4156bc344651dcfc9b7bb3b9ee.zip
Issue #1606 - Add support for multi-monitor DPI awareness v2 (W10 1706+)
-rw-r--r--ipc/app/plugin-container.exe.manifest1
-rw-r--r--widget/windows/WinUtils.cpp20
-rw-r--r--widget/windows/WinUtils.h21
-rw-r--r--widget/windows/nsWindow.cpp2
4 files changed, 33 insertions, 11 deletions
diff --git a/ipc/app/plugin-container.exe.manifest b/ipc/app/plugin-container.exe.manifest
index 303109523..e3bdc56b0 100644
--- a/ipc/app/plugin-container.exe.manifest
+++ b/ipc/app/plugin-container.exe.manifest
@@ -29,6 +29,7 @@
<ms_asmv3:application xmlns:ms_asmv3="urn:schemas-microsoft-com:asm.v3">
<ms_asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>True/PM</dpiAware>
+ <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2,PerMonitor</dpiAwareness>
</ms_asmv3:windowsSettings>
</ms_asmv3:application>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
diff --git a/widget/windows/WinUtils.cpp b/widget/windows/WinUtils.cpp
index 28033193f..a43c92b69 100644
--- a/widget/windows/WinUtils.cpp
+++ b/widget/windows/WinUtils.cpp
@@ -449,10 +449,20 @@ WinUtils::Initialize()
if (IsWin10OrLater()) {
HMODULE user32Dll = ::GetModuleHandleW(L"user32");
if (user32Dll) {
- sEnableNonClientDpiScaling = (EnableNonClientDpiScalingProc)
- ::GetProcAddress(user32Dll, "EnableNonClientDpiScaling");
- sSetThreadDpiAwarenessContext = (SetThreadDpiAwarenessContextProc)
- ::GetProcAddress(user32Dll, "SetThreadDpiAwarenessContext");
+ auto getThreadDpiAwarenessContext = (decltype(GetThreadDpiAwarenessContext)*)
+ ::GetProcAddress(user32Dll, "GetThreadDpiAwarenessContext");
+ auto areDpiAwarenessContextsEqual = (decltype(AreDpiAwarenessContextsEqual)*)
+ ::GetProcAddress(user32Dll, "AreDpiAwarenessContextsEqual");
+ if (getThreadDpiAwarenessContext && areDpiAwarenessContextsEqual &&
+ areDpiAwarenessContextsEqual(getThreadDpiAwarenessContext(),
+ DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE)) {
+ // Only per-monitor DPI awareness v1 requires these workarounds.
+ // Since this was introduced in Win 8.1 we'll need to keep this indefinitely.
+ sEnableNonClientDpiScaling = (EnableNonClientDpiScalingProc)
+ ::GetProcAddress(user32Dll, "EnableNonClientDpiScaling");
+ sSetThreadDpiAwarenessContext = (SetThreadDpiAwarenessContextProc)
+ ::GetProcAddress(user32Dll, "SetThreadDpiAwarenessContext");
+ }
}
}
@@ -468,7 +478,7 @@ LRESULT WINAPI
WinUtils::NonClientDpiScalingDefWindowProcW(HWND hWnd, UINT msg,
WPARAM wParam, LPARAM lParam)
{
- if (msg == WM_NCCREATE && sEnableNonClientDpiScaling) {
+ if (msg == WM_NCCREATE) {
sEnableNonClientDpiScaling(hWnd);
}
return ::DefWindowProcW(hWnd, msg, wParam, lParam);
diff --git a/widget/windows/WinUtils.h b/widget/windows/WinUtils.h
index 1281171be..f268f907f 100644
--- a/widget/windows/WinUtils.h
+++ b/widget/windows/WinUtils.h
@@ -96,6 +96,11 @@ typedef enum DPI_AWARENESS {
#define DPI_AWARENESS_CONTEXT_DECLARED
#endif // (DPI_AWARENESS_CONTEXT_DECLARED)
+#if WINVER < 0x0605
+WINUSERAPI DPI_AWARENESS_CONTEXT WINAPI GetThreadDpiAwarenessContext();
+WINUSERAPI BOOL WINAPI
+AreDpiAwarenessContextsEqual(DPI_AWARENESS_CONTEXT, DPI_AWARENESS_CONTEXT);
+#endif /* WINVER < 0x0605 */
typedef DPI_AWARENESS_CONTEXT(WINAPI * SetThreadDpiAwarenessContextProc)(DPI_AWARENESS_CONTEXT);
typedef BOOL(WINAPI * EnableNonClientDpiScalingProc)(HWND);
@@ -152,6 +157,12 @@ class WinUtils
static SetThreadDpiAwarenessContextProc sSetThreadDpiAwarenessContext;
static EnableNonClientDpiScalingProc sEnableNonClientDpiScaling;
+ // Wrapper for DefWindowProc that will enable non-client dpi scaling on the
+ // window during creation.
+ static LRESULT WINAPI
+ NonClientDpiScalingDefWindowProcW(HWND hWnd, UINT msg,
+ WPARAM wParam, LPARAM lParam);
+
public:
class AutoSystemDpiAware
{
@@ -174,11 +185,11 @@ public:
DPI_AWARENESS_CONTEXT mPrevContext;
};
- // Wrapper for DefWindowProc that will enable non-client dpi scaling on the
- // window during creation.
- static LRESULT WINAPI
- NonClientDpiScalingDefWindowProcW(HWND hWnd, UINT msg,
- WPARAM wParam, LPARAM lParam);
+ static decltype(::DefWindowProcW)* GetDefWindowProc() {
+ return sEnableNonClientDpiScaling ?
+ NonClientDpiScalingDefWindowProcW :
+ ::DefWindowProcW;
+ }
/**
* Get the system's default logical-to-physical DPI scaling factor,
diff --git a/widget/windows/nsWindow.cpp b/widget/windows/nsWindow.cpp
index 907d8b9a5..b9c3ea154 100644
--- a/widget/windows/nsWindow.cpp
+++ b/widget/windows/nsWindow.cpp
@@ -999,7 +999,7 @@ nsWindow::RegisterWindowClass(const wchar_t* aClassName,
}
wc.style = CS_DBLCLKS | aExtraStyle;
- wc.lpfnWndProc = WinUtils::NonClientDpiScalingDefWindowProcW;
+ wc.lpfnWndProc = WinUtils::GetDefWindowProc();
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = nsToolkit::mDllInstance;