diff options
author | Juan Linietsky <reduzio@gmail.com> | 2016-06-01 12:43:30 -0300 |
---|---|---|
committer | Juan Linietsky <reduzio@gmail.com> | 2016-06-01 12:43:52 -0300 |
commit | 4ec2b1434f8260f959e3e7327ebf1410cff6841b (patch) | |
tree | d9a93de3ac6ddddbcd85482ab3a4ec3e0b29ea5a /platform/windows | |
parent | 5b9ff5f494055f20b2fbb655a52556b77796e906 (diff) |
removed dependency on shcore.dll to get DPI
fixes #4973
Diffstat (limited to 'platform/windows')
-rw-r--r-- | platform/windows/detect.py | 2 | ||||
-rw-r--r-- | platform/windows/os_windows.cpp | 88 |
2 files changed, 75 insertions, 15 deletions
diff --git a/platform/windows/detect.py b/platform/windows/detect.py index 4edae9cceb..97d2461e58 100644 --- a/platform/windows/detect.py +++ b/platform/windows/detect.py @@ -243,7 +243,7 @@ def configure(env): env.Append(CCFLAGS=['/DGLES2_ENABLED']) env.Append(CCFLAGS=['/DGLEW_ENABLED']) - LIBS=['winmm','opengl32','dsound','kernel32','ole32','oleaut32','user32','gdi32', 'IPHLPAPI','Shcore','Shlwapi', 'wsock32', 'shell32','advapi32','dinput8','dxguid'] + LIBS=['winmm','opengl32','dsound','kernel32','ole32','oleaut32','user32','gdi32', 'IPHLPAPI','Shlwapi', 'wsock32', 'shell32','advapi32','dinput8','dxguid'] env.Append(LINKFLAGS=[p+env["LIBSUFFIX"] for p in LIBS]) env.Append(LIBPATH=[os.getenv("WindowsSdkDir")+"/Lib"]) diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index 8bb5de5d5d..4f2bfd46ae 100644 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -57,13 +57,6 @@ #include <regstr.h> #include <process.h> -#if (_MSC_VER >= 1700) -#define HIDPI_SUPPORT -#endif - -#ifdef HIDPI_SUPPORT -#include <ShellScalingAPI.h> -#endif static const WORD MAX_CONSOLE_LINES = 1500; extern "C" { @@ -781,6 +774,8 @@ LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg, WPARAM wParam, LPARAM lParam) { } + + void OS_Windows::process_key_events() { for(int i=0;i<key_event_pos;i++) { @@ -852,6 +847,75 @@ void OS_Windows::process_key_events() { key_event_pos=0; } +enum _MonitorDpiType +{ + MDT_Effective_DPI = 0, + MDT_Angular_DPI = 1, + MDT_Raw_DPI = 2, + MDT_Default = MDT_Effective_DPI +}; + + +static int QueryDpiForMonitor(HMONITOR hmon, _MonitorDpiType dpiType= MDT_Default) +{ + + + int dpiX = 96, dpiY = 96; + + static HMODULE Shcore = NULL; + typedef HRESULT (WINAPI* GetDPIForMonitor_t)(HMONITOR hmonitor, _MonitorDpiType dpiType, UINT *dpiX, UINT *dpiY); + static GetDPIForMonitor_t getDPIForMonitor = NULL; + + if (Shcore == NULL) + { + Shcore = LoadLibraryW(L"Shcore.dll"); + getDPIForMonitor = Shcore ? (GetDPIForMonitor_t)GetProcAddress(Shcore, "GetDpiForMonitor") : NULL; + + if ((Shcore == NULL) || (getDPIForMonitor == NULL)) + { + if (Shcore) + FreeLibrary(Shcore); + Shcore = (HMODULE)INVALID_HANDLE_VALUE; + } + } + + UINT x = 0, y = 0; + HRESULT hr = E_FAIL; + bool bSet = false; + if (hmon && (Shcore != (HMODULE)INVALID_HANDLE_VALUE)) + { + hr = getDPIForMonitor(hmon, dpiType/*MDT_Effective_DPI*/, &x, &y); + if (SUCCEEDED(hr) && (x > 0) && (y > 0)) + { + + dpiX = (int)x; + dpiY = (int)y; + } + } + else + { + static int overallX = 0, overallY = 0; + if (overallX <= 0 || overallY <= 0) + { + HDC hdc = GetDC(NULL); + if (hdc) + { + overallX = GetDeviceCaps(hdc, LOGPIXELSX); + overallY = GetDeviceCaps(hdc, LOGPIXELSY); + ReleaseDC(NULL, hdc); + } + } + if (overallX > 0 && overallY > 0) + { + dpiX = overallX; dpiY = overallY; + } + } + + + return (dpiX+dpiY)/2; +} + + BOOL CALLBACK OS_Windows::MonitorEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) { OS_Windows *self=(OS_Windows*)OS::get_singleton(); MonitorInfo minfo; @@ -861,13 +925,9 @@ BOOL CALLBACK OS_Windows::MonitorEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPR minfo.rect.pos.y=lprcMonitor->top; minfo.rect.size.x=lprcMonitor->right - lprcMonitor->left; minfo.rect.size.y=lprcMonitor->bottom - lprcMonitor->top; -#ifdef HIDPI_SUPPORT - UINT dpix,dpiy; - GetDpiForMonitor(hMonitor,MDT_EFFECTIVE_DPI,&dpix,&dpiy); - minfo.dpi=(dpix + dpiy)/2; -#else - minfo.dpi=72; -#endif + + minfo.dpi = QueryDpiForMonitor(hMonitor); + self->monitor_info.push_back(minfo); return TRUE; |