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>
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.
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:
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.
20 // 2. Altered source versions must be plainly marked as such, and must not
21 // be misrepresented as being the original software.
23 // 3. This notice may not be removed or altered from any source
26 //========================================================================
28 // We don't need all the fancy stuff
37 #ifndef WIN32_LEAN_AND_MEAN
38 #define WIN32_LEAN_AND_MEAN
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
46 // GLFW on Windows is Unicode only and does not work in MBCS mode
51 // GLFW requires Windows XP or later
56 #if _WIN32_WINNT < 0x0501
58 #define _WIN32_WINNT 0x0501
61 // GLFW uses DirectInput8 interfaces
62 #define DIRECTINPUT_VERSION 0x0800
64 // GLFW uses OEM cursor resources
73 // HACK: Define macros that some windows.h variants don't
74 #ifndef WM_MOUSEHWHEEL
75 #define WM_MOUSEHWHEEL 0x020E
77 #ifndef WM_DWMCOMPOSITIONCHANGED
78 #define WM_DWMCOMPOSITIONCHANGED 0x031E
80 #ifndef WM_DWMCOLORIZATIONCOLORCHANGED
81 #define WM_DWMCOLORIZATIONCOLORCHANGED 0x0320
83 #ifndef WM_COPYGLOBALDATA
84 #define WM_COPYGLOBALDATA 0x0049
87 #define WM_UNICHAR 0x0109
89 #ifndef UNICODE_NOCHAR
90 #define UNICODE_NOCHAR 0xFFFF
93 #define WM_DPICHANGED 0x02E0
95 #ifndef GET_XBUTTON_WPARAM
96 #define GET_XBUTTON_WPARAM(w) (HIWORD(w))
98 #ifndef EDS_ROTATEDMODE
99 #define EDS_ROTATEDMODE 0x00000004
101 #ifndef DISPLAY_DEVICE_ACTIVE
102 #define DISPLAY_DEVICE_ACTIVE 0x00000001
104 #ifndef _WIN32_WINNT_WINBLUE
105 #define _WIN32_WINNT_WINBLUE 0x0603
107 #ifndef _WIN32_WINNT_WIN8
108 #define _WIN32_WINNT_WIN8 0x0602
110 #ifndef WM_GETDPISCALEDSIZE
111 #define WM_GETDPISCALEDSIZE 0x02e4
113 #ifndef USER_DEFAULT_SCREEN_DPI
114 #define USER_DEFAULT_SCREEN_DPI 96
117 #define OCR_HAND 32649
125 } CHANGEFILTERSTRUCT;
127 #define MSGFLT_ALLOW 1
132 #define DWM_BB_ENABLE 0x00000001
133 #define DWM_BB_BLURREGION 0x00000002
139 BOOL fTransitionOnMaximized;
143 #endif /*Windows Vista*/
145 #ifndef DPI_ENUMS_DECLARED
148 PROCESS_DPI_UNAWARE = 0,
149 PROCESS_SYSTEM_DPI_AWARE = 1,
150 PROCESS_PER_MONITOR_DPI_AWARE = 2
151 } PROCESS_DPI_AWARENESS;
154 MDT_EFFECTIVE_DPI = 0,
157 MDT_DEFAULT = MDT_EFFECTIVE_DPI
159 #endif /*DPI_ENUMS_DECLARED*/
161 #ifndef DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2
162 #define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ((HANDLE) -4)
163 #endif /*DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2*/
165 // HACK: Define versionhelpers.h functions manually as MinGW lacks the header
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)
179 #define _glfwIsWindows10AnniversaryUpdateOrGreaterWin32() \
180 _glfwIsWindows10BuildOrGreaterWin32(14393)
181 #define _glfwIsWindows10CreatorsUpdateOrGreaterWin32() \
182 _glfwIsWindows10BuildOrGreaterWin32(15063)
184 // HACK: Define macros that some xinput.h variants don't
185 #ifndef XINPUT_CAPS_WIRELESS
186 #define XINPUT_CAPS_WIRELESS 0x0002
188 #ifndef XINPUT_DEVSUBTYPE_WHEEL
189 #define XINPUT_DEVSUBTYPE_WHEEL 0x02
191 #ifndef XINPUT_DEVSUBTYPE_ARCADE_STICK
192 #define XINPUT_DEVSUBTYPE_ARCADE_STICK 0x03
194 #ifndef XINPUT_DEVSUBTYPE_FLIGHT_STICK
195 #define XINPUT_DEVSUBTYPE_FLIGHT_STICK 0x04
197 #ifndef XINPUT_DEVSUBTYPE_DANCE_PAD
198 #define XINPUT_DEVSUBTYPE_DANCE_PAD 0x05
200 #ifndef XINPUT_DEVSUBTYPE_GUITAR
201 #define XINPUT_DEVSUBTYPE_GUITAR 0x06
203 #ifndef XINPUT_DEVSUBTYPE_DRUM_KIT
204 #define XINPUT_DEVSUBTYPE_DRUM_KIT 0x08
206 #ifndef XINPUT_DEVSUBTYPE_ARCADE_PAD
207 #define XINPUT_DEVSUBTYPE_ARCADE_PAD 0x13
209 #ifndef XUSER_MAX_COUNT
210 #define XUSER_MAX_COUNT 4
213 // HACK: Define macros that some dinput.h variants don't
214 #ifndef DIDFT_OPTIONAL
215 #define DIDFT_OPTIONAL 0x80000000
218 // winmm.dll function pointer typedefs
219 typedef DWORD (WINAPI * PFN_timeGetTime)(void);
220 #define timeGetTime _glfw.win32.winmm.GetTime
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
228 // dinput8.dll function pointer typedefs
229 typedef HRESULT (WINAPI * PFN_DirectInput8Create)(HINSTANCE,DWORD,REFIID,LPVOID*,LPUNKNOWN);
230 #define DirectInput8Create _glfw.win32.dinput8.Create
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_
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 typedef HRESULT (WINAPI * PFN_DwmGetColorizationColor)(DWORD*,BOOL*);
251 #define DwmIsCompositionEnabled _glfw.win32.dwmapi.IsCompositionEnabled
252 #define DwmFlush _glfw.win32.dwmapi.Flush
253 #define DwmEnableBlurBehindWindow _glfw.win32.dwmapi.EnableBlurBehindWindow
254 #define DwmGetColorizationColor _glfw.win32.dwmapi.GetColorizationColor
256 // shcore.dll function pointer typedefs
257 typedef HRESULT (WINAPI * PFN_SetProcessDpiAwareness)(PROCESS_DPI_AWARENESS);
258 typedef HRESULT (WINAPI * PFN_GetDpiForMonitor)(HMONITOR,MONITOR_DPI_TYPE,UINT*,UINT*);
259 #define SetProcessDpiAwareness _glfw.win32.shcore.SetProcessDpiAwareness_
260 #define GetDpiForMonitor _glfw.win32.shcore.GetDpiForMonitor_
262 // ntdll.dll function pointer typedefs
263 typedef LONG (WINAPI * PFN_RtlVerifyVersionInfo)(OSVERSIONINFOEXW*,ULONG,ULONGLONG);
264 #define RtlVerifyVersionInfo _glfw.win32.ntdll.RtlVerifyVersionInfo_
266 typedef VkFlags VkWin32SurfaceCreateFlagsKHR;
268 typedef struct VkWin32SurfaceCreateInfoKHR
270 VkStructureType sType;
272 VkWin32SurfaceCreateFlagsKHR flags;
275 } VkWin32SurfaceCreateInfoKHR;
277 typedef VkResult (APIENTRY *PFN_vkCreateWin32SurfaceKHR)(VkInstance,const VkWin32SurfaceCreateInfoKHR*,const VkAllocationCallbacks*,VkSurfaceKHR*);
278 typedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)(VkPhysicalDevice,uint32_t);
280 #include "win32_joystick.h"
281 #include "wgl_context.h"
283 #if !defined(_GLFW_WNDCLASSNAME)
284 #define _GLFW_WNDCLASSNAME L"GLFW30"
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)
291 #define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowWin32 win32
292 #define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryWin32 win32
293 #define _GLFW_PLATFORM_LIBRARY_TIMER_STATE _GLFWtimerWin32 win32
294 #define _GLFW_PLATFORM_MONITOR_STATE _GLFWmonitorWin32 win32
295 #define _GLFW_PLATFORM_CURSOR_STATE _GLFWcursorWin32 win32
296 #define _GLFW_PLATFORM_TLS_STATE _GLFWtlsWin32 win32
297 #define _GLFW_PLATFORM_MUTEX_STATE _GLFWmutexWin32 win32
300 // Win32-specific per-window data
302 typedef struct _GLFWwindowWin32
308 GLFWbool cursorTracked;
309 GLFWbool frameAction;
312 // Whether to enable framebuffer transparency on DWM
313 GLFWbool transparent;
314 GLFWbool scaleToMonitor;
317 // The last received cursor position, regardless of source
318 int lastCursorPosX, lastCursorPosY;
319 // The last recevied high surrogate when decoding pairs of UTF-16 messages
324 // Win32-specific global data
326 typedef struct _GLFWlibraryWin32
328 HWND helperWindowHandle;
329 HDEVNOTIFY deviceNotificationHandle;
330 DWORD foregroundLockTimeout;
331 int acquiredMonitorCount;
332 char* clipboardString;
333 short int keycodes[512];
334 short int scancodes[GLFW_KEY_LAST + 1];
335 char keynames[GLFW_KEY_LAST + 1][5];
336 // Where to place the cursor when re-enabled
337 double restoreCursorPosX, restoreCursorPosY;
338 // The window whose disabled cursor mode is active
339 _GLFWwindow* disabledCursorWindow;
346 PFN_timeGetTime GetTime;
351 PFN_DirectInput8Create Create;
357 PFN_XInputGetCapabilities GetCapabilities;
358 PFN_XInputGetState GetState;
363 PFN_SetProcessDPIAware SetProcessDPIAware_;
364 PFN_ChangeWindowMessageFilterEx ChangeWindowMessageFilterEx_;
365 PFN_EnableNonClientDpiScaling EnableNonClientDpiScaling_;
366 PFN_SetProcessDpiAwarenessContext SetProcessDpiAwarenessContext_;
367 PFN_GetDpiForWindow GetDpiForWindow_;
368 PFN_AdjustWindowRectExForDpi AdjustWindowRectExForDpi_;
373 PFN_DwmIsCompositionEnabled IsCompositionEnabled;
375 PFN_DwmEnableBlurBehindWindow EnableBlurBehindWindow;
376 PFN_DwmGetColorizationColor GetColorizationColor;
381 PFN_SetProcessDpiAwareness SetProcessDpiAwareness_;
382 PFN_GetDpiForMonitor GetDpiForMonitor_;
387 PFN_RtlVerifyVersionInfo RtlVerifyVersionInfo_;
392 // Win32-specific per-monitor data
394 typedef struct _GLFWmonitorWin32
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;
407 // Win32-specific per-cursor data
409 typedef struct _GLFWcursorWin32
415 // Win32-specific global timer data
417 typedef struct _GLFWtimerWin32
424 // Win32-specific thread local storage data
426 typedef struct _GLFWtlsWin32
433 // Win32-specific mutex data
435 typedef struct _GLFWmutexWin32
438 CRITICAL_SECTION section;
443 GLFWbool _glfwRegisterWindowClassWin32(void);
444 void _glfwUnregisterWindowClassWin32(void);
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);
453 void _glfwInitTimerWin32(void);
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);