internal.h 27.4 KB
Newer Older
Camilla Berglund's avatar
Camilla Berglund committed
1
//========================================================================
Camilla Berglund's avatar
Camilla Berglund committed
2
// GLFW 3.3 - www.glfw.org
Camilla Berglund's avatar
Camilla Berglund committed
3
4
//------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard
Camilla Löwy's avatar
Camilla Löwy committed
5
// Copyright (c) 2006-2019 Camilla Löwy <elmindreda@glfw.org>
Camilla Berglund's avatar
Camilla Berglund committed
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
//    claim that you wrote the original software. If you use this software
//    in a product, an acknowledgment in the product documentation would
//    be appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not
//    be misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source
//    distribution.
//
//========================================================================

28
29
#pragma once

30
31
32
#if defined(_GLFW_USE_CONFIG_H)
 #include "glfw_config.h"
#endif
Camilla Berglund's avatar
Camilla Berglund committed
33

34
35
36
37
#if defined(GLFW_INCLUDE_GLCOREARB) || \
    defined(GLFW_INCLUDE_ES1)       || \
    defined(GLFW_INCLUDE_ES2)       || \
    defined(GLFW_INCLUDE_ES3)       || \
Camilla Löwy's avatar
Camilla Löwy committed
38
39
    defined(GLFW_INCLUDE_ES31)      || \
    defined(GLFW_INCLUDE_ES32)      || \
40
41
42
    defined(GLFW_INCLUDE_NONE)      || \
    defined(GLFW_INCLUDE_GLEXT)     || \
    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
47
#endif

48
#define GLFW_INCLUDE_NONE
49
#include "../include/GLFW/glfw3.h"
Camilla Berglund's avatar
Camilla Berglund committed
50

51
52
53
#define _GLFW_INSERT_FIRST      0
#define _GLFW_INSERT_LAST       1

54
55
56
#define _GLFW_POLL_PRESENCE     0
#define _GLFW_POLL_AXES         1
#define _GLFW_POLL_BUTTONS      2
57
#define _GLFW_POLL_ALL          (_GLFW_POLL_AXES | _GLFW_POLL_BUTTONS)
58

59
60
#define _GLFW_MESSAGE_SIZE      1024

Camilla Berglund's avatar
Camilla Berglund committed
61
62
typedef int GLFWbool;

63
typedef struct _GLFWerror       _GLFWerror;
Camilla Löwy's avatar
Camilla Löwy committed
64
typedef struct _GLFWinitconfig  _GLFWinitconfig;
Camilla Berglund's avatar
Camilla Berglund committed
65
66
67
68
69
70
71
72
typedef struct _GLFWwndconfig   _GLFWwndconfig;
typedef struct _GLFWctxconfig   _GLFWctxconfig;
typedef struct _GLFWfbconfig    _GLFWfbconfig;
typedef struct _GLFWcontext     _GLFWcontext;
typedef struct _GLFWwindow      _GLFWwindow;
typedef struct _GLFWlibrary     _GLFWlibrary;
typedef struct _GLFWmonitor     _GLFWmonitor;
typedef struct _GLFWcursor      _GLFWcursor;
73
74
typedef struct _GLFWmapelement  _GLFWmapelement;
typedef struct _GLFWmapping     _GLFWmapping;
75
typedef struct _GLFWjoystick    _GLFWjoystick;
Camilla Löwy's avatar
Camilla Löwy committed
76
typedef struct _GLFWtls         _GLFWtls;
77
typedef struct _GLFWmutex       _GLFWmutex;
78
typedef struct _GLFWusercontext _GLFWusercontext;
Camilla Berglund's avatar
Camilla Berglund committed
79

80
81
82
83
84
85
86
typedef void (* _GLFWmakecontextcurrentfun)(_GLFWwindow*);
typedef void (* _GLFWswapbuffersfun)(_GLFWwindow*);
typedef void (* _GLFWswapintervalfun)(int);
typedef int (* _GLFWextensionsupportedfun)(const char*);
typedef GLFWglproc (* _GLFWgetprocaddressfun)(const char*);
typedef void (* _GLFWdestroycontextfun)(_GLFWwindow*);

87
#define GL_VERSION 0x1f02
Luflosi's avatar
Luflosi committed
88
89
#define GL_NONE 0
#define GL_COLOR_BUFFER_BIT 0x00004000
Camilla Berglund's avatar
Camilla Berglund committed
90
#define GL_UNSIGNED_BYTE 0x1401
91
92
93
94
95
96
97
98
99
100
101
102
103
#define GL_EXTENSIONS 0x1f03
#define GL_NUM_EXTENSIONS 0x821d
#define GL_CONTEXT_FLAGS 0x821e
#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001
#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002
#define GL_CONTEXT_PROFILE_MASK 0x9126
#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002
#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001
#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256
#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252
#define GL_NO_RESET_NOTIFICATION_ARB 0x8261
#define GL_CONTEXT_RELEASE_BEHAVIOR 0x82fb
#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82fc
104
#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008
105

Luflosi's avatar
Luflosi committed
106
typedef int GLint;
107
108
109
110
typedef unsigned int GLuint;
typedef unsigned int GLenum;
typedef unsigned int GLbitfield;
typedef unsigned char GLubyte;
Camilla Berglund's avatar
Camilla Berglund committed
111

112
113
114
typedef void (APIENTRY * PFNGLCLEARPROC)(GLbitfield);
typedef const GLubyte* (APIENTRY * PFNGLGETSTRINGPROC)(GLenum);
typedef void (APIENTRY * PFNGLGETINTEGERVPROC)(GLenum,GLint*);
115
typedef const GLubyte* (APIENTRY * PFNGLGETSTRINGIPROC)(GLenum,GLuint);
116

Camilla Berglund's avatar
Camilla Berglund committed
117
#define VK_NULL_HANDLE 0
Camilla Berglund's avatar
Camilla Berglund committed
118

119
120
typedef void* VkInstance;
typedef void* VkPhysicalDevice;
121
typedef uint64_t VkSurfaceKHR;
122
123
typedef uint32_t VkFlags;
typedef uint32_t VkBool32;
Camilla Berglund's avatar
Camilla Berglund committed
124
125
126
127
128
129
130

typedef enum VkStructureType
{
    VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR = 1000004000,
    VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR = 1000005000,
    VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR = 1000006000,
    VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR = 1000009000,
131
    VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK = 1000123000,
132
    VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT = 1000217000,
Camilla Berglund's avatar
Camilla Berglund committed
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
    VK_STRUCTURE_TYPE_MAX_ENUM = 0x7FFFFFFF
} VkStructureType;

typedef enum VkResult
{
    VK_SUCCESS = 0,
    VK_NOT_READY = 1,
    VK_TIMEOUT = 2,
    VK_EVENT_SET = 3,
    VK_EVENT_RESET = 4,
    VK_INCOMPLETE = 5,
    VK_ERROR_OUT_OF_HOST_MEMORY = -1,
    VK_ERROR_OUT_OF_DEVICE_MEMORY = -2,
    VK_ERROR_INITIALIZATION_FAILED = -3,
    VK_ERROR_DEVICE_LOST = -4,
    VK_ERROR_MEMORY_MAP_FAILED = -5,
    VK_ERROR_LAYER_NOT_PRESENT = -6,
    VK_ERROR_EXTENSION_NOT_PRESENT = -7,
    VK_ERROR_FEATURE_NOT_PRESENT = -8,
    VK_ERROR_INCOMPATIBLE_DRIVER = -9,
    VK_ERROR_TOO_MANY_OBJECTS = -10,
    VK_ERROR_FORMAT_NOT_SUPPORTED = -11,
    VK_ERROR_SURFACE_LOST_KHR = -1000000000,
    VK_SUBOPTIMAL_KHR = 1000001003,
    VK_ERROR_OUT_OF_DATE_KHR = -1000001004,
    VK_ERROR_INCOMPATIBLE_DISPLAY_KHR = -1000003001,
    VK_ERROR_NATIVE_WINDOW_IN_USE_KHR = -1000000001,
    VK_ERROR_VALIDATION_FAILED_EXT = -1000011001,
    VK_RESULT_MAX_ENUM = 0x7FFFFFFF
} VkResult;

typedef struct VkAllocationCallbacks VkAllocationCallbacks;

typedef struct VkExtensionProperties
{
    char            extensionName[256];
169
    uint32_t        specVersion;
Camilla Berglund's avatar
Camilla Berglund committed
170
171
172
173
} VkExtensionProperties;

typedef void (APIENTRY * PFN_vkVoidFunction)(void);

174
175
176
177
178
179
180
181
182
#if defined(_GLFW_VULKAN_STATIC)
  PFN_vkVoidFunction vkGetInstanceProcAddr(VkInstance,const char*);
  VkResult vkEnumerateInstanceExtensionProperties(const char*,uint32_t*,VkExtensionProperties*);
#else
  typedef PFN_vkVoidFunction (APIENTRY * PFN_vkGetInstanceProcAddr)(VkInstance,const char*);
  typedef VkResult (APIENTRY * PFN_vkEnumerateInstanceExtensionProperties)(const char*,uint32_t*,VkExtensionProperties*);
  #define vkEnumerateInstanceExtensionProperties _glfw.vk.EnumerateInstanceExtensionProperties
  #define vkGetInstanceProcAddr _glfw.vk.GetInstanceProcAddr
#endif
183

Camilla Berglund's avatar
Camilla Berglund committed
184
185
186
187
188
189
#if defined(_GLFW_COCOA)
 #include "cocoa_platform.h"
#elif defined(_GLFW_WIN32)
 #include "win32_platform.h"
#elif defined(_GLFW_X11)
 #include "x11_platform.h"
190
#elif defined(_GLFW_WAYLAND)
191
 #include "wl_platform.h"
Jason Daly's avatar
Jason Daly committed
192
#elif defined(_GLFW_OSMESA)
193
 #include "null_platform.h"
Camilla Berglund's avatar
Camilla Berglund committed
194
195
196
197
#else
 #error "No supported window creation API selected"
#endif

198
199
200
201
202
203
204
// Constructs a version number string from the public header macros
#define _GLFW_CONCAT_VERSION(m, n, r) #m "." #n "." #r
#define _GLFW_MAKE_VERSION(m, n, r) _GLFW_CONCAT_VERSION(m, n, r)
#define _GLFW_VERSION_NUMBER _GLFW_MAKE_VERSION(GLFW_VERSION_MAJOR, \
                                                GLFW_VERSION_MINOR, \
                                                GLFW_VERSION_REVISION)

205
// Checks for whether the library has been initialized
206
#define _GLFW_REQUIRE_INIT()                         \
207
    if (!_glfw.initialized)                          \
208
209
210
211
212
    {                                                \
        _glfwInputError(GLFW_NOT_INITIALIZED, NULL); \
        return;                                      \
    }
#define _GLFW_REQUIRE_INIT_OR_RETURN(x)              \
213
    if (!_glfw.initialized)                          \
214
215
216
217
218
    {                                                \
        _glfwInputError(GLFW_NOT_INITIALIZED, NULL); \
        return x;                                    \
    }

219
220
221
222
223
224
225
226
227
// Swaps the provided pointers
#define _GLFW_SWAP_POINTERS(x, y) \
    {                             \
        void* t;                  \
        t = x;                    \
        x = y;                    \
        y = t;                    \
    }

228
229
// Per-thread error structure
//
230
231
232
233
struct _GLFWerror
{
    _GLFWerror*     next;
    int             code;
234
    char            description[_GLFW_MESSAGE_SIZE];
235
236
};

237
238
239
240
// Initialization configuration
//
// Parameters relating to the initialization of the library
//
Camilla Löwy's avatar
Camilla Löwy committed
241
242
struct _GLFWinitconfig
{
Camilla Löwy's avatar
Camilla Löwy committed
243
    GLFWbool      hatButtons;
Camilla Löwy's avatar
Camilla Löwy committed
244
245
246
247
248
249
    struct {
        GLFWbool  menubar;
        GLFWbool  chdir;
    } ns;
};

250
251
252
253
254
255
// Window configuration
//
// Parameters relating to the creation of the window but not directly related
// to the framebuffer.  This is used to pass window creation parameters from
// shared code to the platform API.
//
Camilla Berglund's avatar
Camilla Berglund committed
256
struct _GLFWwndconfig
257
{
258
259
    int           width;
    int           height;
Camilla Berglund's avatar
Camilla Berglund committed
260
    const char*   title;
261
262
263
264
265
266
    GLFWbool      resizable;
    GLFWbool      visible;
    GLFWbool      decorated;
    GLFWbool      focused;
    GLFWbool      autoIconify;
    GLFWbool      floating;
267
    GLFWbool      maximized;
Liam Middlebrook's avatar
Liam Middlebrook committed
268
    GLFWbool      centerCursor;
269
    GLFWbool      focusOnShow;
Camilla Löwy's avatar
Camilla Löwy committed
270
    GLFWbool      scaleToMonitor;
271
272
    struct {
        GLFWbool  retina;
273
        char      frameName[256];
274
    } ns;
275
276
277
278
    struct {
        char      className[256];
        char      instanceName[256];
    } x11;
279
280
};

281
282
283
284
285
286
// Context configuration
//
// Parameters relating to the creation of the context but not directly related
// to the framebuffer.  This is used to pass context creation parameters from
// shared code to the platform API.
//
287
288
struct _GLFWctxconfig
{
289
290
    int           client;
    int           source;
291
292
    int           major;
    int           minor;
293
294
    GLFWbool      forward;
    GLFWbool      debug;
295
    GLFWbool      noerror;
296
297
    int           profile;
    int           robustness;
298
    int           release;
Camilla Berglund's avatar
Camilla Berglund committed
299
    _GLFWwindow*  share;
300
301
302
    struct {
        GLFWbool  offline;
    } nsgl;
Camilla Berglund's avatar
Camilla Berglund committed
303
};
Camilla Berglund's avatar
Camilla Berglund committed
304

305
306
307
308
309
310
311
312
// Framebuffer configuration
//
// This describes buffers and their sizes.  It also contains
// a platform-specific ID used to map back to the backend API object.
//
// It is used to pass framebuffer parameters from shared code to the platform
// API and also to enumerate and select available framebuffer configs.
//
Camilla Berglund's avatar
Camilla Berglund committed
313
struct _GLFWfbconfig
314
{
Camilla Berglund's avatar
Camilla Berglund committed
315
316
317
318
319
320
321
322
323
324
325
    int         redBits;
    int         greenBits;
    int         blueBits;
    int         alphaBits;
    int         depthBits;
    int         stencilBits;
    int         accumRedBits;
    int         accumGreenBits;
    int         accumBlueBits;
    int         accumAlphaBits;
    int         auxBuffers;
Camilla Berglund's avatar
Camilla Berglund committed
326
    GLFWbool    stereo;
Camilla Berglund's avatar
Camilla Berglund committed
327
    int         samples;
Camilla Berglund's avatar
Camilla Berglund committed
328
329
    GLFWbool    sRGB;
    GLFWbool    doublebuffer;
Bailey Cosier's avatar
Cleanup    
Bailey Cosier committed
330
    GLFWbool    transparent;
Camilla Berglund's avatar
Cleanup    
Camilla Berglund committed
331
    uintptr_t   handle;
Camilla Berglund's avatar
Camilla Berglund committed
332
};
Camilla Berglund's avatar
Camilla Berglund committed
333

334
335
// Context structure
//
336
337
struct _GLFWcontext
{
338
339
    int                 client;
    int                 source;
340
341
342
343
344
345
346
347
348
349
    int                 major, minor, revision;
    GLFWbool            forward, debug, noerror;
    int                 profile;
    int                 robustness;
    int                 release;

    PFNGLGETSTRINGIPROC GetStringi;
    PFNGLGETINTEGERVPROC GetIntegerv;
    PFNGLGETSTRINGPROC  GetString;

Camilla Berglund's avatar
Cleanup    
Camilla Berglund committed
350
    _GLFWmakecontextcurrentfun  makeCurrent;
351
352
353
354
    _GLFWswapbuffersfun         swapBuffers;
    _GLFWswapintervalfun        swapInterval;
    _GLFWextensionsupportedfun  extensionSupported;
    _GLFWgetprocaddressfun      getProcAddress;
Camilla Berglund's avatar
Cleanup    
Camilla Berglund committed
355
    _GLFWdestroycontextfun      destroy;
356

357
358
    // This is defined in the context API's context.h
    _GLFW_PLATFORM_CONTEXT_STATE;
359
360
    // This is defined in egl_context.h
    _GLFW_EGL_CONTEXT_STATE;
Camilla Löwy's avatar
Camilla Löwy committed
361
362
    // This is defined in osmesa_context.h
    _GLFW_OSMESA_CONTEXT_STATE;
363
364
};

365
366
// Window and context structure
//
Camilla Berglund's avatar
Camilla Berglund committed
367
struct _GLFWwindow
368
{
369
370
    struct _GLFWwindow* next;

371
    // Window settings and state
372
373
374
375
    GLFWbool            resizable;
    GLFWbool            decorated;
    GLFWbool            autoIconify;
    GLFWbool            floating;
376
    GLFWbool            focusOnShow;
Camilla Löwy's avatar
Cleanup    
Camilla Löwy committed
377
    GLFWbool            shouldClose;
Camilla Berglund's avatar
Camilla Berglund committed
378
    void*               userPointer;
379
    GLFWvidmode         videoMode;
Camilla Berglund's avatar
Camilla Berglund committed
380
    _GLFWmonitor*       monitor;
381
    _GLFWcursor*        cursor;
382

Camilla Berglund's avatar
Camilla Berglund committed
383
384
385
386
    int                 minwidth, minheight;
    int                 maxwidth, maxheight;
    int                 numer, denom;

387
388
    GLFWbool            stickyKeys;
    GLFWbool            stickyMouseButtons;
389
    GLFWbool            lockKeyMods;
Camilla Berglund's avatar
Camilla Berglund committed
390
    int                 cursorMode;
391
392
    char                mouseButtons[GLFW_MOUSE_BUTTON_LAST + 1];
    char                keys[GLFW_KEY_LAST + 1];
393
394
    // Virtual cursor position when cursor is disabled
    double              virtualCursorPosX, virtualCursorPosY;
395
    GLFWbool            rawMouseMotion;
396

397
    _GLFWcontext        context;
398

399
    struct {
400
401
402
403
404
405
        GLFWwindowposfun        pos;
        GLFWwindowsizefun       size;
        GLFWwindowclosefun      close;
        GLFWwindowrefreshfun    refresh;
        GLFWwindowfocusfun      focus;
        GLFWwindowiconifyfun    iconify;
406
        GLFWwindowmaximizefun   maximize;
407
        GLFWframebuffersizefun  fbsize;
408
        GLFWwindowcontentscalefun scale;
409
410
411
412
413
414
        GLFWmousebuttonfun      mouseButton;
        GLFWcursorposfun        cursorPos;
        GLFWcursorenterfun      cursorEnter;
        GLFWscrollfun           scroll;
        GLFWkeyfun              key;
        GLFWcharfun             character;
415
        GLFWcharmodsfun         charmods;
arturo's avatar
arturo committed
416
        GLFWdropfun             drop;
417
    } callbacks;
418

419
    // This is defined in the window API's platform.h
420
    _GLFW_PLATFORM_WINDOW_STATE;
Camilla Berglund's avatar
Camilla Berglund committed
421
};
422

423
424
// Monitor structure
//
425
struct _GLFWmonitor
426
{
Camilla Berglund's avatar
Camilla Berglund committed
427
    char*           name;
428
    void*           userPointer;
429

Camilla Berglund's avatar
Camilla Berglund committed
430
431
    // Physical dimensions in millimeters.
    int             widthMM, heightMM;
432

433
434
435
    // The window whose video mode is current on this monitor
    _GLFWwindow*    window;

Camilla Berglund's avatar
Camilla Berglund committed
436
437
    GLFWvidmode*    modes;
    int             modeCount;
438
    GLFWvidmode     currentMode;
439

440
    GLFWgammaramp   originalRamp;
Camilla Berglund's avatar
Camilla Berglund committed
441
    GLFWgammaramp   currentRamp;
442

443
    // This is defined in the window API's platform.h
444
    _GLFW_PLATFORM_MONITOR_STATE;
445
446
};

447
448
// Cursor structure
//
449
450
451
452
453
454
455
456
struct _GLFWcursor
{
    _GLFWcursor*    next;

    // This is defined in the window API's platform.h
    _GLFW_PLATFORM_CURSOR_STATE;
};

457
458
// Gamepad mapping element structure
//
459
460
461
struct _GLFWmapelement
{
    uint8_t         type;
Camilla Löwy's avatar
Cleanup    
Camilla Löwy committed
462
    uint8_t         index;
463
464
    int8_t          axisScale;
    int8_t          axisOffset;
465
466
};

467
468
// Gamepad mapping structure
//
469
470
471
472
473
474
475
476
struct _GLFWmapping
{
    char            name[128];
    char            guid[33];
    _GLFWmapelement buttons[15];
    _GLFWmapelement axes[6];
};

477
478
// Joystick structure
//
479
480
481
482
483
484
485
struct _GLFWjoystick
{
    GLFWbool        present;
    float*          axes;
    int             axisCount;
    unsigned char*  buttons;
    int             buttonCount;
Camilla Löwy's avatar
Camilla Löwy committed
486
487
    unsigned char*  hats;
    int             hatCount;
488
    char*           name;
489
    void*           userPointer;
490
491
    char            guid[33];
    _GLFWmapping*   mapping;
492
493
494
495
496

    // This is defined in the joystick API's joystick.h
    _GLFW_PLATFORM_JOYSTICK_STATE;
};

497
498
// Thread local storage structure
//
Camilla Löwy's avatar
Camilla Löwy committed
499
500
struct _GLFWtls
{
Camilla Löwy's avatar
Camilla Löwy committed
501
    // This is defined in the platform's thread.h
Camilla Löwy's avatar
Camilla Löwy committed
502
503
504
    _GLFW_PLATFORM_TLS_STATE;
};

505
506
// Mutex structure
//
507
508
struct _GLFWmutex
{
Camilla Löwy's avatar
Camilla Löwy committed
509
    // This is defined in the platform's thread.h
510
511
512
    _GLFW_PLATFORM_MUTEX_STATE;
};

513
514
// Library global data
//
Camilla Berglund's avatar
Camilla Berglund committed
515
struct _GLFWlibrary
516
{
517
518
    GLFWbool            initialized;

519
    struct {
Camilla Löwy's avatar
Camilla Löwy committed
520
        _GLFWinitconfig init;
Camilla Berglund's avatar
Camilla Berglund committed
521
522
523
524
        _GLFWfbconfig   framebuffer;
        _GLFWwndconfig  window;
        _GLFWctxconfig  context;
        int             refreshRate;
525
    } hints;
526

527
    _GLFWerror*         errorListHead;
Camilla Berglund's avatar
Camilla Berglund committed
528
529
    _GLFWcursor*        cursorListHead;
    _GLFWwindow*        windowListHead;
Camilla Berglund's avatar
Camilla Berglund committed
530

Camilla Berglund's avatar
Camilla Berglund committed
531
532
    _GLFWmonitor**      monitors;
    int                 monitorCount;
533

534
    _GLFWjoystick       joysticks[GLFW_JOYSTICK_LAST + 1];
535
536
    _GLFWmapping*       mappings;
    int                 mappingCount;
537

538
539
540
    _GLFWtls            errorSlot;
    _GLFWtls            contextSlot;
    _GLFWmutex          errorLock;
Camilla Löwy's avatar
Camilla Löwy committed
541

Camilla Löwy's avatar
Cleanup    
Camilla Löwy committed
542
543
544
545
546
547
    struct {
        uint64_t        offset;
        // This is defined in the platform's time.h
        _GLFW_PLATFORM_LIBRARY_TIMER_STATE;
    } timer;

Camilla Berglund's avatar
Camilla Berglund committed
548
549
550
    struct {
        GLFWbool        available;
        void*           handle;
551
        char*           extensions[2];
Camilla Berglund's avatar
Cleanup    
Camilla Berglund committed
552
553
554
555
#if !defined(_GLFW_VULKAN_STATIC)
        PFN_vkEnumerateInstanceExtensionProperties EnumerateInstanceExtensionProperties;
        PFN_vkGetInstanceProcAddr GetInstanceProcAddr;
#endif
Camilla Berglund's avatar
Camilla Berglund committed
556
        GLFWbool        KHR_surface;
557
#if defined(_GLFW_WIN32)
Camilla Berglund's avatar
Camilla Berglund committed
558
        GLFWbool        KHR_win32_surface;
559
560
#elif defined(_GLFW_COCOA)
        GLFWbool        MVK_macos_surface;
561
        GLFWbool        EXT_metal_surface;
562
#elif defined(_GLFW_X11)
Camilla Berglund's avatar
Camilla Berglund committed
563
564
        GLFWbool        KHR_xlib_surface;
        GLFWbool        KHR_xcb_surface;
565
#elif defined(_GLFW_WAYLAND)
Camilla Berglund's avatar
Camilla Berglund committed
566
        GLFWbool        KHR_wayland_surface;
567
#endif
Camilla Berglund's avatar
Camilla Berglund committed
568
569
    } vk;

570
571
    struct {
        GLFWmonitorfun  monitor;
Camilla Berglund's avatar
Camilla Berglund committed
572
        GLFWjoystickfun joystick;
573
    } callbacks;
574

575
    // This is defined in the window API's platform.h
576
    _GLFW_PLATFORM_LIBRARY_WINDOW_STATE;
577
    // This is defined in the context API's context.h
578
    _GLFW_PLATFORM_LIBRARY_CONTEXT_STATE;
579
580
    // This is defined in the platform's joystick.h
    _GLFW_PLATFORM_LIBRARY_JOYSTICK_STATE;
581
582
    // This is defined in egl_context.h
    _GLFW_EGL_LIBRARY_CONTEXT_STATE;
Camilla Löwy's avatar
Camilla Löwy committed
583
584
    // This is defined in osmesa_context.h
    _GLFW_OSMESA_LIBRARY_CONTEXT_STATE;
Camilla Berglund's avatar
Camilla Berglund committed
585
};
586

Camilla Berglund's avatar
Camilla Berglund committed
587
// Global state shared between compilation units of GLFW
588
//
589
extern _GLFWlibrary _glfw;
590

Camilla Berglund's avatar
Camilla Berglund committed
591

592
593
594
//////////////////////////////////////////////////////////////////////////
//////                       GLFW platform API                      //////
//////////////////////////////////////////////////////////////////////////
595

596
int _glfwPlatformInit(void);
597
void _glfwPlatformTerminate(void);
Camilla Berglund's avatar
Camilla Berglund committed
598
const char* _glfwPlatformGetVersionString(void);
599

600
void _glfwPlatformGetCursorPos(_GLFWwindow* window, double* xpos, double* ypos);
601
void _glfwPlatformSetCursorPos(_GLFWwindow* window, double xpos, double ypos);
602
void _glfwPlatformSetCursorMode(_GLFWwindow* window, int mode);
603
604
void _glfwPlatformSetRawMouseMotion(_GLFWwindow *window, GLFWbool enabled);
GLFWbool _glfwPlatformRawMouseMotionSupported(void);
Camilla Löwy's avatar
Camilla Löwy committed
605
606
int _glfwPlatformCreateCursor(_GLFWcursor* cursor,
                              const GLFWimage* image, int xhot, int yhot);
607
608
609
int _glfwPlatformCreateStandardCursor(_GLFWcursor* cursor, int shape);
void _glfwPlatformDestroyCursor(_GLFWcursor* cursor);
void _glfwPlatformSetCursor(_GLFWwindow* window, _GLFWcursor* cursor);
Camilla Berglund's avatar
Camilla Berglund committed
610

Camilla Löwy's avatar
Cleanup    
Camilla Löwy committed
611
const char* _glfwPlatformGetScancodeName(int scancode);
Camilla Berglund's avatar
Cleanup    
Camilla Berglund committed
612
int _glfwPlatformGetKeyScancode(int key);
Michael Stocker's avatar
Michael Stocker committed
613

614
void _glfwPlatformFreeMonitor(_GLFWmonitor* monitor);
615
void _glfwPlatformGetMonitorPos(_GLFWmonitor* monitor, int* xpos, int* ypos);
Camilla Löwy's avatar
Camilla Löwy committed
616
617
void _glfwPlatformGetMonitorContentScale(_GLFWmonitor* monitor,
                                         float* xscale, float* yscale);
618
void _glfwPlatformGetMonitorWorkarea(_GLFWmonitor* monitor, int* xpos, int* ypos, int *width, int *height);
619
GLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* count);
620
void _glfwPlatformGetVideoMode(_GLFWmonitor* monitor, GLFWvidmode* mode);
621
GLFWbool _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp);
622
void _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor, const GLFWgammaramp* ramp);
623

624
625
void _glfwPlatformSetClipboardString(const char* string);
const char* _glfwPlatformGetClipboardString(void);
Ralph Eastwood's avatar
Ralph Eastwood committed
626

Camilla Löwy's avatar
Cleanup    
Camilla Löwy committed
627
int _glfwPlatformPollJoystick(_GLFWjoystick* js, int mode);
628
void _glfwPlatformUpdateGamepadGUID(char* guid);
Camilla Berglund's avatar
Camilla Berglund committed
629

630
631
uint64_t _glfwPlatformGetTimerValue(void);
uint64_t _glfwPlatformGetTimerFrequency(void);
Camilla Berglund's avatar
Camilla Berglund committed
632

633
634
int _glfwPlatformCreateWindow(_GLFWwindow* window,
                              const _GLFWwndconfig* wndconfig,
635
                              const _GLFWctxconfig* ctxconfig,
636
                              const _GLFWfbconfig* fbconfig);
637
void _glfwPlatformDestroyWindow(_GLFWwindow* window);
638
void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title);
Camilla Löwy's avatar
Camilla Löwy committed
639
640
void _glfwPlatformSetWindowIcon(_GLFWwindow* window,
                                int count, const GLFWimage* images);
641
642
void _glfwPlatformGetWindowPos(_GLFWwindow* window, int* xpos, int* ypos);
void _glfwPlatformSetWindowPos(_GLFWwindow* window, int xpos, int ypos);
643
void _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height);
644
void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height);
Camilla Löwy's avatar
Camilla Löwy committed
645
646
647
void _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window,
                                      int minwidth, int minheight,
                                      int maxwidth, int maxheight);
648
void _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window, int numer, int denom);
649
void _glfwPlatformGetFramebufferSize(_GLFWwindow* window, int* width, int* height);
Camilla Löwy's avatar
Camilla Löwy committed
650
651
652
653
654
void _glfwPlatformGetWindowFrameSize(_GLFWwindow* window,
                                     int* left, int* top,
                                     int* right, int* bottom);
void _glfwPlatformGetWindowContentScale(_GLFWwindow* window,
                                        float* xscale, float* yscale);
655
656
void _glfwPlatformIconifyWindow(_GLFWwindow* window);
void _glfwPlatformRestoreWindow(_GLFWwindow* window);
657
void _glfwPlatformMaximizeWindow(_GLFWwindow* window);
658
659
void _glfwPlatformShowWindow(_GLFWwindow* window);
void _glfwPlatformHideWindow(_GLFWwindow* window);
Camilla Löwy's avatar
Cleanup    
Camilla Löwy committed
660
void _glfwPlatformRequestWindowAttention(_GLFWwindow* window);
Camilla Berglund's avatar
Camilla Berglund committed
661
void _glfwPlatformFocusWindow(_GLFWwindow* window);
Camilla Löwy's avatar
Camilla Löwy committed
662
663
664
void _glfwPlatformSetWindowMonitor(_GLFWwindow* window, _GLFWmonitor* monitor,
                                   int xpos, int ypos, int width, int height,
                                   int refreshRate);
665
666
667
int _glfwPlatformWindowFocused(_GLFWwindow* window);
int _glfwPlatformWindowIconified(_GLFWwindow* window);
int _glfwPlatformWindowVisible(_GLFWwindow* window);
668
int _glfwPlatformWindowMaximized(_GLFWwindow* window);
669
int _glfwPlatformWindowHovered(_GLFWwindow* window);
670
int _glfwPlatformFramebufferTransparent(_GLFWwindow* window);
671
float _glfwPlatformGetWindowOpacity(_GLFWwindow* window);
Camilla Löwy's avatar
Camilla Löwy committed
672
673
674
void _glfwPlatformSetWindowResizable(_GLFWwindow* window, GLFWbool enabled);
void _glfwPlatformSetWindowDecorated(_GLFWwindow* window, GLFWbool enabled);
void _glfwPlatformSetWindowFloating(_GLFWwindow* window, GLFWbool enabled);
675
void _glfwPlatformSetWindowOpacity(_GLFWwindow* window, float opacity);
Camilla Löwy's avatar
Camilla Löwy committed
676

677
678
void _glfwPlatformPollEvents(void);
void _glfwPlatformWaitEvents(void);
Camilla Berglund's avatar
Camilla Berglund committed
679
void _glfwPlatformWaitEventsTimeout(double timeout);
Camilla Berglund's avatar
Camilla Berglund committed
680
681
void _glfwPlatformPostEmptyEvent(void);

682
683
684
685
686
_GLFWusercontext* _glfwPlatformCreateUserContext(_GLFWwindow* window);
void _glfwPlatformDestroyUserContext(_GLFWusercontext* context);
void _glfwPlatformMakeUserContextCurrent(_GLFWusercontext* context);


687
void _glfwPlatformGetRequiredInstanceExtensions(char** extensions);
Camilla Löwy's avatar
Camilla Löwy committed
688
689
690
691
692
693
694
int _glfwPlatformGetPhysicalDevicePresentationSupport(VkInstance instance,
                                                      VkPhysicalDevice device,
                                                      uint32_t queuefamily);
VkResult _glfwPlatformCreateWindowSurface(VkInstance instance,
                                          _GLFWwindow* window,
                                          const VkAllocationCallbacks* allocator,
                                          VkSurfaceKHR* surface);
Camilla Berglund's avatar
Camilla Berglund committed
695

Camilla Löwy's avatar
Camilla Löwy committed
696
697
698
699
GLFWbool _glfwPlatformCreateTls(_GLFWtls* tls);
void _glfwPlatformDestroyTls(_GLFWtls* tls);
void* _glfwPlatformGetTls(_GLFWtls* tls);
void _glfwPlatformSetTls(_GLFWtls* tls, void* value);
700
701
702
703
704

GLFWbool _glfwPlatformCreateMutex(_GLFWmutex* mutex);
void _glfwPlatformDestroyMutex(_GLFWmutex* mutex);
void _glfwPlatformLockMutex(_GLFWmutex* mutex);
void _glfwPlatformUnlockMutex(_GLFWmutex* mutex);
Camilla Löwy's avatar
Camilla Löwy committed
705

706

707
708
709
//////////////////////////////////////////////////////////////////////////
//////                         GLFW event API                       //////
//////////////////////////////////////////////////////////////////////////
Camilla Berglund's avatar
Camilla Berglund committed
710

711
void _glfwInputWindowFocus(_GLFWwindow* window, GLFWbool focused);
Camilla Berglund's avatar
Camilla Berglund committed
712
void _glfwInputWindowPos(_GLFWwindow* window, int xpos, int ypos);
713
void _glfwInputWindowSize(_GLFWwindow* window, int width, int height);
714
void _glfwInputFramebufferSize(_GLFWwindow* window, int width, int height);
Camilla Löwy's avatar
Camilla Löwy committed
715
716
void _glfwInputWindowContentScale(_GLFWwindow* window,
                                  float xscale, float yscale);
Camilla Berglund's avatar
Camilla Berglund committed
717
void _glfwInputWindowIconify(_GLFWwindow* window, GLFWbool iconified);
718
void _glfwInputWindowMaximize(_GLFWwindow* window, GLFWbool maximized);
719
void _glfwInputWindowDamage(_GLFWwindow* window);
720
void _glfwInputWindowCloseRequest(_GLFWwindow* window);
Camilla Löwy's avatar
Cleanup    
Camilla Löwy committed
721
void _glfwInputWindowMonitor(_GLFWwindow* window, _GLFWmonitor* monitor);
Camilla Berglund's avatar
Camilla Berglund committed
722

Camilla Löwy's avatar
Camilla Löwy committed
723
724
725
726
void _glfwInputKey(_GLFWwindow* window,
                   int key, int scancode, int action, int mods);
void _glfwInputChar(_GLFWwindow* window,
                    unsigned int codepoint, int mods, GLFWbool plain);
Camilla Berglund's avatar
Cleanup    
Camilla Berglund committed
727
void _glfwInputScroll(_GLFWwindow* window, double xoffset, double yoffset);
728
void _glfwInputMouseClick(_GLFWwindow* window, int button, int action, int mods);
Camilla Berglund's avatar
Cleanup    
Camilla Berglund committed
729
void _glfwInputCursorPos(_GLFWwindow* window, double xpos, double ypos);
Camilla Berglund's avatar
Camilla Berglund committed
730
void _glfwInputCursorEnter(_GLFWwindow* window, GLFWbool entered);
731
732
733
734
735
void _glfwInputDrop(_GLFWwindow* window, int count, const char** names);
void _glfwInputJoystick(_GLFWjoystick* js, int event);
void _glfwInputJoystickAxis(_GLFWjoystick* js, int axis, float value);
void _glfwInputJoystickButton(_GLFWjoystick* js, int button, char value);
void _glfwInputJoystickHat(_GLFWjoystick* js, int hat, char value);
Camilla Berglund's avatar
Camilla Berglund committed
736

Camilla Löwy's avatar
Cleanup    
Camilla Löwy committed
737
738
void _glfwInputMonitor(_GLFWmonitor* monitor, int action, int placement);
void _glfwInputMonitorWindow(_GLFWmonitor* monitor, _GLFWwindow* window);
739

740
#if defined(__GNUC__)
Camilla Löwy's avatar
Camilla Löwy committed
741
742
void _glfwInputError(int code, const char* format, ...)
    __attribute__((format(printf, 2, 3)));
743
#else
744
void _glfwInputError(int code, const char* format, ...);
745
#endif
746

747

748
749
750
//////////////////////////////////////////////////////////////////////////
//////                       GLFW internal API                      //////
//////////////////////////////////////////////////////////////////////////
751

Camilla Berglund's avatar
Camilla Berglund committed
752
GLFWbool _glfwStringInExtensionString(const char* string, const char* extensions);
753
754
755
const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired,
                                         const _GLFWfbconfig* alternatives,
                                         unsigned int count);
756
757
GLFWbool _glfwRefreshContextAttribs(_GLFWwindow* window,
                                    const _GLFWctxconfig* ctxconfig);
758
GLFWbool _glfwIsValidContextConfig(const _GLFWctxconfig* ctxconfig);
759

760
761
762
const GLFWvidmode* _glfwChooseVideoMode(_GLFWmonitor* monitor,
                                        const GLFWvidmode* desired);
int _glfwCompareVideoModes(const GLFWvidmode* first, const GLFWvidmode* second);
763
764
_GLFWmonitor* _glfwAllocMonitor(const char* name, int widthMM, int heightMM);
void _glfwFreeMonitor(_GLFWmonitor* monitor);
765
766
767
void _glfwAllocGammaArrays(GLFWgammaramp* ramp, unsigned int size);
void _glfwFreeGammaArrays(GLFWgammaramp* ramp);
void _glfwSplitBPP(int bpp, int* red, int* green, int* blue);
768

769
770
771
772
773
_GLFWjoystick* _glfwAllocJoystick(const char* name,
                                  const char* guid,
                                  int axisCount,
                                  int buttonCount,
                                  int hatCount);
774
void _glfwFreeJoystick(_GLFWjoystick* js);
Camilla Löwy's avatar
Cleanup    
Camilla Löwy committed
775
void _glfwCenterCursorInContentArea(_GLFWwindow* window);
776

777
GLFWbool _glfwInitVulkan(int mode);
Camilla Berglund's avatar
Camilla Berglund committed
778
779
780
void _glfwTerminateVulkan(void);
const char* _glfwGetVulkanResultString(VkResult result);

781
char* _glfw_strdup(const char* source);
782
783
float _glfw_fminf(float a, float b);
float _glfw_fmaxf(float a, float b);
784