From 416fe35c67352dd23ad698d8f732545caee3d82d Mon Sep 17 00:00:00 2001 From: Jonas Kümmerlin Date: Fri, 28 Dec 2018 21:40:36 +0100 Subject: add per-monitor dpi support --- alf/alfcompat.cpp | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'alf/alfcompat.cpp') 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) { -- cgit v1.2.3