summaryrefslogtreecommitdiff
path: root/alf/alfcompat.cpp
diff options
context:
space:
mode:
authorJonas Kümmerlin <jonas@kuemmerlin.eu>2018-12-28 21:40:36 +0100
committerJonas Kümmerlin <jonas@kuemmerlin.eu>2018-12-28 21:40:36 +0100
commit416fe35c67352dd23ad698d8f732545caee3d82d (patch)
tree3a328b3e30d8ed0048fa342547efab413e971872 /alf/alfcompat.cpp
parenta5f3ea9ac12fccbc9faf3f152d4dfbe7f263268e (diff)
add per-monitor dpi support
Diffstat (limited to 'alf/alfcompat.cpp')
-rw-r--r--alf/alfcompat.cpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/alf/alfcompat.cpp b/alf/alfcompat.cpp
index 3ffc9f9..e6a9851 100644
--- a/alf/alfcompat.cpp
+++ b/alf/alfcompat.cpp
@@ -41,6 +41,42 @@ fallbackIsAppThemed(void)
return FALSE;
}
+static UINT WINAPI
+fallbackGetDpiForWindow(HWND win)
+{
+ (void)win;
+
+ UINT dpi = 0;
+
+ HDC hdcScreen = GetDC(NULL);
+ if (hdcScreen) {
+ dpi = GetDeviceCaps(hdcScreen, LOGPIXELSY);
+ ReleaseDC(NULL, hdcScreen);
+ }
+
+ if (!dpi) {
+ dpi = 96; // FIXME! fallback to default DPI
+ }
+
+ return dpi;
+}
+
+static BOOL WINAPI
+fallbackSystemParametersInfoForDpi(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni, UINT dpi)
+{
+ (void)dpi;
+
+ return SystemParametersInfo(uiAction, uiParam, pvParam, fWinIni);
+}
+
+static BOOL WINAPI
+fallbackAdjustWindowRectExForDpi(LPRECT lpRect, DWORD dwStyle, BOOL bMenu, DWORD dwExStyle, UINT dpi)
+{
+ (void)dpi;
+
+ return AdjustWindowRectEx(lpRect, dwStyle, bMenu, dwExStyle);
+}
+
ALFCompatFunctions *
ALF_CreateCompatFuncTable(void)
{
@@ -61,6 +97,19 @@ ALF_CreateCompatFuncTable(void)
COMPAT(comctl32.dll, DefSubclassProc, 413, NULL);
COMPAT(comctl32.dll, RemoveWindowSubclass, 412, NULL);
COMPAT(user32.dll, GetSystemMetricsForDpi, 0, fallbackGetSystemMetricsForDpi);
+ COMPAT(user32.dll, GetDpiForWindow, 0, fallbackGetDpiForWindow);
+
+ // FIXME: SystemParametersInfoForDpi is Unicode-Only.
+ // Writing a wrapper function would have been The Right Way, but such a function
+ // is yet to be written. So the current practical recommendation is to make
+ // ANSI builds System DPI aware only.
+#ifdef UNICODE
+ COMPAT(user32.dll, SystemParametersInfoForDpi, 0, fallbackSystemParametersInfoForDpi);
+#else
+ compatfn->SystemParametersInfoForDpi = fallbackSystemParametersInfoForDpi;
+#endif
+
+ COMPAT(user32.dll, AdjustWindowRectExForDpi, 0, fallbackAdjustWindowRectExForDpi);
// IsAppThemed would return TRUE even when we're linked against comctl32 v5
if (ALF_DllGetVersion("comctl32.dll") >= 0x60000) {