diff options
author | Sven Gothel <[email protected]> | 2023-01-31 03:57:48 +0100 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2023-01-31 03:57:48 +0100 |
commit | bebb7e9b078f6eaed478143ffbdeeece5ca0e037 (patch) | |
tree | 19eb9d743a7aa0ebc1128f314cd3fb535a344c9d /src/nativewindow | |
parent | e96aeb6e9acd2b1435f5fad244a1488e74a3a6d6 (diff) |
GDIUtil: Add GetMonitor*() variants incl. PixelScale (Part-2, adding missing native header and code files)
Part-1 in commit e96aeb6e9acd2b1435f5fad244a1488e74a3a6d6
Diffstat (limited to 'src/nativewindow')
-rw-r--r-- | src/nativewindow/native/win32/WindowsSHC.c | 73 | ||||
-rw-r--r-- | src/nativewindow/native/win32/WindowsUser.c | 33 |
2 files changed, 106 insertions, 0 deletions
diff --git a/src/nativewindow/native/win32/WindowsSHC.c b/src/nativewindow/native/win32/WindowsSHC.c new file mode 100644 index 000000000..45cefb126 --- /dev/null +++ b/src/nativewindow/native/win32/WindowsSHC.c @@ -0,0 +1,73 @@ + +#include <windows.h> +#include "WindowsSHC.h" + +#include <stdlib.h> +#include <stdio.h> + +// #define VERBOSE_ON 1 + +#ifdef VERBOSE_ON + #define DBG_PRINT(args...) fprintf(stderr, args); +#else + #define DBG_PRINT(args...) +#endif + +/* GetProcAddress doesn't exist in A/W variants under desktop Windows */ +#ifndef UNDER_CE +#define GetProcAddressA GetProcAddress +#endif + +typedef HRESULT(WINAPI *GetDpiForMonitorPROCADDR)(HMONITOR, int, UINT*, UINT*); +#ifndef MDT_EFFECTIVE_DPI + #define MDT_EFFECTIVE_DPI 0 +#endif +// See also SetProcessDpiAwareness(..) and SetThreadDpiAwarenessContext(..) + +#define INIT_CALLED_MASK 1 << 0 +#define INIT_HAS_SHC_EXT_MASK 1 << 1 + +#define HAS_INIT(a) ( 0 != ( INIT_CALLED_MASK & (a) ) ) +#define HAS_SHC_EXT(a) ( 0 != ( INIT_HAS_SHC_EXT_MASK & (a) ) ) + +static int _init = 0; // INIT_ bits, see above +static GetDpiForMonitorPROCADDR _GetDpiForMonitor = NULL; + +static int initWindowsSHC() { + if( !HAS_INIT(_init) ) { + _init |= INIT_CALLED_MASK; + HANDLE hShcAPI = LoadLibrary(TEXT("shcore.dll")); + if (hShcAPI) { + _GetDpiForMonitor = (GetDpiForMonitorPROCADDR) GetProcAddressA (hShcAPI, "GetDpiForMonitor"); + if(NULL != _GetDpiForMonitor ) { + _init |= INIT_HAS_SHC_EXT_MASK; + } + } + // FreeLibrary (hShcAPI); + DBG_PRINT("DWM - initWindowsSHC: hasSHC %d\n", HAS_SHC_EXT(_init)); + } + return _init; +} + +BOOL ShcIsExtensionAvailable() { + return HAS_SHC_EXT( initWindowsSHC() ) ? TRUE : FALSE; +} + +BOOL ShcGetMonitorPixelScale1(HMONITOR hmon, float *psXY) { + psXY[0] = 0; + psXY[1] = 0; + if( !ShcIsExtensionAvailable() ) { + return FALSE; + } + if( NULL == hmon ) { + return FALSE; + } + UINT dpiX=0, dpiY=0; + if( S_OK != _GetDpiForMonitor(hmon, MDT_EFFECTIVE_DPI, &dpiX, &dpiY) ) { + return FALSE; + } + psXY[0] = (float)(dpiX) / 96.0f; + psXY[1] = (float)(dpiY) / 96.0f; + return TRUE; +} + diff --git a/src/nativewindow/native/win32/WindowsUser.c b/src/nativewindow/native/win32/WindowsUser.c new file mode 100644 index 000000000..43856ccb2 --- /dev/null +++ b/src/nativewindow/native/win32/WindowsUser.c @@ -0,0 +1,33 @@ + +#include <windows.h> +#include "WindowsUser.h" + +#include <stdlib.h> +#include <stdio.h> + +// #define VERBOSE_ON 1 + +#ifdef VERBOSE_ON + #define DBG_PRINT(args...) fprintf(stderr, args); +#else + #define DBG_PRINT(args...) +#endif + +// MONITOR_DEFAULTTONULL 0x00000000 +// MONITOR_DEFAULTTOPRIMARY 0x00000001 +// MONITOR_DEFAULTTONEAREST 0x00000002 + +HMONITOR GetMonitorFromWindow(HWND hwnd) { + return MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); +} + +HMONITOR GetMonitorFromPoint(int x, int y) { + POINT pt = { (LONG)x, (LONG)y }; + return MonitorFromPoint(pt, MONITOR_DEFAULTTONEAREST); +} + +HMONITOR GetMonitorFromRect(int left, int top, int right, int bottom) { + RECT rect = { (LONG)left, (LONG)top, (LONG)right, (LONG)bottom }; + return MonitorFromRect(&rect, MONITOR_DEFAULTTONEAREST); +} + |