• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //========================================================================
2 // GLFW 3.2 - www.glfw.org
3 //------------------------------------------------------------------------
4 // Copyright (c) 2002-2006 Marcus Geelnard
5 // Copyright (c) 2006-2016 Camilla Berglund <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 #ifndef _glfw3_internal_h_
29 #define _glfw3_internal_h_
30 
31 
32 #if defined(_GLFW_USE_CONFIG_H)
33  #include "glfw_config.h"
34 #endif
35 
36 #if defined(GLFW_INCLUDE_GLCOREARB) || \
37     defined(GLFW_INCLUDE_ES1)       || \
38     defined(GLFW_INCLUDE_ES2)       || \
39     defined(GLFW_INCLUDE_ES3)       || \
40     defined(GLFW_INCLUDE_NONE)      || \
41     defined(GLFW_INCLUDE_GLEXT)     || \
42     defined(GLFW_INCLUDE_GLU)       || \
43     defined(GLFW_INCLUDE_VULKAN)    || \
44     defined(GLFW_DLL)
45  #error "You must not define any header option macros when compiling GLFW"
46 #endif
47 
48 #define GLFW_INCLUDE_NONE
49 #include "../include/GLFW/glfw3.h"
50 
51 typedef int GLFWbool;
52 
53 typedef struct _GLFWwndconfig   _GLFWwndconfig;
54 typedef struct _GLFWctxconfig   _GLFWctxconfig;
55 typedef struct _GLFWfbconfig    _GLFWfbconfig;
56 typedef struct _GLFWcontext     _GLFWcontext;
57 typedef struct _GLFWwindow      _GLFWwindow;
58 typedef struct _GLFWlibrary     _GLFWlibrary;
59 typedef struct _GLFWmonitor     _GLFWmonitor;
60 typedef struct _GLFWcursor      _GLFWcursor;
61 
62 typedef void (* _GLFWmakecontextcurrentfun)(_GLFWwindow*);
63 typedef void (* _GLFWswapbuffersfun)(_GLFWwindow*);
64 typedef void (* _GLFWswapintervalfun)(int);
65 typedef int (* _GLFWextensionsupportedfun)(const char*);
66 typedef GLFWglproc (* _GLFWgetprocaddressfun)(const char*);
67 typedef void (* _GLFWdestroycontextfun)(_GLFWwindow*);
68 
69 #define GL_VERSION 0x1f02
70 #define GL_NONE	0
71 #define GL_COLOR_BUFFER_BIT	0x00004000
72 #define GL_EXTENSIONS 0x1f03
73 #define GL_NUM_EXTENSIONS 0x821d
74 #define GL_CONTEXT_FLAGS 0x821e
75 #define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001
76 #define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002
77 #define GL_CONTEXT_PROFILE_MASK 0x9126
78 #define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002
79 #define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001
80 #define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256
81 #define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252
82 #define GL_NO_RESET_NOTIFICATION_ARB 0x8261
83 #define GL_CONTEXT_RELEASE_BEHAVIOR 0x82fb
84 #define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82fc
85 #define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008
86 
87 typedef int	GLint;
88 typedef unsigned int GLuint;
89 typedef unsigned int GLenum;
90 typedef unsigned int GLbitfield;
91 typedef unsigned char GLubyte;
92 
93 typedef void (APIENTRY * PFNGLCLEARPROC)(GLbitfield);
94 typedef const GLubyte* (APIENTRY * PFNGLGETSTRINGPROC)(GLenum);
95 typedef void (APIENTRY * PFNGLGETINTEGERVPROC)(GLenum,GLint*);
96 typedef const GLubyte* (APIENTRY * PFNGLGETSTRINGIPROC)(GLenum,GLuint);
97 
98 #define VK_NULL_HANDLE 0
99 
100 typedef void* VkInstance;
101 typedef void* VkPhysicalDevice;
102 typedef uint64_t VkSurfaceKHR;
103 typedef uint32_t VkFlags;
104 typedef uint32_t VkBool32;
105 
106 typedef enum VkStructureType
107 {
108     VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR = 1000004000,
109     VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR = 1000005000,
110     VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR = 1000006000,
111     VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR = 1000007000,
112     VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR = 1000009000,
113     VK_STRUCTURE_TYPE_MAX_ENUM = 0x7FFFFFFF
114 } VkStructureType;
115 
116 typedef enum VkResult
117 {
118     VK_SUCCESS = 0,
119     VK_NOT_READY = 1,
120     VK_TIMEOUT = 2,
121     VK_EVENT_SET = 3,
122     VK_EVENT_RESET = 4,
123     VK_INCOMPLETE = 5,
124     VK_ERROR_OUT_OF_HOST_MEMORY = -1,
125     VK_ERROR_OUT_OF_DEVICE_MEMORY = -2,
126     VK_ERROR_INITIALIZATION_FAILED = -3,
127     VK_ERROR_DEVICE_LOST = -4,
128     VK_ERROR_MEMORY_MAP_FAILED = -5,
129     VK_ERROR_LAYER_NOT_PRESENT = -6,
130     VK_ERROR_EXTENSION_NOT_PRESENT = -7,
131     VK_ERROR_FEATURE_NOT_PRESENT = -8,
132     VK_ERROR_INCOMPATIBLE_DRIVER = -9,
133     VK_ERROR_TOO_MANY_OBJECTS = -10,
134     VK_ERROR_FORMAT_NOT_SUPPORTED = -11,
135     VK_ERROR_SURFACE_LOST_KHR = -1000000000,
136     VK_SUBOPTIMAL_KHR = 1000001003,
137     VK_ERROR_OUT_OF_DATE_KHR = -1000001004,
138     VK_ERROR_INCOMPATIBLE_DISPLAY_KHR = -1000003001,
139     VK_ERROR_NATIVE_WINDOW_IN_USE_KHR = -1000000001,
140     VK_ERROR_VALIDATION_FAILED_EXT = -1000011001,
141     VK_RESULT_MAX_ENUM = 0x7FFFFFFF
142 } VkResult;
143 
144 typedef struct VkAllocationCallbacks VkAllocationCallbacks;
145 
146 typedef struct VkExtensionProperties
147 {
148     char            extensionName[256];
149     uint32_t        specVersion;
150 } VkExtensionProperties;
151 
152 typedef void (APIENTRY * PFN_vkVoidFunction)(void);
153 
154 #if defined(_GLFW_VULKAN_STATIC)
155   PFN_vkVoidFunction vkGetInstanceProcAddr(VkInstance,const char*);
156   VkResult vkEnumerateInstanceExtensionProperties(const char*,uint32_t*,VkExtensionProperties*);
157 #else
158   typedef PFN_vkVoidFunction (APIENTRY * PFN_vkGetInstanceProcAddr)(VkInstance,const char*);
159   typedef VkResult (APIENTRY * PFN_vkEnumerateInstanceExtensionProperties)(const char*,uint32_t*,VkExtensionProperties*);
160   #define vkEnumerateInstanceExtensionProperties _glfw.vk.EnumerateInstanceExtensionProperties
161   #define vkGetInstanceProcAddr _glfw.vk.GetInstanceProcAddr
162 #endif
163 
164 #if defined(_GLFW_COCOA)
165  #include "cocoa_platform.h"
166 #elif defined(_GLFW_WIN32)
167  #include "win32_platform.h"
168 #elif defined(_GLFW_X11)
169  #include "x11_platform.h"
170 #elif defined(_GLFW_WAYLAND)
171  #include "wl_platform.h"
172 #elif defined(_GLFW_MIR)
173  #include "mir_platform.h"
174 #else
175  #error "No supported window creation API selected"
176 #endif
177 
178 
179 //========================================================================
180 // Doxygen group definitions
181 //========================================================================
182 
183 /*! @defgroup platform Platform interface
184  *  @brief The interface implemented by the platform-specific code.
185  *
186  *  The platform API is the interface exposed by the platform-specific code for
187  *  each platform and is called by the shared code of the public API It mirrors
188  *  the public API except it uses objects instead of handles.
189  */
190 /*! @defgroup event Event interface
191  *  @brief The interface used by the platform-specific code to report events.
192  *
193  *  The event API is used by the platform-specific code to notify the shared
194  *  code of events that can be translated into state changes and/or callback
195  *  calls.
196  */
197 /*! @defgroup utility Utility functions
198  *  @brief Various utility functions for internal use.
199  *
200  *  These functions are shared code and may be used by any part of GLFW
201  *  Each platform may add its own utility functions, but those must only be
202  *  called by the platform-specific code
203  */
204 
205 
206 //========================================================================
207 // Helper macros
208 //========================================================================
209 
210 // Constructs a version number string from the public header macros
211 #define _GLFW_CONCAT_VERSION(m, n, r) #m "." #n "." #r
212 #define _GLFW_MAKE_VERSION(m, n, r) _GLFW_CONCAT_VERSION(m, n, r)
213 #define _GLFW_VERSION_NUMBER _GLFW_MAKE_VERSION(GLFW_VERSION_MAJOR, \
214                                                 GLFW_VERSION_MINOR, \
215                                                 GLFW_VERSION_REVISION)
216 
217 // Checks for whether the library has been initialized
218 #define _GLFW_REQUIRE_INIT()                         \
219     if (!_glfwInitialized)                           \
220     {                                                \
221         _glfwInputError(GLFW_NOT_INITIALIZED, NULL); \
222         return;                                      \
223     }
224 #define _GLFW_REQUIRE_INIT_OR_RETURN(x)              \
225     if (!_glfwInitialized)                           \
226     {                                                \
227         _glfwInputError(GLFW_NOT_INITIALIZED, NULL); \
228         return x;                                    \
229     }
230 
231 // Swaps the provided pointers
232 #define _GLFW_SWAP_POINTERS(x, y) \
233     {                             \
234         void* t;                  \
235         t = x;                    \
236         x = y;                    \
237         y = t;                    \
238     }
239 
240 
241 //========================================================================
242 // Platform-independent structures
243 //========================================================================
244 
245 /*! @brief Window configuration.
246  *
247  *  Parameters relating to the creation of the window but not directly related
248  *  to the framebuffer.  This is used to pass window creation parameters from
249  *  shared code to the platform API.
250  */
251 struct _GLFWwndconfig
252 {
253     int           width;
254     int           height;
255     const char*   title;
256     GLFWbool      resizable;
257     GLFWbool      visible;
258     GLFWbool      decorated;
259     GLFWbool      focused;
260     GLFWbool      autoIconify;
261     GLFWbool      floating;
262     GLFWbool      maximized;
263 };
264 
265 /*! @brief Context configuration.
266  *
267  *  Parameters relating to the creation of the context but not directly related
268  *  to the framebuffer.  This is used to pass context creation parameters from
269  *  shared code to the platform API.
270  */
271 struct _GLFWctxconfig
272 {
273     int           client;
274     int           source;
275     int           major;
276     int           minor;
277     GLFWbool      forward;
278     GLFWbool      debug;
279     GLFWbool      noerror;
280     int           profile;
281     int           robustness;
282     int           release;
283     _GLFWwindow*  share;
284 };
285 
286 /*! @brief Framebuffer configuration.
287  *
288  *  This describes buffers and their sizes.  It also contains
289  *  a platform-specific ID used to map back to the backend API object.
290  *
291  *  It is used to pass framebuffer parameters from shared code to the platform
292  *  API and also to enumerate and select available framebuffer configs.
293  */
294 struct _GLFWfbconfig
295 {
296     int         redBits;
297     int         greenBits;
298     int         blueBits;
299     int         alphaBits;
300     int         depthBits;
301     int         stencilBits;
302     int         accumRedBits;
303     int         accumGreenBits;
304     int         accumBlueBits;
305     int         accumAlphaBits;
306     int         auxBuffers;
307     GLFWbool    stereo;
308     int         samples;
309     GLFWbool    sRGB;
310     GLFWbool    doublebuffer;
311     uintptr_t   handle;
312 };
313 
314 /*! @brief Context structure.
315  */
316 struct _GLFWcontext
317 {
318     int                 client;
319     int                 source;
320     int                 major, minor, revision;
321     GLFWbool            forward, debug, noerror;
322     int                 profile;
323     int                 robustness;
324     int                 release;
325 
326     PFNGLGETSTRINGIPROC GetStringi;
327     PFNGLGETINTEGERVPROC GetIntegerv;
328     PFNGLGETSTRINGPROC  GetString;
329 
330     _GLFWmakecontextcurrentfun  makeCurrent;
331     _GLFWswapbuffersfun         swapBuffers;
332     _GLFWswapintervalfun        swapInterval;
333     _GLFWextensionsupportedfun  extensionSupported;
334     _GLFWgetprocaddressfun      getProcAddress;
335     _GLFWdestroycontextfun      destroy;
336 
337     // This is defined in the context API's context.h
338     _GLFW_PLATFORM_CONTEXT_STATE;
339     // This is defined in egl_context.h
340     _GLFW_EGL_CONTEXT_STATE;
341 };
342 
343 /*! @brief Window and context structure.
344  */
345 struct _GLFWwindow
346 {
347     struct _GLFWwindow* next;
348 
349     // Window settings and state
350     GLFWbool            resizable;
351     GLFWbool            decorated;
352     GLFWbool            autoIconify;
353     GLFWbool            floating;
354     GLFWbool            closed;
355     void*               userPointer;
356     GLFWvidmode         videoMode;
357     _GLFWmonitor*       monitor;
358     _GLFWcursor*        cursor;
359 
360     int                 minwidth, minheight;
361     int                 maxwidth, maxheight;
362     int                 numer, denom;
363 
364     GLFWbool            stickyKeys;
365     GLFWbool            stickyMouseButtons;
366     int                 cursorMode;
367     char                mouseButtons[GLFW_MOUSE_BUTTON_LAST + 1];
368     char                keys[GLFW_KEY_LAST + 1];
369     // Virtual cursor position when cursor is disabled
370     double              virtualCursorPosX, virtualCursorPosY;
371 
372     _GLFWcontext        context;
373 
374     struct {
375         GLFWwindowposfun        pos;
376         GLFWwindowsizefun       size;
377         GLFWwindowclosefun      close;
378         GLFWwindowrefreshfun    refresh;
379         GLFWwindowfocusfun      focus;
380         GLFWwindowiconifyfun    iconify;
381         GLFWframebuffersizefun  fbsize;
382         GLFWmousebuttonfun      mouseButton;
383         GLFWcursorposfun        cursorPos;
384         GLFWcursorenterfun      cursorEnter;
385         GLFWscrollfun           scroll;
386         GLFWkeyfun              key;
387         GLFWcharfun             character;
388         GLFWcharmodsfun         charmods;
389         GLFWdropfun             drop;
390     } callbacks;
391 
392     // This is defined in the window API's platform.h
393     _GLFW_PLATFORM_WINDOW_STATE;
394 };
395 
396 /*! @brief Monitor structure.
397  */
398 struct _GLFWmonitor
399 {
400     char*           name;
401 
402     // Physical dimensions in millimeters.
403     int             widthMM, heightMM;
404 
405     // The window whose video mode is current on this monitor
406     _GLFWwindow*    window;
407 
408     GLFWvidmode*    modes;
409     int             modeCount;
410     GLFWvidmode     currentMode;
411 
412     GLFWgammaramp   originalRamp;
413     GLFWgammaramp   currentRamp;
414 
415     // This is defined in the window API's platform.h
416     _GLFW_PLATFORM_MONITOR_STATE;
417 };
418 
419 /*! @brief Cursor structure
420  */
421 struct _GLFWcursor
422 {
423     _GLFWcursor*    next;
424 
425     // This is defined in the window API's platform.h
426     _GLFW_PLATFORM_CURSOR_STATE;
427 };
428 
429 /*! @brief Library global data.
430  */
431 struct _GLFWlibrary
432 {
433     struct {
434         _GLFWfbconfig   framebuffer;
435         _GLFWwndconfig  window;
436         _GLFWctxconfig  context;
437         int             refreshRate;
438     } hints;
439 
440     _GLFWcursor*        cursorListHead;
441 
442     _GLFWwindow*        windowListHead;
443 
444     _GLFWmonitor**      monitors;
445     int                 monitorCount;
446 
447     uint64_t            timerOffset;
448 
449     struct {
450         GLFWbool        available;
451         void*           handle;
452         char**          extensions;
453         uint32_t        extensionCount;
454 #if !defined(_GLFW_VULKAN_STATIC)
455         PFN_vkEnumerateInstanceExtensionProperties EnumerateInstanceExtensionProperties;
456         PFN_vkGetInstanceProcAddr GetInstanceProcAddr;
457 #endif
458         GLFWbool        KHR_surface;
459         GLFWbool        KHR_win32_surface;
460         GLFWbool        KHR_xlib_surface;
461         GLFWbool        KHR_xcb_surface;
462         GLFWbool        KHR_wayland_surface;
463         GLFWbool        KHR_mir_surface;
464     } vk;
465 
466     struct {
467         GLFWmonitorfun  monitor;
468         GLFWjoystickfun joystick;
469     } callbacks;
470 
471     // This is defined in the window API's platform.h
472     _GLFW_PLATFORM_LIBRARY_WINDOW_STATE;
473     // This is defined in the context API's context.h
474     _GLFW_PLATFORM_LIBRARY_CONTEXT_STATE;
475     // This is defined in the platform's time.h
476     _GLFW_PLATFORM_LIBRARY_TIME_STATE;
477     // This is defined in the platform's joystick.h
478     _GLFW_PLATFORM_LIBRARY_JOYSTICK_STATE;
479     // This is defined in the platform's tls.h
480     _GLFW_PLATFORM_LIBRARY_TLS_STATE;
481     // This is defined in egl_context.h
482     _GLFW_EGL_LIBRARY_CONTEXT_STATE;
483 };
484 
485 
486 //========================================================================
487 // Global state shared between compilation units of GLFW
488 //========================================================================
489 
490 /*! @brief Flag indicating whether GLFW has been successfully initialized.
491  */
492 extern GLFWbool _glfwInitialized;
493 
494 /*! @brief All global data protected by @ref _glfwInitialized.
495  *  This should only be touched after a call to @ref glfwInit that has not been
496  *  followed by a call to @ref glfwTerminate.
497  */
498 extern _GLFWlibrary _glfw;
499 
500 
501 //========================================================================
502 // Platform API functions
503 //========================================================================
504 
505 /*! @brief Initializes the platform-specific part of the library.
506  *  @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an error occurred.
507  *  @ingroup platform
508  */
509 int _glfwPlatformInit(void);
510 
511 /*! @brief Terminates the platform-specific part of the library.
512  *  @ingroup platform
513  */
514 void _glfwPlatformTerminate(void);
515 
516 /*! @copydoc glfwGetVersionString
517  *  @ingroup platform
518  *
519  *  @note The returned string must be available for the duration of the program.
520  *
521  *  @note The returned string must not change for the duration of the program.
522  */
523 const char* _glfwPlatformGetVersionString(void);
524 
525 /*! @copydoc glfwGetCursorPos
526  *  @ingroup platform
527  */
528 void _glfwPlatformGetCursorPos(_GLFWwindow* window, double* xpos, double* ypos);
529 
530 /*! @copydoc glfwSetCursorPos
531  *  @ingroup platform
532  */
533 void _glfwPlatformSetCursorPos(_GLFWwindow* window, double xpos, double ypos);
534 
535 /*! @brief Sets the specified cursor mode of the specified window.
536  *  @param[in] window The window whose cursor mode to set.
537  *  @ingroup platform
538  */
539 void _glfwPlatformSetCursorMode(_GLFWwindow* window, int mode);
540 
541 /*! @copydoc glfwGetKeyName
542  *  @ingroup platform
543  */
544 const char* _glfwPlatformGetKeyName(int key, int scancode);
545 
546 /*! @copydoc glfwGetMonitors
547  *  @ingroup platform
548  */
549 _GLFWmonitor** _glfwPlatformGetMonitors(int* count);
550 
551 /*! @brief Checks whether two monitor objects represent the same monitor.
552  *
553  *  @param[in] first The first monitor.
554  *  @param[in] second The second monitor.
555  *  @return @c GLFW_TRUE if the monitor objects represent the same monitor, or
556  *  @c GLFW_FALSE otherwise.
557  *  @ingroup platform
558  */
559 GLFWbool _glfwPlatformIsSameMonitor(_GLFWmonitor* first, _GLFWmonitor* second);
560 
561 /*! @copydoc glfwGetMonitorPos
562  *  @ingroup platform
563  */
564 void _glfwPlatformGetMonitorPos(_GLFWmonitor* monitor, int* xpos, int* ypos);
565 
566 /*! @copydoc glfwGetVideoModes
567  *  @ingroup platform
568  */
569 GLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* count);
570 
571 /*! @ingroup platform
572  */
573 void _glfwPlatformGetVideoMode(_GLFWmonitor* monitor, GLFWvidmode* mode);
574 
575 /*! @copydoc glfwGetGammaRamp
576  *  @ingroup platform
577  */
578 void _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp);
579 
580 /*! @copydoc glfwSetGammaRamp
581  *  @ingroup platform
582  */
583 void _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor, const GLFWgammaramp* ramp);
584 
585 /*! @copydoc glfwSetClipboardString
586  *  @ingroup platform
587  */
588 void _glfwPlatformSetClipboardString(_GLFWwindow* window, const char* string);
589 
590 /*! @copydoc glfwGetClipboardString
591  *  @ingroup platform
592  *
593  *  @note The returned string must be valid until the next call to @ref
594  *  _glfwPlatformGetClipboardString or @ref _glfwPlatformSetClipboardString.
595  */
596 const char* _glfwPlatformGetClipboardString(_GLFWwindow* window);
597 
598 /*! @copydoc glfwJoystickPresent
599  *  @ingroup platform
600  */
601 int _glfwPlatformJoystickPresent(int joy);
602 
603 /*! @copydoc glfwGetJoystickAxes
604  *  @ingroup platform
605  */
606 const float* _glfwPlatformGetJoystickAxes(int joy, int* count);
607 
608 /*! @copydoc glfwGetJoystickButtons
609  *  @ingroup platform
610  */
611 const unsigned char* _glfwPlatformGetJoystickButtons(int joy, int* count);
612 
613 /*! @copydoc glfwGetJoystickName
614  *  @ingroup platform
615  */
616 const char* _glfwPlatformGetJoystickName(int joy);
617 
618 /*! @copydoc glfwGetTimerValue
619  *  @ingroup platform
620  */
621 uint64_t _glfwPlatformGetTimerValue(void);
622 
623 /*! @copydoc glfwGetTimerFrequency
624  *  @ingroup platform
625  */
626 uint64_t _glfwPlatformGetTimerFrequency(void);
627 
628 /*! @ingroup platform
629  */
630 int _glfwPlatformCreateWindow(_GLFWwindow* window,
631                               const _GLFWwndconfig* wndconfig,
632                               const _GLFWctxconfig* ctxconfig,
633                               const _GLFWfbconfig* fbconfig);
634 
635 /*! @ingroup platform
636  */
637 void _glfwPlatformDestroyWindow(_GLFWwindow* window);
638 
639 /*! @copydoc glfwSetWindowTitle
640  *  @ingroup platform
641  */
642 void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title);
643 
644 /*! @copydoc glfwSetWindowIcon
645  *  @ingroup platform
646  */
647 void _glfwPlatformSetWindowIcon(_GLFWwindow* window, int count, const GLFWimage* images);
648 
649 /*! @copydoc glfwGetWindowPos
650  *  @ingroup platform
651  */
652 void _glfwPlatformGetWindowPos(_GLFWwindow* window, int* xpos, int* ypos);
653 
654 /*! @copydoc glfwSetWindowPos
655  *  @ingroup platform
656  */
657 void _glfwPlatformSetWindowPos(_GLFWwindow* window, int xpos, int ypos);
658 
659 /*! @copydoc glfwGetWindowSize
660  *  @ingroup platform
661  */
662 void _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height);
663 
664 /*! @copydoc glfwSetWindowSize
665  *  @ingroup platform
666  */
667 void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height);
668 
669 /*! @copydoc glfwSetWindowSizeLimits
670  *  @ingroup platform
671  */
672 void _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window, int minwidth, int minheight, int maxwidth, int maxheight);
673 
674 /*! @copydoc glfwSetWindowAspectRatio
675  *  @ingroup platform
676  */
677 void _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window, int numer, int denom);
678 
679 /*! @copydoc glfwGetFramebufferSize
680  *  @ingroup platform
681  */
682 void _glfwPlatformGetFramebufferSize(_GLFWwindow* window, int* width, int* height);
683 
684 /*! @copydoc glfwGetWindowFrameSize
685  *  @ingroup platform
686  */
687 void _glfwPlatformGetWindowFrameSize(_GLFWwindow* window, int* left, int* top, int* right, int* bottom);
688 
689 /*! @copydoc glfwIconifyWindow
690  *  @ingroup platform
691  */
692 void _glfwPlatformIconifyWindow(_GLFWwindow* window);
693 
694 /*! @copydoc glfwRestoreWindow
695  *  @ingroup platform
696  */
697 void _glfwPlatformRestoreWindow(_GLFWwindow* window);
698 
699 /*! @copydoc glfwMaximizeWindow
700  *  @ingroup platform
701  */
702 void _glfwPlatformMaximizeWindow(_GLFWwindow* window);
703 
704 /*! @copydoc glfwShowWindow
705  *  @ingroup platform
706  */
707 void _glfwPlatformShowWindow(_GLFWwindow* window);
708 
709 /*! @copydoc glfwHideWindow
710  *  @ingroup platform
711  */
712 void _glfwPlatformHideWindow(_GLFWwindow* window);
713 
714 /*! @copydoc glfwFocusWindow
715  *  @ingroup platform
716  */
717 void _glfwPlatformFocusWindow(_GLFWwindow* window);
718 
719 /*! @copydoc glfwSetWindowMonitor
720  *  @ingroup platform
721  */
722 void _glfwPlatformSetWindowMonitor(_GLFWwindow* window, _GLFWmonitor* monitor, int xpos, int ypos, int width, int height, int refreshRate);
723 
724 /*! @brief Returns whether the window is focused.
725  *  @ingroup platform
726  */
727 int _glfwPlatformWindowFocused(_GLFWwindow* window);
728 
729 /*! @brief Returns whether the window is iconified.
730  *  @ingroup platform
731  */
732 int _glfwPlatformWindowIconified(_GLFWwindow* window);
733 
734 /*! @brief Returns whether the window is visible.
735  *  @ingroup platform
736  */
737 int _glfwPlatformWindowVisible(_GLFWwindow* window);
738 
739 /*! @brief Returns whether the window is maximized.
740  *  @ingroup platform
741  */
742 int _glfwPlatformWindowMaximized(_GLFWwindow* window);
743 
744 /*! @copydoc glfwPollEvents
745  *  @ingroup platform
746  */
747 void _glfwPlatformPollEvents(void);
748 
749 /*! @copydoc glfwWaitEvents
750  *  @ingroup platform
751  */
752 void _glfwPlatformWaitEvents(void);
753 
754 /*! @copydoc glfwWaitEventsTimeout
755  *  @ingroup platform
756  */
757 void _glfwPlatformWaitEventsTimeout(double timeout);
758 
759 /*! @copydoc glfwPostEmptyEvent
760  *  @ingroup platform
761  */
762 void _glfwPlatformPostEmptyEvent(void);
763 
764 /*! @ingroup platform
765  */
766 void _glfwPlatformSetCurrentContext(_GLFWwindow* context);
767 
768 /*! @copydoc glfwGetCurrentContext
769  *  @ingroup platform
770  */
771 _GLFWwindow* _glfwPlatformGetCurrentContext(void);
772 
773 /*! @copydoc glfwCreateCursor
774  *  @ingroup platform
775  */
776 int _glfwPlatformCreateCursor(_GLFWcursor* cursor, const GLFWimage* image, int xhot, int yhot);
777 
778 /*! @copydoc glfwCreateStandardCursor
779  *  @ingroup platform
780  */
781 int _glfwPlatformCreateStandardCursor(_GLFWcursor* cursor, int shape);
782 
783 /*! @copydoc glfwDestroyCursor
784  *  @ingroup platform
785  */
786 void _glfwPlatformDestroyCursor(_GLFWcursor* cursor);
787 
788 /*! @copydoc glfwSetCursor
789  *  @ingroup platform
790  */
791 void _glfwPlatformSetCursor(_GLFWwindow* window, _GLFWcursor* cursor);
792 
793 /*! @ingroup platform
794  */
795 char** _glfwPlatformGetRequiredInstanceExtensions(uint32_t* count);
796 
797 /*! @ingroup platform
798  */
799 int _glfwPlatformGetPhysicalDevicePresentationSupport(VkInstance instance, VkPhysicalDevice device, uint32_t queuefamily);
800 
801 /*! @ingroup platform
802  */
803 VkResult _glfwPlatformCreateWindowSurface(VkInstance instance, _GLFWwindow* window, const VkAllocationCallbacks* allocator, VkSurfaceKHR* surface);
804 
805 
806 //========================================================================
807 // Event API functions
808 //========================================================================
809 
810 /*! @brief Notifies shared code of a window focus event.
811  *  @param[in] window The window that received the event.
812  *  @param[in] focused `GLFW_TRUE` if the window received focus, or `GLFW_FALSE`
813  *  if it lost focus.
814  *  @ingroup event
815  */
816 void _glfwInputWindowFocus(_GLFWwindow* window, GLFWbool focused);
817 
818 /*! @brief Notifies shared code of a window movement event.
819  *  @param[in] window The window that received the event.
820  *  @param[in] xpos The new x-coordinate of the client area of the window.
821  *  @param[in] ypos The new y-coordinate of the client area of the window.
822  *  @ingroup event
823  */
824 void _glfwInputWindowPos(_GLFWwindow* window, int xpos, int ypos);
825 
826 /*! @brief Notifies shared code of a window resize event.
827  *  @param[in] window The window that received the event.
828  *  @param[in] width The new width of the client area of the window.
829  *  @param[in] height The new height of the client area of the window.
830  *  @ingroup event
831  */
832 void _glfwInputWindowSize(_GLFWwindow* window, int width, int height);
833 
834 /*! @brief Notifies shared code of a framebuffer resize event.
835  *  @param[in] window The window that received the event.
836  *  @param[in] width The new width, in pixels, of the framebuffer.
837  *  @param[in] height The new height, in pixels, of the framebuffer.
838  *  @ingroup event
839  */
840 void _glfwInputFramebufferSize(_GLFWwindow* window, int width, int height);
841 
842 /*! @brief Notifies shared code of a window iconification event.
843  *  @param[in] window The window that received the event.
844  *  @param[in] iconified `GLFW_TRUE` if the window was iconified, or
845  *  `GLFW_FALSE` if it was restored.
846  *  @ingroup event
847  */
848 void _glfwInputWindowIconify(_GLFWwindow* window, GLFWbool iconified);
849 
850 /*! @brief Notifies shared code of a window damage event.
851  *  @param[in] window The window that received the event.
852  */
853 void _glfwInputWindowDamage(_GLFWwindow* window);
854 
855 /*! @brief Notifies shared code of a window close request event
856  *  @param[in] window The window that received the event.
857  *  @ingroup event
858  */
859 void _glfwInputWindowCloseRequest(_GLFWwindow* window);
860 
861 void _glfwInputWindowMonitorChange(_GLFWwindow* window, _GLFWmonitor* monitor);
862 
863 /*! @brief Notifies shared code of a physical key event.
864  *  @param[in] window The window that received the event.
865  *  @param[in] key The key that was pressed or released.
866  *  @param[in] scancode The system-specific scan code of the key.
867  *  @param[in] action @ref GLFW_PRESS or @ref GLFW_RELEASE.
868  *  @param[in] mods The modifiers pressed when the event was generated.
869  *  @ingroup event
870  */
871 void _glfwInputKey(_GLFWwindow* window, int key, int scancode, int action, int mods);
872 
873 /*! @brief Notifies shared code of a Unicode character input event.
874  *  @param[in] window The window that received the event.
875  *  @param[in] codepoint The Unicode code point of the input character.
876  *  @param[in] mods Bit field describing which modifier keys were held down.
877  *  @param[in] plain `GLFW_TRUE` if the character is regular text input, or
878  *  `GLFW_FALSE` otherwise.
879  *  @ingroup event
880  */
881 void _glfwInputChar(_GLFWwindow* window, unsigned int codepoint, int mods, GLFWbool plain);
882 
883 /*! @brief Notifies shared code of a scroll event.
884  *  @param[in] window The window that received the event.
885  *  @param[in] xoffset The scroll offset along the x-axis.
886  *  @param[in] yoffset The scroll offset along the y-axis.
887  *  @ingroup event
888  */
889 void _glfwInputScroll(_GLFWwindow* window, double xoffset, double yoffset);
890 
891 /*! @brief Notifies shared code of a mouse button click event.
892  *  @param[in] window The window that received the event.
893  *  @param[in] button The button that was pressed or released.
894  *  @param[in] action @ref GLFW_PRESS or @ref GLFW_RELEASE.
895  *  @ingroup event
896  */
897 void _glfwInputMouseClick(_GLFWwindow* window, int button, int action, int mods);
898 
899 /*! @brief Notifies shared code of a cursor motion event.
900  *  @param[in] window The window that received the event.
901  *  @param[in] xpos The new x-coordinate of the cursor, relative to the left
902  *  edge of the client area of the window.
903  *  @param[in] ypos The new y-coordinate of the cursor, relative to the top edge
904  *  of the client area of the window.
905  *  @ingroup event
906  */
907 void _glfwInputCursorPos(_GLFWwindow* window, double xpos, double ypos);
908 
909 /*! @brief Notifies shared code of a cursor enter/leave event.
910  *  @param[in] window The window that received the event.
911  *  @param[in] entered `GLFW_TRUE` if the cursor entered the client area of the
912  *  window, or `GLFW_FALSE` if it left it.
913  *  @ingroup event
914  */
915 void _glfwInputCursorEnter(_GLFWwindow* window, GLFWbool entered);
916 
917 /*! @ingroup event
918  */
919 void _glfwInputMonitorChange(void);
920 
921 /*! @ingroup event
922  */
923 void _glfwInputMonitorWindowChange(_GLFWmonitor* monitor, _GLFWwindow* window);
924 
925 /*! @brief Notifies shared code of an error.
926  *  @param[in] error The error code most suitable for the error.
927  *  @param[in] format The `printf` style format string of the error
928  *  description.
929  *  @ingroup event
930  */
931 #if defined(__GNUC__)
932 void _glfwInputError(int error, const char* format, ...) __attribute__((format(printf, 2, 3)));
933 #else
934 void _glfwInputError(int error, const char* format, ...);
935 #endif
936 
937 /*! @brief Notifies dropped object over window.
938  *  @param[in] window The window that received the event.
939  *  @param[in] count The number of dropped objects.
940  *  @param[in] names The names of the dropped objects.
941  *  @ingroup event
942  */
943 void _glfwInputDrop(_GLFWwindow* window, int count, const char** names);
944 
945 /*! @brief Notifies shared code of a joystick connection/disconnection event.
946  *  @param[in] joy The joystick that was connected or disconnected.
947  *  @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`.
948  *  @ingroup event
949  */
950 void _glfwInputJoystickChange(int joy, int event);
951 
952 
953 //========================================================================
954 // Utility functions
955 //========================================================================
956 
957 /*! @ingroup utility
958  */
959 const GLFWvidmode* _glfwChooseVideoMode(_GLFWmonitor* monitor,
960                                         const GLFWvidmode* desired);
961 
962 /*! @brief Performs lexical comparison between two @ref GLFWvidmode structures.
963  *  @ingroup utility
964  */
965 int _glfwCompareVideoModes(const GLFWvidmode* first, const GLFWvidmode* second);
966 
967 /*! @brief Splits a color depth into red, green and blue bit depths.
968  *  @ingroup utility
969  */
970 void _glfwSplitBPP(int bpp, int* red, int* green, int* blue);
971 
972 /*! @brief Searches an extension string for the specified extension.
973  *  @param[in] string The extension string to search.
974  *  @param[in] extensions The extension to search for.
975  *  @return `GLFW_TRUE` if the extension was found, or `GLFW_FALSE` otherwise.
976  *  @ingroup utility
977  */
978 GLFWbool _glfwStringInExtensionString(const char* string, const char* extensions);
979 
980 /*! @brief Chooses the framebuffer config that best matches the desired one.
981  *  @param[in] desired The desired framebuffer config.
982  *  @param[in] alternatives The framebuffer configs supported by the system.
983  *  @param[in] count The number of entries in the alternatives array.
984  *  @return The framebuffer config most closely matching the desired one, or @c
985  *  NULL if none fulfilled the hard constraints of the desired values.
986  *  @ingroup utility
987  */
988 const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired,
989                                          const _GLFWfbconfig* alternatives,
990                                          unsigned int count);
991 
992 /*! @brief Retrieves the attributes of the current context.
993  *  @param[in] ctxconfig The desired context attributes.
994  *  @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if the context is
995  *  unusable.
996  *  @ingroup utility
997  */
998 GLFWbool _glfwRefreshContextAttribs(const _GLFWctxconfig* ctxconfig);
999 
1000 /*! @brief Checks whether the desired context attributes are valid.
1001  *  @param[in] ctxconfig The context attributes to check.
1002  *  @return `GLFW_TRUE` if the context attributes are valid, or `GLFW_FALSE`
1003  *  otherwise.
1004  *  @ingroup utility
1005  *
1006  *  This function checks things like whether the specified client API version
1007  *  exists and whether all relevant options have supported and non-conflicting
1008  *  values.
1009  */
1010 GLFWbool _glfwIsValidContextConfig(const _GLFWctxconfig* ctxconfig);
1011 
1012 /*! @ingroup utility
1013  */
1014 void _glfwAllocGammaArrays(GLFWgammaramp* ramp, unsigned int size);
1015 
1016 /*! @ingroup utility
1017  */
1018 void _glfwFreeGammaArrays(GLFWgammaramp* ramp);
1019 
1020 /*! @brief Allocates and returns a monitor object with the specified name
1021  *  and dimensions.
1022  *  @param[in] name The name of the monitor.
1023  *  @param[in] widthMM The width, in mm, of the monitor's display area.
1024  *  @param[in] heightMM The height, in mm, of the monitor's display area.
1025  *  @return The newly created object.
1026  *  @ingroup utility
1027  */
1028 _GLFWmonitor* _glfwAllocMonitor(const char* name, int widthMM, int heightMM);
1029 
1030 /*! @brief Frees a monitor object and any data associated with it.
1031  *  @ingroup utility
1032   */
1033 void _glfwFreeMonitor(_GLFWmonitor* monitor);
1034 
1035 /*! @ingroup utility
1036   */
1037 void _glfwFreeMonitors(_GLFWmonitor** monitors, int count);
1038 
1039 /*! @ingroup utility
1040  */
1041 GLFWbool _glfwIsPrintable(int key);
1042 
1043 /*! @ingroup utility
1044  */
1045 GLFWbool _glfwInitVulkan(void);
1046 
1047 /*! @ingroup utility
1048  */
1049 void _glfwTerminateVulkan(void);
1050 
1051 /*! @ingroup utility
1052  */
1053 const char* _glfwGetVulkanResultString(VkResult result);
1054 
1055 #endif // _glfw3_internal_h_
1056