add oversampler
This commit is contained in:
113
oversampling/WDL/win32_hidpi.h
Normal file
113
oversampling/WDL/win32_hidpi.h
Normal file
@@ -0,0 +1,113 @@
|
||||
#include "wdltypes.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
#ifndef SWP__NOMOVETHENSIZE
|
||||
#define SWP__NOMOVETHENSIZE (1<<30)
|
||||
#endif
|
||||
|
||||
#ifdef WDL_WIN32_HIDPI_IMPL
|
||||
#ifndef _WDL_WIN32_HIDPI_H_IMPL
|
||||
#define _WDL_WIN32_HIDPI_H_IMPL
|
||||
|
||||
WDL_WIN32_HIDPI_IMPL void *_WDL_dpi_func(void *p)
|
||||
{
|
||||
static void *(WINAPI *__SetThreadDpiAwarenessContext)(void *);
|
||||
if (!__SetThreadDpiAwarenessContext)
|
||||
{
|
||||
HINSTANCE huser32 = LoadLibrary("user32.dll");
|
||||
if (huser32) *(void **)&__SetThreadDpiAwarenessContext = GetProcAddress(huser32,"SetThreadDpiAwarenessContext");
|
||||
if (!__SetThreadDpiAwarenessContext) *(UINT_PTR *)&__SetThreadDpiAwarenessContext = 1;
|
||||
}
|
||||
return (UINT_PTR)__SetThreadDpiAwarenessContext > 1 ? __SetThreadDpiAwarenessContext(p) : NULL;
|
||||
}
|
||||
|
||||
WDL_WIN32_HIDPI_IMPL void WDL_mmSetWindowPos(HWND hwnd, HWND hwndAfter, int x, int y, int w, int h, UINT f)
|
||||
{
|
||||
#ifdef SetWindowPos
|
||||
#undef SetWindowPos
|
||||
#endif
|
||||
static char init;
|
||||
|
||||
if (!init)
|
||||
{
|
||||
init = 1;
|
||||
HINSTANCE h = GetModuleHandle("user32.dll");
|
||||
if (h)
|
||||
{
|
||||
BOOL (WINAPI *__AreDpiAwarenessContextsEqual)(void *, void *);
|
||||
void * (WINAPI *__GetThreadDpiAwarenessContext )();
|
||||
*(void **)&__GetThreadDpiAwarenessContext = GetProcAddress(h,"GetThreadDpiAwarenessContext");
|
||||
*(void **)&__AreDpiAwarenessContextsEqual = GetProcAddress(h,"AreDpiAwarenessContextsEqual");
|
||||
if (__GetThreadDpiAwarenessContext && __AreDpiAwarenessContextsEqual)
|
||||
{
|
||||
if (__AreDpiAwarenessContextsEqual(__GetThreadDpiAwarenessContext(),(void*)(INT_PTR)-4))
|
||||
init = 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (WDL_NOT_NORMALLY(hwnd == NULL)) return;
|
||||
|
||||
if (init == 2 &&
|
||||
!(f&(SWP_NOMOVE|SWP_NOSIZE|SWP__NOMOVETHENSIZE|SWP_ASYNCWINDOWPOS)) &&
|
||||
!(GetWindowLong(hwnd,GWL_STYLE)&WS_CHILD))
|
||||
{
|
||||
SetWindowPos(hwnd,NULL,x,y,0,0,SWP_NOREDRAW|SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_DEFERERASE);
|
||||
f |= SWP_NOMOVE;
|
||||
}
|
||||
SetWindowPos(hwnd,hwndAfter,x,y,w,h,f&~SWP__NOMOVETHENSIZE);
|
||||
#define SetWindowPos WDL_mmSetWindowPos
|
||||
}
|
||||
|
||||
|
||||
#endif // end of _WDL_WIN32_HIDPI_H_IMPL
|
||||
#else // if !WDL_WIN32_HIDPI_IMPL
|
||||
void WDL_mmSetWindowPos(HWND hwnd, HWND hwndAfter, int x, int y, int w, int h, UINT f);
|
||||
void *_WDL_dpi_func(void *p);
|
||||
#ifdef SetWindowPos
|
||||
#undef SetWindowPos
|
||||
#endif
|
||||
#define SetWindowPos WDL_mmSetWindowPos
|
||||
#endif
|
||||
|
||||
#else // !_WIN32
|
||||
#ifndef SWP__NOMOVETHENSIZE
|
||||
#define SWP__NOMOVETHENSIZE 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef _WDL_WIN32_HIDPI_H_
|
||||
#define _WDL_WIN32_HIDPI_H_
|
||||
|
||||
static WDL_STATICFUNC_UNUSED void *WDL_dpi_enter_aware(int mode) // -1 = DPI_AWARENESS_CONTEXT_UNAWARE, -2=aware, -3=mm aware, -4=mmaware2, -5=gdiscaled
|
||||
{
|
||||
#ifdef _WIN32
|
||||
return _WDL_dpi_func((void *)(INT_PTR)mode);
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
static WDL_STATICFUNC_UNUSED void WDL_dpi_leave_aware(void **p)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
if (p)
|
||||
{
|
||||
if (*p) _WDL_dpi_func(*p);
|
||||
*p = NULL;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
struct WDL_dpi_aware_scope {
|
||||
#ifdef _WIN32
|
||||
WDL_dpi_aware_scope(int mode=-1) { c = mode ? WDL_dpi_enter_aware(mode) : NULL; }
|
||||
~WDL_dpi_aware_scope() { if (c) WDL_dpi_leave_aware(&c); }
|
||||
void *c;
|
||||
#else
|
||||
WDL_dpi_aware_scope() { }
|
||||
#endif
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user