win32_platform.h (15266B)
1 //======================================================================== 2 // GLFW 3.4 Win32 - www.glfw.org 3 //------------------------------------------------------------------------ 4 // Copyright (c) 2002-2006 Marcus Geelnard 5 // Copyright (c) 2006-2019 Camilla Löwy <elmindreda@glfw.org> 6 // 7 // This software is provided 'as-is', without any express or implied 8 // warranty. In no event will the authors be held liable for any damages 9 // arising from the use of this software. 10 // 11 // Permission is granted to anyone to use this software for any purpose, 12 // including commercial applications, and to alter it and redistribute it 13 // freely, subject to the following restrictions: 14 // 15 // 1. The origin of this software must not be misrepresented; you must not 16 // claim that you wrote the original software. If you use this software 17 // in a product, an acknowledgment in the product documentation would 18 // be appreciated but is not required. 19 // 20 // 2. Altered source versions must be plainly marked as such, and must not 21 // be misrepresented as being the original software. 22 // 23 // 3. This notice may not be removed or altered from any source 24 // distribution. 25 // 26 //======================================================================== 27 28 // We don't need all the fancy stuff 29 #ifndef NOMINMAX 30 #define NOMINMAX 31 #endif 32 33 #ifndef VC_EXTRALEAN 34 #define VC_EXTRALEAN 35 #endif 36 37 #ifndef WIN32_LEAN_AND_MEAN 38 #define WIN32_LEAN_AND_MEAN 39 #endif 40 41 // This is a workaround for the fact that glfw3.h needs to export APIENTRY (for 42 // example to allow applications to correctly declare a GL_ARB_debug_output 43 // callback) but windows.h assumes no one will define APIENTRY before it does 44 // #undef APIENTRY 45 46 // GLFW on Windows is Unicode only and does not work in MBCS mode 47 #ifndef UNICODE 48 #define UNICODE 49 #endif 50 51 // GLFW requires Windows XP or later 52 #if WINVER < 0x0501 53 #undef WINVER 54 #define WINVER 0x0501 55 #endif 56 #if _WIN32_WINNT < 0x0501 57 #undef _WIN32_WINNT 58 #define _WIN32_WINNT 0x0501 59 #endif 60 61 // GLFW uses DirectInput8 interfaces 62 #define DIRECTINPUT_VERSION 0x0800 63 64 // GLFW uses OEM cursor resources 65 #define OEMRESOURCE 66 67 #include <wctype.h> 68 #include <windows.h> 69 #include <dinput.h> 70 #include <xinput.h> 71 #include <dbt.h> 72 73 // HACK: Define macros that some windows.h variants don't 74 #ifndef WM_MOUSEHWHEEL 75 #define WM_MOUSEHWHEEL 0x020E 76 #endif 77 #ifndef WM_DWMCOMPOSITIONCHANGED 78 #define WM_DWMCOMPOSITIONCHANGED 0x031E 79 #endif 80 #ifndef WM_COPYGLOBALDATA 81 #define WM_COPYGLOBALDATA 0x0049 82 #endif 83 #ifndef WM_UNICHAR 84 #define WM_UNICHAR 0x0109 85 #endif 86 #ifndef UNICODE_NOCHAR 87 #define UNICODE_NOCHAR 0xFFFF 88 #endif 89 #ifndef WM_DPICHANGED 90 #define WM_DPICHANGED 0x02E0 91 #endif 92 #ifndef GET_XBUTTON_WPARAM 93 #define GET_XBUTTON_WPARAM(w) (HIWORD(w)) 94 #endif 95 #ifndef EDS_ROTATEDMODE 96 #define EDS_ROTATEDMODE 0x00000004 97 #endif 98 #ifndef DISPLAY_DEVICE_ACTIVE 99 #define DISPLAY_DEVICE_ACTIVE 0x00000001 100 #endif 101 #ifndef _WIN32_WINNT_WINBLUE 102 #define _WIN32_WINNT_WINBLUE 0x0602 103 #endif 104 #ifndef _WIN32_WINNT_WIN8 105 #define _WIN32_WINNT_WIN8 0x0602 106 #endif 107 #ifndef WM_GETDPISCALEDSIZE 108 #define WM_GETDPISCALEDSIZE 0x02e4 109 #endif 110 #ifndef USER_DEFAULT_SCREEN_DPI 111 #define USER_DEFAULT_SCREEN_DPI 96 112 #endif 113 #ifndef OCR_HAND 114 #define OCR_HAND 32649 115 #endif 116 117 #if WINVER < 0x0601 118 typedef struct 119 { 120 DWORD cbSize; 121 DWORD ExtStatus; 122 } CHANGEFILTERSTRUCT; 123 #ifndef MSGFLT_ALLOW 124 #define MSGFLT_ALLOW 1 125 #endif 126 #endif /*Windows 7*/ 127 128 #if WINVER < 0x0600 129 #define DWM_BB_ENABLE 0x00000001 130 #define DWM_BB_BLURREGION 0x00000002 131 typedef struct 132 { 133 DWORD dwFlags; 134 BOOL fEnable; 135 HRGN hRgnBlur; 136 BOOL fTransitionOnMaximized; 137 } DWM_BLURBEHIND; 138 #else 139 #include <dwmapi.h> 140 #endif /*Windows Vista*/ 141 142 #ifndef DPI_ENUMS_DECLARED 143 typedef enum 144 { 145 PROCESS_DPI_UNAWARE = 0, 146 PROCESS_SYSTEM_DPI_AWARE = 1, 147 PROCESS_PER_MONITOR_DPI_AWARE = 2 148 } PROCESS_DPI_AWARENESS; 149 typedef enum 150 { 151 MDT_EFFECTIVE_DPI = 0, 152 MDT_ANGULAR_DPI = 1, 153 MDT_RAW_DPI = 2, 154 MDT_DEFAULT = MDT_EFFECTIVE_DPI 155 } MONITOR_DPI_TYPE; 156 #endif /*DPI_ENUMS_DECLARED*/ 157 158 #ifndef DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 159 #define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ((HANDLE) -4) 160 #endif /*DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2*/ 161 162 // HACK: Define versionhelpers.h functions manually as MinGW lacks the header 163 #define IsWindowsXPOrGreater() \ 164 _glfwIsWindowsVersionOrGreaterWin32(HIBYTE(_WIN32_WINNT_WINXP), \ 165 LOBYTE(_WIN32_WINNT_WINXP), 0) 166 #define IsWindowsVistaOrGreater() \ 167 _glfwIsWindowsVersionOrGreaterWin32(HIBYTE(_WIN32_WINNT_VISTA), \ 168 LOBYTE(_WIN32_WINNT_VISTA), 0) 169 #define IsWindows7OrGreater() \ 170 _glfwIsWindowsVersionOrGreaterWin32(HIBYTE(_WIN32_WINNT_WIN7), \ 171 LOBYTE(_WIN32_WINNT_WIN7), 0) 172 #define IsWindows8OrGreater() \ 173 _glfwIsWindowsVersionOrGreaterWin32(HIBYTE(_WIN32_WINNT_WIN8), \ 174 LOBYTE(_WIN32_WINNT_WIN8), 0) 175 #define IsWindows8Point1OrGreater() \ 176 _glfwIsWindowsVersionOrGreaterWin32(HIBYTE(_WIN32_WINNT_WINBLUE), \ 177 LOBYTE(_WIN32_WINNT_WINBLUE), 0) 178 179 #define _glfwIsWindows10AnniversaryUpdateOrGreaterWin32() \ 180 _glfwIsWindows10BuildOrGreaterWin32(14393) 181 #define _glfwIsWindows10CreatorsUpdateOrGreaterWin32() \ 182 _glfwIsWindows10BuildOrGreaterWin32(15063) 183 184 // HACK: Define macros that some xinput.h variants don't 185 #ifndef XINPUT_CAPS_WIRELESS 186 #define XINPUT_CAPS_WIRELESS 0x0002 187 #endif 188 #ifndef XINPUT_DEVSUBTYPE_WHEEL 189 #define XINPUT_DEVSUBTYPE_WHEEL 0x02 190 #endif 191 #ifndef XINPUT_DEVSUBTYPE_ARCADE_STICK 192 #define XINPUT_DEVSUBTYPE_ARCADE_STICK 0x03 193 #endif 194 #ifndef XINPUT_DEVSUBTYPE_FLIGHT_STICK 195 #define XINPUT_DEVSUBTYPE_FLIGHT_STICK 0x04 196 #endif 197 #ifndef XINPUT_DEVSUBTYPE_DANCE_PAD 198 #define XINPUT_DEVSUBTYPE_DANCE_PAD 0x05 199 #endif 200 #ifndef XINPUT_DEVSUBTYPE_GUITAR 201 #define XINPUT_DEVSUBTYPE_GUITAR 0x06 202 #endif 203 #ifndef XINPUT_DEVSUBTYPE_DRUM_KIT 204 #define XINPUT_DEVSUBTYPE_DRUM_KIT 0x08 205 #endif 206 #ifndef XINPUT_DEVSUBTYPE_ARCADE_PAD 207 #define XINPUT_DEVSUBTYPE_ARCADE_PAD 0x13 208 #endif 209 #ifndef XUSER_MAX_COUNT 210 #define XUSER_MAX_COUNT 4 211 #endif 212 213 // HACK: Define macros that some dinput.h variants don't 214 #ifndef DIDFT_OPTIONAL 215 #define DIDFT_OPTIONAL 0x80000000 216 #endif 217 218 // winmm.dll function pointer typedefs 219 typedef DWORD (WINAPI * PFN_timeGetTime)(void); 220 #define timeGetTime _glfw.win32.winmm.GetTime 221 222 // xinput.dll function pointer typedefs 223 typedef DWORD (WINAPI * PFN_XInputGetCapabilities)(DWORD,DWORD,XINPUT_CAPABILITIES*); 224 typedef DWORD (WINAPI * PFN_XInputGetState)(DWORD,XINPUT_STATE*); 225 #define XInputGetCapabilities _glfw.win32.xinput.GetCapabilities 226 #define XInputGetState _glfw.win32.xinput.GetState 227 228 // dinput8.dll function pointer typedefs 229 typedef HRESULT (WINAPI * PFN_DirectInput8Create)(HINSTANCE,DWORD,REFIID,LPVOID*,LPUNKNOWN); 230 #define DirectInput8Create _glfw.win32.dinput8.Create 231 232 // user32.dll function pointer typedefs 233 typedef BOOL (WINAPI * PFN_SetProcessDPIAware)(void); 234 typedef BOOL (WINAPI * PFN_ChangeWindowMessageFilterEx)(HWND,UINT,DWORD,CHANGEFILTERSTRUCT*); 235 typedef BOOL (WINAPI * PFN_EnableNonClientDpiScaling)(HWND); 236 typedef BOOL (WINAPI * PFN_SetProcessDpiAwarenessContext)(HANDLE); 237 typedef UINT (WINAPI * PFN_GetDpiForWindow)(HWND); 238 typedef BOOL (WINAPI * PFN_AdjustWindowRectExForDpi)(LPRECT,DWORD,BOOL,DWORD,UINT); 239 #define SetProcessDPIAware _glfw.win32.user32.SetProcessDPIAware_ 240 #define ChangeWindowMessageFilterEx _glfw.win32.user32.ChangeWindowMessageFilterEx_ 241 #define EnableNonClientDpiScaling _glfw.win32.user32.EnableNonClientDpiScaling_ 242 #define SetProcessDpiAwarenessContext _glfw.win32.user32.SetProcessDpiAwarenessContext_ 243 #define GetDpiForWindow _glfw.win32.user32.GetDpiForWindow_ 244 #define AdjustWindowRectExForDpi _glfw.win32.user32.AdjustWindowRectExForDpi_ 245 246 // dwmapi.dll function pointer typedefs 247 typedef HRESULT (WINAPI * PFN_DwmIsCompositionEnabled)(BOOL*); 248 typedef HRESULT (WINAPI * PFN_DwmFlush)(VOID); 249 typedef HRESULT(WINAPI * PFN_DwmEnableBlurBehindWindow)(HWND,const DWM_BLURBEHIND*); 250 #define DwmIsCompositionEnabled _glfw.win32.dwmapi.IsCompositionEnabled 251 #define DwmFlush _glfw.win32.dwmapi.Flush 252 #define DwmEnableBlurBehindWindow _glfw.win32.dwmapi.EnableBlurBehindWindow 253 254 // shcore.dll function pointer typedefs 255 typedef HRESULT (WINAPI * PFN_SetProcessDpiAwareness)(PROCESS_DPI_AWARENESS); 256 typedef HRESULT (WINAPI * PFN_GetDpiForMonitor)(HMONITOR,MONITOR_DPI_TYPE,UINT*,UINT*); 257 #define SetProcessDpiAwareness _glfw.win32.shcore.SetProcessDpiAwareness_ 258 #define GetDpiForMonitor _glfw.win32.shcore.GetDpiForMonitor_ 259 260 // ntdll.dll function pointer typedefs 261 typedef LONG (WINAPI * PFN_RtlVerifyVersionInfo)(OSVERSIONINFOEXW*,ULONG,ULONGLONG); 262 #define RtlVerifyVersionInfo _glfw.win32.ntdll.RtlVerifyVersionInfo_ 263 264 typedef VkFlags VkWin32SurfaceCreateFlagsKHR; 265 266 typedef struct VkWin32SurfaceCreateInfoKHR 267 { 268 VkStructureType sType; 269 const void* pNext; 270 VkWin32SurfaceCreateFlagsKHR flags; 271 HINSTANCE hinstance; 272 HWND hwnd; 273 } VkWin32SurfaceCreateInfoKHR; 274 275 typedef VkResult (APIENTRY *PFN_vkCreateWin32SurfaceKHR)(VkInstance,const VkWin32SurfaceCreateInfoKHR*,const VkAllocationCallbacks*,VkSurfaceKHR*); 276 typedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)(VkPhysicalDevice,uint32_t); 277 278 #include "win32_joystick.h" 279 #include "wgl_context.h" 280 #include "egl_context.h" 281 #include "osmesa_context.h" 282 283 #if !defined(_GLFW_WNDCLASSNAME) 284 #define _GLFW_WNDCLASSNAME L"GLFW30" 285 #endif 286 287 #define _glfw_dlopen(name) LoadLibraryA(name) 288 #define _glfw_dlclose(handle) FreeLibrary((HMODULE) handle) 289 #define _glfw_dlsym(handle, name) GetProcAddress((HMODULE) handle, name) 290 291 #define _GLFW_EGL_NATIVE_WINDOW ((EGLNativeWindowType) window->win32.handle) 292 #define _GLFW_EGL_NATIVE_DISPLAY EGL_DEFAULT_DISPLAY 293 294 #define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowWin32 win32 295 #define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryWin32 win32 296 #define _GLFW_PLATFORM_LIBRARY_TIMER_STATE _GLFWtimerWin32 win32 297 #define _GLFW_PLATFORM_MONITOR_STATE _GLFWmonitorWin32 win32 298 #define _GLFW_PLATFORM_CURSOR_STATE _GLFWcursorWin32 win32 299 #define _GLFW_PLATFORM_TLS_STATE _GLFWtlsWin32 win32 300 #define _GLFW_PLATFORM_MUTEX_STATE _GLFWmutexWin32 win32 301 302 303 // Win32-specific per-window data 304 // 305 typedef struct _GLFWwindowWin32 306 { 307 HWND handle; 308 HICON bigIcon; 309 HICON smallIcon; 310 311 GLFWbool cursorTracked; 312 GLFWbool frameAction; 313 GLFWbool iconified; 314 GLFWbool maximized; 315 // Whether to enable framebuffer transparency on DWM 316 GLFWbool transparent; 317 GLFWbool scaleToMonitor; 318 GLFWbool keymenu; 319 320 // The last received cursor position, regardless of source 321 int lastCursorPosX, lastCursorPosY; 322 323 } _GLFWwindowWin32; 324 325 // Win32-specific global data 326 // 327 typedef struct _GLFWlibraryWin32 328 { 329 HWND helperWindowHandle; 330 HDEVNOTIFY deviceNotificationHandle; 331 DWORD foregroundLockTimeout; 332 int acquiredMonitorCount; 333 char* clipboardString; 334 short int keycodes[512]; 335 short int scancodes[GLFW_KEY_LAST + 1]; 336 char keynames[GLFW_KEY_LAST + 1][5]; 337 // Where to place the cursor when re-enabled 338 double restoreCursorPosX, restoreCursorPosY; 339 // The window whose disabled cursor mode is active 340 _GLFWwindow* disabledCursorWindow; 341 RAWINPUT* rawInput; 342 int rawInputSize; 343 UINT mouseTrailSize; 344 345 struct { 346 HINSTANCE instance; 347 PFN_timeGetTime GetTime; 348 } winmm; 349 350 struct { 351 HINSTANCE instance; 352 PFN_DirectInput8Create Create; 353 IDirectInput8W* api; 354 } dinput8; 355 356 struct { 357 HINSTANCE instance; 358 PFN_XInputGetCapabilities GetCapabilities; 359 PFN_XInputGetState GetState; 360 } xinput; 361 362 struct { 363 HINSTANCE instance; 364 PFN_SetProcessDPIAware SetProcessDPIAware_; 365 PFN_ChangeWindowMessageFilterEx ChangeWindowMessageFilterEx_; 366 PFN_EnableNonClientDpiScaling EnableNonClientDpiScaling_; 367 PFN_SetProcessDpiAwarenessContext SetProcessDpiAwarenessContext_; 368 PFN_GetDpiForWindow GetDpiForWindow_; 369 PFN_AdjustWindowRectExForDpi AdjustWindowRectExForDpi_; 370 } user32; 371 372 struct { 373 HINSTANCE instance; 374 PFN_DwmIsCompositionEnabled IsCompositionEnabled; 375 PFN_DwmFlush Flush; 376 PFN_DwmEnableBlurBehindWindow EnableBlurBehindWindow; 377 } dwmapi; 378 379 struct { 380 HINSTANCE instance; 381 PFN_SetProcessDpiAwareness SetProcessDpiAwareness_; 382 PFN_GetDpiForMonitor GetDpiForMonitor_; 383 } shcore; 384 385 struct { 386 HINSTANCE instance; 387 PFN_RtlVerifyVersionInfo RtlVerifyVersionInfo_; 388 } ntdll; 389 390 } _GLFWlibraryWin32; 391 392 // Win32-specific per-monitor data 393 // 394 typedef struct _GLFWmonitorWin32 395 { 396 HMONITOR handle; 397 // This size matches the static size of DISPLAY_DEVICE.DeviceName 398 WCHAR adapterName[32]; 399 WCHAR displayName[32]; 400 char publicAdapterName[32]; 401 char publicDisplayName[32]; 402 GLFWbool modesPruned; 403 GLFWbool modeChanged; 404 405 } _GLFWmonitorWin32; 406 407 // Win32-specific per-cursor data 408 // 409 typedef struct _GLFWcursorWin32 410 { 411 HCURSOR handle; 412 413 } _GLFWcursorWin32; 414 415 // Win32-specific global timer data 416 // 417 typedef struct _GLFWtimerWin32 418 { 419 GLFWbool hasPC; 420 uint64_t frequency; 421 422 } _GLFWtimerWin32; 423 424 // Win32-specific thread local storage data 425 // 426 typedef struct _GLFWtlsWin32 427 { 428 GLFWbool allocated; 429 DWORD index; 430 431 } _GLFWtlsWin32; 432 433 // Win32-specific mutex data 434 // 435 typedef struct _GLFWmutexWin32 436 { 437 GLFWbool allocated; 438 CRITICAL_SECTION section; 439 440 } _GLFWmutexWin32; 441 442 443 GLFWbool _glfwRegisterWindowClassWin32(void); 444 void _glfwUnregisterWindowClassWin32(void); 445 446 WCHAR* _glfwCreateWideStringFromUTF8Win32(const char* source); 447 char* _glfwCreateUTF8FromWideStringWin32(const WCHAR* source); 448 BOOL _glfwIsWindowsVersionOrGreaterWin32(WORD major, WORD minor, WORD sp); 449 BOOL _glfwIsWindows10BuildOrGreaterWin32(WORD build); 450 void _glfwInputErrorWin32(int error, const char* description); 451 void _glfwUpdateKeyNamesWin32(void); 452 453 void _glfwInitTimerWin32(void); 454 455 void _glfwPollMonitorsWin32(void); 456 void _glfwSetVideoModeWin32(_GLFWmonitor* monitor, const GLFWvidmode* desired); 457 void _glfwRestoreVideoModeWin32(_GLFWmonitor* monitor); 458 void _glfwGetMonitorContentScaleWin32(HMONITOR handle, float* xscale, float* yscale); 459