]> git.sesse.net Git - pistorm/blob - raylib_pi4_test/external/glfw/src/win32_platform.h
4f520514787f4419bf0c6a4e3f520e181654dbb3
[pistorm] / raylib_pi4_test / external / glfw / src / win32_platform.h
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_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
121 typedef 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
134 typedef 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
146 typedef enum
147 {
148     PROCESS_DPI_UNAWARE = 0,
149     PROCESS_SYSTEM_DPI_AWARE = 1,
150     PROCESS_PER_MONITOR_DPI_AWARE = 2
151 } PROCESS_DPI_AWARENESS;
152 typedef 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 // 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)
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 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
255
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_
261
262 // ntdll.dll function pointer typedefs
263 typedef LONG (WINAPI * PFN_RtlVerifyVersionInfo)(OSVERSIONINFOEXW*,ULONG,ULONGLONG);
264 #define RtlVerifyVersionInfo _glfw.win32.ntdll.RtlVerifyVersionInfo_
265
266 typedef VkFlags VkWin32SurfaceCreateFlagsKHR;
267
268 typedef struct VkWin32SurfaceCreateInfoKHR
269 {
270     VkStructureType                 sType;
271     const void*                     pNext;
272     VkWin32SurfaceCreateFlagsKHR    flags;
273     HINSTANCE                       hinstance;
274     HWND                            hwnd;
275 } VkWin32SurfaceCreateInfoKHR;
276
277 typedef VkResult (APIENTRY *PFN_vkCreateWin32SurfaceKHR)(VkInstance,const VkWin32SurfaceCreateInfoKHR*,const VkAllocationCallbacks*,VkSurfaceKHR*);
278 typedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)(VkPhysicalDevice,uint32_t);
279
280 #include "win32_joystick.h"
281 #include "wgl_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_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
298
299
300 // Win32-specific per-window data
301 //
302 typedef struct _GLFWwindowWin32
303 {
304     HWND                handle;
305     HICON               bigIcon;
306     HICON               smallIcon;
307
308     GLFWbool            cursorTracked;
309     GLFWbool            frameAction;
310     GLFWbool            iconified;
311     GLFWbool            maximized;
312     // Whether to enable framebuffer transparency on DWM
313     GLFWbool            transparent;
314     GLFWbool            scaleToMonitor;
315     GLFWbool            keymenu;
316
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
320     WCHAR               highSurrogate;
321
322 } _GLFWwindowWin32;
323
324 // Win32-specific global data
325 //
326 typedef struct _GLFWlibraryWin32
327 {
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;
340     RAWINPUT*           rawInput;
341     int                 rawInputSize;
342     UINT                mouseTrailSize;
343
344     struct {
345         HINSTANCE                       instance;
346         PFN_timeGetTime                 GetTime;
347     } winmm;
348
349     struct {
350         HINSTANCE                       instance;
351         PFN_DirectInput8Create          Create;
352         IDirectInput8W*                 api;
353     } dinput8;
354
355     struct {
356         HINSTANCE                       instance;
357         PFN_XInputGetCapabilities       GetCapabilities;
358         PFN_XInputGetState              GetState;
359     } xinput;
360
361     struct {
362         HINSTANCE                       instance;
363         PFN_SetProcessDPIAware          SetProcessDPIAware_;
364         PFN_ChangeWindowMessageFilterEx ChangeWindowMessageFilterEx_;
365         PFN_EnableNonClientDpiScaling   EnableNonClientDpiScaling_;
366         PFN_SetProcessDpiAwarenessContext SetProcessDpiAwarenessContext_;
367         PFN_GetDpiForWindow             GetDpiForWindow_;
368         PFN_AdjustWindowRectExForDpi    AdjustWindowRectExForDpi_;
369     } user32;
370
371     struct {
372         HINSTANCE                       instance;
373         PFN_DwmIsCompositionEnabled     IsCompositionEnabled;
374         PFN_DwmFlush                    Flush;
375         PFN_DwmEnableBlurBehindWindow   EnableBlurBehindWindow;
376         PFN_DwmGetColorizationColor     GetColorizationColor;
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