internal.h 27.2 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;
Camilla Berglund's avatar
Camilla Berglund committed
78

79
80
81
82
83
84
85
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*);

86
#define GL_VERSION 0x1f02
Luflosi's avatar
Luflosi committed
87
88
#define GL_NONE 0
#define GL_COLOR_BUFFER_BIT 0x00004000
Camilla Berglund's avatar
Camilla Berglund committed
89
#define GL_UNSIGNED_BYTE 0x1401
90
91
92
93
94
95
96
97
98
99
100
101
102
#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
103
#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008
104

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

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

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

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

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,
130
    VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK = 1000123000,
131
    VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT = 1000217000,
Camilla Berglund's avatar
Camilla Berglund committed
132
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
    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];
168
    uint32_t        specVersion;
Camilla Berglund's avatar
Camilla Berglund committed
169
170
171
172
} VkExtensionProperties;

typedef void (APIENTRY * PFN_vkVoidFunction)(void);

173
174
175
176
177
178
179
180
181
#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
182

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

197
198
199
200
201
202
203
// 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)

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

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

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

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

249
250
251
252
253
254
// 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
255
struct _GLFWwndconfig
256
{
257
258
    int           width;
    int           height;
Camilla Berglund's avatar
Camilla Berglund committed
259
    const char*   title;
260
261
262
263
264
265
    GLFWbool      resizable;
    GLFWbool      visible;
    GLFWbool      decorated;
    GLFWbool      focused;
    GLFWbool      autoIconify;
    GLFWbool      floating;
266
    GLFWbool      maximized;
Liam Middlebrook's avatar
Liam Middlebrook committed
267
    GLFWbool      centerCursor;
268
    GLFWbool      focusOnShow;
Camilla Löwy's avatar
Camilla Löwy committed
269
    GLFWbool      scaleToMonitor;
270
271
    struct {
        GLFWbool  retina;
272
        char      frameName[256];
273
    } ns;
274
275
276
277
    struct {
        char      className[256];
        char      instanceName[256];
    } x11;
278
279
};

280
281
282
283
284
285
// 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.
//
286
287
struct _GLFWctxconfig
{
288
289
    int           client;
    int           source;
290
291
    int           major;
    int           minor;
292
293
    GLFWbool      forward;
    GLFWbool      debug;
294
    GLFWbool      noerror;
295
296
    int           profile;
    int           robustness;
297
    int           release;
Camilla Berglund's avatar
Camilla Berglund committed
298
    _GLFWwindow*  share;
299
300
301
    struct {
        GLFWbool  offline;
    } nsgl;
Camilla Berglund's avatar
Camilla Berglund committed
302
};
Camilla Berglund's avatar
Camilla Berglund committed
303

304
305
306
307
308
309
310
311
// 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
312
struct _GLFWfbconfig
313
{
Camilla Berglund's avatar
Camilla Berglund committed
314
315
316
317
318
319
320
321
322
323
324
    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
325
    GLFWbool    stereo;
Camilla Berglund's avatar
Camilla Berglund committed
326
    int         samples;
Camilla Berglund's avatar
Camilla Berglund committed
327
328
    GLFWbool    sRGB;
    GLFWbool    doublebuffer;
Bailey Cosier's avatar
Cleanup    
Bailey Cosier committed
329
    GLFWbool    transparent;
Camilla Berglund's avatar
Cleanup    
Camilla Berglund committed
330
    uintptr_t   handle;
Camilla Berglund's avatar
Camilla Berglund committed
331
};
Camilla Berglund's avatar
Camilla Berglund committed
332

333
334
// Context structure
//
335
336
struct _GLFWcontext
{
337
338
    int                 client;
    int                 source;
339
340
341
342
343
344
345
346
347
348
    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
349
    _GLFWmakecontextcurrentfun  makeCurrent;
350
351
352
353
    _GLFWswapbuffersfun         swapBuffers;
    _GLFWswapintervalfun        swapInterval;
    _GLFWextensionsupportedfun  extensionSupported;
    _GLFWgetprocaddressfun      getProcAddress;
Camilla Berglund's avatar
Cleanup    
Camilla Berglund committed
354
    _GLFWdestroycontextfun      destroy;
355

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

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

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

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

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

396
    _GLFWcontext        context;
397

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Camilla Löwy's avatar
Cleanup    
Camilla Löwy committed
541
542
543
544
545
546
    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
547
548
549
    struct {
        GLFWbool        available;
        void*           handle;
550
        char*           extensions[2];
Camilla Berglund's avatar
Cleanup    
Camilla Berglund committed
551
552
553
554
#if !defined(_GLFW_VULKAN_STATIC)
        PFN_vkEnumerateInstanceExtensionProperties EnumerateInstanceExtensionProperties;
        PFN_vkGetInstanceProcAddr GetInstanceProcAddr;
#endif
Camilla Berglund's avatar
Camilla Berglund committed
555
        GLFWbool        KHR_surface;
556
#if defined(_GLFW_WIN32)
Camilla Berglund's avatar
Camilla Berglund committed
557
        GLFWbool        KHR_win32_surface;
558
#elif defined(_GLFW_COCOA)
559
    #if defined(VK_USE_PLATFORM_MACOS_MVK)
560
        GLFWbool        MVK_macos_surface;
561
562
563
    #elif defined(VK_USE_PLATFORM_METAL_EXT)
        GLFWbool        EXT_metal_surface;
    #endif
564
#elif defined(_GLFW_X11)
Camilla Berglund's avatar
Camilla Berglund committed
565
566
        GLFWbool        KHR_xlib_surface;
        GLFWbool        KHR_xcb_surface;
567
#elif defined(_GLFW_WAYLAND)
Camilla Berglund's avatar
Camilla Berglund committed
568
        GLFWbool        KHR_wayland_surface;
569
#endif
Camilla Berglund's avatar
Camilla Berglund committed
570
571
    } vk;

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

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

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

Camilla Berglund's avatar
Camilla Berglund committed
593

594
595
596
//////////////////////////////////////////////////////////////////////////
//////                       GLFW platform API                      //////
//////////////////////////////////////////////////////////////////////////
597

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

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

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

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

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

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

632
633
uint64_t _glfwPlatformGetTimerValue(void);
uint64_t _glfwPlatformGetTimerFrequency(void);
Camilla Berglund's avatar
Camilla Berglund committed
634

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

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

684
void _glfwPlatformGetRequiredInstanceExtensions(char** extensions);
Camilla Löwy's avatar
Camilla Löwy committed
685
686
687
688
689
690
691
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
692

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

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
702

703

704
705
706
//////////////////////////////////////////////////////////////////////////
//////                         GLFW event API                       //////
//////////////////////////////////////////////////////////////////////////
Camilla Berglund's avatar
Camilla Berglund committed
707

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

Camilla Löwy's avatar
Camilla Löwy committed
720
721
722
723
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
724
void _glfwInputScroll(_GLFWwindow* window, double xoffset, double yoffset);
725
void _glfwInputMouseClick(_GLFWwindow* window, int button, int action, int mods);
Camilla Berglund's avatar
Cleanup    
Camilla Berglund committed
726
void _glfwInputCursorPos(_GLFWwindow* window, double xpos, double ypos);
Camilla Berglund's avatar
Camilla Berglund committed
727
void _glfwInputCursorEnter(_GLFWwindow* window, GLFWbool entered);
728
729
730
731
732
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
733

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

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

744

745
746
747
//////////////////////////////////////////////////////////////////////////
//////                       GLFW internal API                      //////
//////////////////////////////////////////////////////////////////////////
748

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

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

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

774
GLFWbool _glfwInitVulkan(int mode);
Camilla Berglund's avatar
Camilla Berglund committed
775
776
777
void _glfwTerminateVulkan(void);
const char* _glfwGetVulkanResultString(VkResult result);

778
char* _glfw_strdup(const char* source);
779
780
float _glfw_fminf(float a, float b);
float _glfw_fmaxf(float a, float b);
781