xref: /third_party/glfw/src/win32_platform.h (revision b877906b)
1//========================================================================
2// GLFW 3.5 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_KHR_debug callback)
43// 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_DWMCOLORIZATIONCOLORCHANGED
81 #define WM_DWMCOLORIZATIONCOLORCHANGED 0x0320
82#endif
83#ifndef WM_COPYGLOBALDATA
84 #define WM_COPYGLOBALDATA 0x0049
85#endif
86#ifndef WM_UNICHAR
87 #define WM_UNICHAR 0x0109
88#endif
89#ifndef UNICODE_NOCHAR
90 #define UNICODE_NOCHAR 0xFFFF
91#endif
92#ifndef WM_DPICHANGED
93 #define WM_DPICHANGED 0x02E0
94#endif
95#ifndef GET_XBUTTON_WPARAM
96 #define GET_XBUTTON_WPARAM(w) (HIWORD(w))
97#endif
98#ifndef EDS_ROTATEDMODE
99 #define EDS_ROTATEDMODE 0x00000004
100#endif
101#ifndef DISPLAY_DEVICE_ACTIVE
102 #define DISPLAY_DEVICE_ACTIVE 0x00000001
103#endif
104#ifndef _WIN32_WINNT_WINBLUE
105 #define _WIN32_WINNT_WINBLUE 0x0603
106#endif
107#ifndef _WIN32_WINNT_WIN8
108 #define _WIN32_WINNT_WIN8 0x0602
109#endif
110#ifndef WM_GETDPISCALEDSIZE
111 #define WM_GETDPISCALEDSIZE 0x02e4
112#endif
113#ifndef USER_DEFAULT_SCREEN_DPI
114 #define USER_DEFAULT_SCREEN_DPI 96
115#endif
116#ifndef OCR_HAND
117 #define OCR_HAND 32649
118#endif
119
120#if WINVER < 0x0601
121typedef struct
122{
123    DWORD cbSize;
124    DWORD ExtStatus;
125} CHANGEFILTERSTRUCT;
126#ifndef MSGFLT_ALLOW
127 #define MSGFLT_ALLOW 1
128#endif
129#endif /*Windows 7*/
130
131#if WINVER < 0x0600
132#define DWM_BB_ENABLE 0x00000001
133#define DWM_BB_BLURREGION 0x00000002
134typedef struct
135{
136    DWORD dwFlags;
137    BOOL fEnable;
138    HRGN hRgnBlur;
139    BOOL fTransitionOnMaximized;
140} DWM_BLURBEHIND;
141#else
142 #include <dwmapi.h>
143#endif /*Windows Vista*/
144
145#ifndef DPI_ENUMS_DECLARED
146typedef enum
147{
148    PROCESS_DPI_UNAWARE = 0,
149    PROCESS_SYSTEM_DPI_AWARE = 1,
150    PROCESS_PER_MONITOR_DPI_AWARE = 2
151} PROCESS_DPI_AWARENESS;
152typedef enum
153{
154    MDT_EFFECTIVE_DPI = 0,
155    MDT_ANGULAR_DPI = 1,
156    MDT_RAW_DPI = 2,
157    MDT_DEFAULT = MDT_EFFECTIVE_DPI
158} MONITOR_DPI_TYPE;
159#endif /*DPI_ENUMS_DECLARED*/
160
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*/
164
165// Replacement for versionhelpers.h macros, as we cannot rely on the
166// application having a correct embedded manifest
167//
168#define IsWindowsVistaOrGreater()                                     \
169    _glfwIsWindowsVersionOrGreaterWin32(HIBYTE(_WIN32_WINNT_VISTA),   \
170                                        LOBYTE(_WIN32_WINNT_VISTA), 0)
171#define IsWindows7OrGreater()                                         \
172    _glfwIsWindowsVersionOrGreaterWin32(HIBYTE(_WIN32_WINNT_WIN7),    \
173                                        LOBYTE(_WIN32_WINNT_WIN7), 0)
174#define IsWindows8OrGreater()                                         \
175    _glfwIsWindowsVersionOrGreaterWin32(HIBYTE(_WIN32_WINNT_WIN8),    \
176                                        LOBYTE(_WIN32_WINNT_WIN8), 0)
177#define IsWindows8Point1OrGreater()                                   \
178    _glfwIsWindowsVersionOrGreaterWin32(HIBYTE(_WIN32_WINNT_WINBLUE), \
179                                        LOBYTE(_WIN32_WINNT_WINBLUE), 0)
180
181// Windows 10 Anniversary Update
182#define _glfwIsWindows10Version1607OrGreaterWin32() \
183    _glfwIsWindows10BuildOrGreaterWin32(14393)
184// Windows 10 Creators Update
185#define _glfwIsWindows10Version1703OrGreaterWin32() \
186    _glfwIsWindows10BuildOrGreaterWin32(15063)
187
188// HACK: Define macros that some xinput.h variants don't
189#ifndef XINPUT_CAPS_WIRELESS
190 #define XINPUT_CAPS_WIRELESS 0x0002
191#endif
192#ifndef XINPUT_DEVSUBTYPE_WHEEL
193 #define XINPUT_DEVSUBTYPE_WHEEL 0x02
194#endif
195#ifndef XINPUT_DEVSUBTYPE_ARCADE_STICK
196 #define XINPUT_DEVSUBTYPE_ARCADE_STICK 0x03
197#endif
198#ifndef XINPUT_DEVSUBTYPE_FLIGHT_STICK
199 #define XINPUT_DEVSUBTYPE_FLIGHT_STICK 0x04
200#endif
201#ifndef XINPUT_DEVSUBTYPE_DANCE_PAD
202 #define XINPUT_DEVSUBTYPE_DANCE_PAD 0x05
203#endif
204#ifndef XINPUT_DEVSUBTYPE_GUITAR
205 #define XINPUT_DEVSUBTYPE_GUITAR 0x06
206#endif
207#ifndef XINPUT_DEVSUBTYPE_DRUM_KIT
208 #define XINPUT_DEVSUBTYPE_DRUM_KIT 0x08
209#endif
210#ifndef XINPUT_DEVSUBTYPE_ARCADE_PAD
211 #define XINPUT_DEVSUBTYPE_ARCADE_PAD 0x13
212#endif
213#ifndef XUSER_MAX_COUNT
214 #define XUSER_MAX_COUNT 4
215#endif
216
217// HACK: Define macros that some dinput.h variants don't
218#ifndef DIDFT_OPTIONAL
219 #define DIDFT_OPTIONAL 0x80000000
220#endif
221
222#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000
223#define WGL_SUPPORT_OPENGL_ARB 0x2010
224#define WGL_DRAW_TO_WINDOW_ARB 0x2001
225#define WGL_PIXEL_TYPE_ARB 0x2013
226#define WGL_TYPE_RGBA_ARB 0x202b
227#define WGL_ACCELERATION_ARB 0x2003
228#define WGL_NO_ACCELERATION_ARB 0x2025
229#define WGL_RED_BITS_ARB 0x2015
230#define WGL_RED_SHIFT_ARB 0x2016
231#define WGL_GREEN_BITS_ARB 0x2017
232#define WGL_GREEN_SHIFT_ARB 0x2018
233#define WGL_BLUE_BITS_ARB 0x2019
234#define WGL_BLUE_SHIFT_ARB 0x201a
235#define WGL_ALPHA_BITS_ARB 0x201b
236#define WGL_ALPHA_SHIFT_ARB 0x201c
237#define WGL_ACCUM_BITS_ARB 0x201d
238#define WGL_ACCUM_RED_BITS_ARB 0x201e
239#define WGL_ACCUM_GREEN_BITS_ARB 0x201f
240#define WGL_ACCUM_BLUE_BITS_ARB 0x2020
241#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021
242#define WGL_DEPTH_BITS_ARB 0x2022
243#define WGL_STENCIL_BITS_ARB 0x2023
244#define WGL_AUX_BUFFERS_ARB 0x2024
245#define WGL_STEREO_ARB 0x2012
246#define WGL_DOUBLE_BUFFER_ARB 0x2011
247#define WGL_SAMPLES_ARB 0x2042
248#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20a9
249#define WGL_CONTEXT_DEBUG_BIT_ARB 0x00000001
250#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002
251#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126
252#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001
253#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
254#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091
255#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092
256#define WGL_CONTEXT_FLAGS_ARB 0x2094
257#define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004
258#define WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004
259#define WGL_LOSE_CONTEXT_ON_RESET_ARB 0x8252
260#define WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256
261#define WGL_NO_RESET_NOTIFICATION_ARB 0x8261
262#define WGL_CONTEXT_RELEASE_BEHAVIOR_ARB 0x2097
263#define WGL_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB 0
264#define WGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB 0x2098
265#define WGL_CONTEXT_OPENGL_NO_ERROR_ARB 0x31b3
266#define WGL_COLORSPACE_EXT 0x309d
267#define WGL_COLORSPACE_SRGB_EXT 0x3089
268
269#define ERROR_INVALID_VERSION_ARB 0x2095
270#define ERROR_INVALID_PROFILE_ARB 0x2096
271#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054
272
273// xinput.dll function pointer typedefs
274typedef DWORD (WINAPI * PFN_XInputGetCapabilities)(DWORD,DWORD,XINPUT_CAPABILITIES*);
275typedef DWORD (WINAPI * PFN_XInputGetState)(DWORD,XINPUT_STATE*);
276#define XInputGetCapabilities _glfw.win32.xinput.GetCapabilities
277#define XInputGetState _glfw.win32.xinput.GetState
278
279// dinput8.dll function pointer typedefs
280typedef HRESULT (WINAPI * PFN_DirectInput8Create)(HINSTANCE,DWORD,REFIID,LPVOID*,LPUNKNOWN);
281#define DirectInput8Create _glfw.win32.dinput8.Create
282
283// user32.dll function pointer typedefs
284typedef BOOL (WINAPI * PFN_SetProcessDPIAware)(void);
285typedef BOOL (WINAPI * PFN_ChangeWindowMessageFilterEx)(HWND,UINT,DWORD,CHANGEFILTERSTRUCT*);
286typedef BOOL (WINAPI * PFN_EnableNonClientDpiScaling)(HWND);
287typedef BOOL (WINAPI * PFN_SetProcessDpiAwarenessContext)(HANDLE);
288typedef UINT (WINAPI * PFN_GetDpiForWindow)(HWND);
289typedef BOOL (WINAPI * PFN_AdjustWindowRectExForDpi)(LPRECT,DWORD,BOOL,DWORD,UINT);
290typedef int (WINAPI * PFN_GetSystemMetricsForDpi)(int,UINT);
291#define SetProcessDPIAware _glfw.win32.user32.SetProcessDPIAware_
292#define ChangeWindowMessageFilterEx _glfw.win32.user32.ChangeWindowMessageFilterEx_
293#define EnableNonClientDpiScaling _glfw.win32.user32.EnableNonClientDpiScaling_
294#define SetProcessDpiAwarenessContext _glfw.win32.user32.SetProcessDpiAwarenessContext_
295#define GetDpiForWindow _glfw.win32.user32.GetDpiForWindow_
296#define AdjustWindowRectExForDpi _glfw.win32.user32.AdjustWindowRectExForDpi_
297#define GetSystemMetricsForDpi _glfw.win32.user32.GetSystemMetricsForDpi_
298
299// dwmapi.dll function pointer typedefs
300typedef HRESULT (WINAPI * PFN_DwmIsCompositionEnabled)(BOOL*);
301typedef HRESULT (WINAPI * PFN_DwmFlush)(VOID);
302typedef HRESULT(WINAPI * PFN_DwmEnableBlurBehindWindow)(HWND,const DWM_BLURBEHIND*);
303typedef HRESULT (WINAPI * PFN_DwmGetColorizationColor)(DWORD*,BOOL*);
304#define DwmIsCompositionEnabled _glfw.win32.dwmapi.IsCompositionEnabled
305#define DwmFlush _glfw.win32.dwmapi.Flush
306#define DwmEnableBlurBehindWindow _glfw.win32.dwmapi.EnableBlurBehindWindow
307#define DwmGetColorizationColor _glfw.win32.dwmapi.GetColorizationColor
308
309// shcore.dll function pointer typedefs
310typedef HRESULT (WINAPI * PFN_SetProcessDpiAwareness)(PROCESS_DPI_AWARENESS);
311typedef HRESULT (WINAPI * PFN_GetDpiForMonitor)(HMONITOR,MONITOR_DPI_TYPE,UINT*,UINT*);
312#define SetProcessDpiAwareness _glfw.win32.shcore.SetProcessDpiAwareness_
313#define GetDpiForMonitor _glfw.win32.shcore.GetDpiForMonitor_
314
315// ntdll.dll function pointer typedefs
316typedef LONG (WINAPI * PFN_RtlVerifyVersionInfo)(OSVERSIONINFOEXW*,ULONG,ULONGLONG);
317#define RtlVerifyVersionInfo _glfw.win32.ntdll.RtlVerifyVersionInfo_
318
319// WGL extension pointer typedefs
320typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC)(int);
321typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC)(HDC,int,int,UINT,const int*,int*);
322typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC)(void);
323typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC)(HDC);
324typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC)(HDC,HGLRC,const int*);
325#define wglSwapIntervalEXT _glfw.wgl.SwapIntervalEXT
326#define wglGetPixelFormatAttribivARB _glfw.wgl.GetPixelFormatAttribivARB
327#define wglGetExtensionsStringEXT _glfw.wgl.GetExtensionsStringEXT
328#define wglGetExtensionsStringARB _glfw.wgl.GetExtensionsStringARB
329#define wglCreateContextAttribsARB _glfw.wgl.CreateContextAttribsARB
330
331// opengl32.dll function pointer typedefs
332typedef HGLRC (WINAPI * PFN_wglCreateContext)(HDC);
333typedef BOOL (WINAPI * PFN_wglDeleteContext)(HGLRC);
334typedef PROC (WINAPI * PFN_wglGetProcAddress)(LPCSTR);
335typedef HDC (WINAPI * PFN_wglGetCurrentDC)(void);
336typedef HGLRC (WINAPI * PFN_wglGetCurrentContext)(void);
337typedef BOOL (WINAPI * PFN_wglMakeCurrent)(HDC,HGLRC);
338typedef BOOL (WINAPI * PFN_wglShareLists)(HGLRC,HGLRC);
339#define wglCreateContext _glfw.wgl.CreateContext
340#define wglDeleteContext _glfw.wgl.DeleteContext
341#define wglGetProcAddress _glfw.wgl.GetProcAddress
342#define wglGetCurrentDC _glfw.wgl.GetCurrentDC
343#define wglGetCurrentContext _glfw.wgl.GetCurrentContext
344#define wglMakeCurrent _glfw.wgl.MakeCurrent
345#define wglShareLists _glfw.wgl.ShareLists
346
347typedef VkFlags VkWin32SurfaceCreateFlagsKHR;
348
349typedef struct VkWin32SurfaceCreateInfoKHR
350{
351    VkStructureType                 sType;
352    const void*                     pNext;
353    VkWin32SurfaceCreateFlagsKHR    flags;
354    HINSTANCE                       hinstance;
355    HWND                            hwnd;
356} VkWin32SurfaceCreateInfoKHR;
357
358typedef VkResult (APIENTRY *PFN_vkCreateWin32SurfaceKHR)(VkInstance,const VkWin32SurfaceCreateInfoKHR*,const VkAllocationCallbacks*,VkSurfaceKHR*);
359typedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)(VkPhysicalDevice,uint32_t);
360
361#define GLFW_WIN32_WINDOW_STATE         _GLFWwindowWin32  win32;
362#define GLFW_WIN32_LIBRARY_WINDOW_STATE _GLFWlibraryWin32 win32;
363#define GLFW_WIN32_MONITOR_STATE        _GLFWmonitorWin32 win32;
364#define GLFW_WIN32_CURSOR_STATE         _GLFWcursorWin32  win32;
365
366#define GLFW_WGL_CONTEXT_STATE          _GLFWcontextWGL wgl;
367#define GLFW_WGL_LIBRARY_CONTEXT_STATE  _GLFWlibraryWGL wgl;
368
369
370// WGL-specific per-context data
371//
372typedef struct _GLFWcontextWGL
373{
374    HDC       dc;
375    HGLRC     handle;
376    int       interval;
377} _GLFWcontextWGL;
378
379// WGL-specific global data
380//
381typedef struct _GLFWlibraryWGL
382{
383    HINSTANCE                           instance;
384    PFN_wglCreateContext                CreateContext;
385    PFN_wglDeleteContext                DeleteContext;
386    PFN_wglGetProcAddress               GetProcAddress;
387    PFN_wglGetCurrentDC                 GetCurrentDC;
388    PFN_wglGetCurrentContext            GetCurrentContext;
389    PFN_wglMakeCurrent                  MakeCurrent;
390    PFN_wglShareLists                   ShareLists;
391
392    PFNWGLSWAPINTERVALEXTPROC           SwapIntervalEXT;
393    PFNWGLGETPIXELFORMATATTRIBIVARBPROC GetPixelFormatAttribivARB;
394    PFNWGLGETEXTENSIONSSTRINGEXTPROC    GetExtensionsStringEXT;
395    PFNWGLGETEXTENSIONSSTRINGARBPROC    GetExtensionsStringARB;
396    PFNWGLCREATECONTEXTATTRIBSARBPROC   CreateContextAttribsARB;
397    GLFWbool                            EXT_swap_control;
398    GLFWbool                            EXT_colorspace;
399    GLFWbool                            ARB_multisample;
400    GLFWbool                            ARB_framebuffer_sRGB;
401    GLFWbool                            EXT_framebuffer_sRGB;
402    GLFWbool                            ARB_pixel_format;
403    GLFWbool                            ARB_create_context;
404    GLFWbool                            ARB_create_context_profile;
405    GLFWbool                            EXT_create_context_es2_profile;
406    GLFWbool                            ARB_create_context_robustness;
407    GLFWbool                            ARB_create_context_no_error;
408    GLFWbool                            ARB_context_flush_control;
409} _GLFWlibraryWGL;
410
411// Win32-specific per-window data
412//
413typedef struct _GLFWwindowWin32
414{
415    HWND                handle;
416    HICON               bigIcon;
417    HICON               smallIcon;
418
419    GLFWbool            cursorTracked;
420    GLFWbool            frameAction;
421    GLFWbool            iconified;
422    GLFWbool            maximized;
423    // Whether to enable framebuffer transparency on DWM
424    GLFWbool            transparent;
425    GLFWbool            scaleToMonitor;
426    GLFWbool            keymenu;
427    GLFWbool            showDefault;
428
429    // Cached size used to filter out duplicate events
430    int                 width, height;
431
432    // The last received cursor position, regardless of source
433    int                 lastCursorPosX, lastCursorPosY;
434    // The last received high surrogate when decoding pairs of UTF-16 messages
435    WCHAR               highSurrogate;
436} _GLFWwindowWin32;
437
438// Win32-specific global data
439//
440typedef struct _GLFWlibraryWin32
441{
442    HINSTANCE           instance;
443    HWND                helperWindowHandle;
444    ATOM                helperWindowClass;
445    ATOM                mainWindowClass;
446    HDEVNOTIFY          deviceNotificationHandle;
447    int                 acquiredMonitorCount;
448    char*               clipboardString;
449    short int           keycodes[512];
450    short int           scancodes[GLFW_KEY_LAST + 1];
451    char                keynames[GLFW_KEY_LAST + 1][5];
452    // Where to place the cursor when re-enabled
453    double              restoreCursorPosX, restoreCursorPosY;
454    // The window whose disabled cursor mode is active
455    _GLFWwindow*        disabledCursorWindow;
456    // The window the cursor is captured in
457    _GLFWwindow*        capturedCursorWindow;
458    RAWINPUT*           rawInput;
459    int                 rawInputSize;
460    UINT                mouseTrailSize;
461    // The cursor handle to use to hide the cursor (NULL or a transparent cursor)
462    HCURSOR             blankCursor;
463
464    struct {
465        HINSTANCE                       instance;
466        PFN_DirectInput8Create          Create;
467        IDirectInput8W*                 api;
468    } dinput8;
469
470    struct {
471        HINSTANCE                       instance;
472        PFN_XInputGetCapabilities       GetCapabilities;
473        PFN_XInputGetState              GetState;
474    } xinput;
475
476    struct {
477        HINSTANCE                       instance;
478        PFN_SetProcessDPIAware          SetProcessDPIAware_;
479        PFN_ChangeWindowMessageFilterEx ChangeWindowMessageFilterEx_;
480        PFN_EnableNonClientDpiScaling   EnableNonClientDpiScaling_;
481        PFN_SetProcessDpiAwarenessContext SetProcessDpiAwarenessContext_;
482        PFN_GetDpiForWindow             GetDpiForWindow_;
483        PFN_AdjustWindowRectExForDpi    AdjustWindowRectExForDpi_;
484        PFN_GetSystemMetricsForDpi      GetSystemMetricsForDpi_;
485    } user32;
486
487    struct {
488        HINSTANCE                       instance;
489        PFN_DwmIsCompositionEnabled     IsCompositionEnabled;
490        PFN_DwmFlush                    Flush;
491        PFN_DwmEnableBlurBehindWindow   EnableBlurBehindWindow;
492        PFN_DwmGetColorizationColor     GetColorizationColor;
493    } dwmapi;
494
495    struct {
496        HINSTANCE                       instance;
497        PFN_SetProcessDpiAwareness      SetProcessDpiAwareness_;
498        PFN_GetDpiForMonitor            GetDpiForMonitor_;
499    } shcore;
500
501    struct {
502        HINSTANCE                       instance;
503        PFN_RtlVerifyVersionInfo        RtlVerifyVersionInfo_;
504    } ntdll;
505} _GLFWlibraryWin32;
506
507// Win32-specific per-monitor data
508//
509typedef struct _GLFWmonitorWin32
510{
511    HMONITOR            handle;
512    // This size matches the static size of DISPLAY_DEVICE.DeviceName
513    WCHAR               adapterName[32];
514    WCHAR               displayName[32];
515    char                publicAdapterName[32];
516    char                publicDisplayName[32];
517    GLFWbool            modesPruned;
518    GLFWbool            modeChanged;
519} _GLFWmonitorWin32;
520
521// Win32-specific per-cursor data
522//
523typedef struct _GLFWcursorWin32
524{
525    HCURSOR             handle;
526} _GLFWcursorWin32;
527
528
529GLFWbool _glfwConnectWin32(int platformID, _GLFWplatform* platform);
530int _glfwInitWin32(void);
531void _glfwTerminateWin32(void);
532
533WCHAR* _glfwCreateWideStringFromUTF8Win32(const char* source);
534char* _glfwCreateUTF8FromWideStringWin32(const WCHAR* source);
535BOOL _glfwIsWindowsVersionOrGreaterWin32(WORD major, WORD minor, WORD sp);
536BOOL _glfwIsWindows10BuildOrGreaterWin32(WORD build);
537void _glfwInputErrorWin32(int error, const char* description);
538void _glfwUpdateKeyNamesWin32(void);
539
540void _glfwPollMonitorsWin32(void);
541void _glfwSetVideoModeWin32(_GLFWmonitor* monitor, const GLFWvidmode* desired);
542void _glfwRestoreVideoModeWin32(_GLFWmonitor* monitor);
543void _glfwGetHMONITORContentScaleWin32(HMONITOR handle, float* xscale, float* yscale);
544
545GLFWbool _glfwCreateWindowWin32(_GLFWwindow* window, const _GLFWwndconfig* wndconfig, const _GLFWctxconfig* ctxconfig, const _GLFWfbconfig* fbconfig);
546void _glfwDestroyWindowWin32(_GLFWwindow* window);
547void _glfwSetWindowTitleWin32(_GLFWwindow* window, const char* title);
548void _glfwSetWindowIconWin32(_GLFWwindow* window, int count, const GLFWimage* images);
549void _glfwGetWindowPosWin32(_GLFWwindow* window, int* xpos, int* ypos);
550void _glfwSetWindowPosWin32(_GLFWwindow* window, int xpos, int ypos);
551void _glfwGetWindowSizeWin32(_GLFWwindow* window, int* width, int* height);
552void _glfwSetWindowSizeWin32(_GLFWwindow* window, int width, int height);
553void _glfwSetWindowSizeLimitsWin32(_GLFWwindow* window, int minwidth, int minheight, int maxwidth, int maxheight);
554void _glfwSetWindowAspectRatioWin32(_GLFWwindow* window, int numer, int denom);
555void _glfwGetFramebufferSizeWin32(_GLFWwindow* window, int* width, int* height);
556void _glfwGetWindowFrameSizeWin32(_GLFWwindow* window, int* left, int* top, int* right, int* bottom);
557void _glfwGetWindowContentScaleWin32(_GLFWwindow* window, float* xscale, float* yscale);
558void _glfwIconifyWindowWin32(_GLFWwindow* window);
559void _glfwRestoreWindowWin32(_GLFWwindow* window);
560void _glfwMaximizeWindowWin32(_GLFWwindow* window);
561void _glfwShowWindowWin32(_GLFWwindow* window);
562void _glfwHideWindowWin32(_GLFWwindow* window);
563void _glfwRequestWindowAttentionWin32(_GLFWwindow* window);
564void _glfwFocusWindowWin32(_GLFWwindow* window);
565void _glfwSetWindowMonitorWin32(_GLFWwindow* window, _GLFWmonitor* monitor, int xpos, int ypos, int width, int height, int refreshRate);
566GLFWbool _glfwWindowFocusedWin32(_GLFWwindow* window);
567GLFWbool _glfwWindowIconifiedWin32(_GLFWwindow* window);
568GLFWbool _glfwWindowVisibleWin32(_GLFWwindow* window);
569GLFWbool _glfwWindowMaximizedWin32(_GLFWwindow* window);
570GLFWbool _glfwWindowHoveredWin32(_GLFWwindow* window);
571GLFWbool _glfwFramebufferTransparentWin32(_GLFWwindow* window);
572void _glfwSetWindowResizableWin32(_GLFWwindow* window, GLFWbool enabled);
573void _glfwSetWindowDecoratedWin32(_GLFWwindow* window, GLFWbool enabled);
574void _glfwSetWindowFloatingWin32(_GLFWwindow* window, GLFWbool enabled);
575void _glfwSetWindowMousePassthroughWin32(_GLFWwindow* window, GLFWbool enabled);
576float _glfwGetWindowOpacityWin32(_GLFWwindow* window);
577void _glfwSetWindowOpacityWin32(_GLFWwindow* window, float opacity);
578
579void _glfwSetRawMouseMotionWin32(_GLFWwindow *window, GLFWbool enabled);
580GLFWbool _glfwRawMouseMotionSupportedWin32(void);
581
582void _glfwPollEventsWin32(void);
583void _glfwWaitEventsWin32(void);
584void _glfwWaitEventsTimeoutWin32(double timeout);
585void _glfwPostEmptyEventWin32(void);
586
587void _glfwGetCursorPosWin32(_GLFWwindow* window, double* xpos, double* ypos);
588void _glfwSetCursorPosWin32(_GLFWwindow* window, double xpos, double ypos);
589void _glfwSetCursorModeWin32(_GLFWwindow* window, int mode);
590const char* _glfwGetScancodeNameWin32(int scancode);
591int _glfwGetKeyScancodeWin32(int key);
592GLFWbool _glfwCreateCursorWin32(_GLFWcursor* cursor, const GLFWimage* image, int xhot, int yhot);
593GLFWbool _glfwCreateStandardCursorWin32(_GLFWcursor* cursor, int shape);
594void _glfwDestroyCursorWin32(_GLFWcursor* cursor);
595void _glfwSetCursorWin32(_GLFWwindow* window, _GLFWcursor* cursor);
596void _glfwSetClipboardStringWin32(const char* string);
597const char* _glfwGetClipboardStringWin32(void);
598
599EGLenum _glfwGetEGLPlatformWin32(EGLint** attribs);
600EGLNativeDisplayType _glfwGetEGLNativeDisplayWin32(void);
601EGLNativeWindowType _glfwGetEGLNativeWindowWin32(_GLFWwindow* window);
602
603void _glfwGetRequiredInstanceExtensionsWin32(char** extensions);
604GLFWbool _glfwGetPhysicalDevicePresentationSupportWin32(VkInstance instance, VkPhysicalDevice device, uint32_t queuefamily);
605VkResult _glfwCreateWindowSurfaceWin32(VkInstance instance, _GLFWwindow* window, const VkAllocationCallbacks* allocator, VkSurfaceKHR* surface);
606
607void _glfwFreeMonitorWin32(_GLFWmonitor* monitor);
608void _glfwGetMonitorPosWin32(_GLFWmonitor* monitor, int* xpos, int* ypos);
609void _glfwGetMonitorContentScaleWin32(_GLFWmonitor* monitor, float* xscale, float* yscale);
610void _glfwGetMonitorWorkareaWin32(_GLFWmonitor* monitor, int* xpos, int* ypos, int* width, int* height);
611GLFWvidmode* _glfwGetVideoModesWin32(_GLFWmonitor* monitor, int* count);
612GLFWbool _glfwGetVideoModeWin32(_GLFWmonitor* monitor, GLFWvidmode* mode);
613GLFWbool _glfwGetGammaRampWin32(_GLFWmonitor* monitor, GLFWgammaramp* ramp);
614void _glfwSetGammaRampWin32(_GLFWmonitor* monitor, const GLFWgammaramp* ramp);
615
616GLFWbool _glfwInitJoysticksWin32(void);
617void _glfwTerminateJoysticksWin32(void);
618GLFWbool _glfwPollJoystickWin32(_GLFWjoystick* js, int mode);
619const char* _glfwGetMappingNameWin32(void);
620void _glfwUpdateGamepadGUIDWin32(char* guid);
621
622GLFWbool _glfwInitWGL(void);
623void _glfwTerminateWGL(void);
624GLFWbool _glfwCreateContextWGL(_GLFWwindow* window,
625                               const _GLFWctxconfig* ctxconfig,
626                               const _GLFWfbconfig* fbconfig);
627
628