mirror of
https://github.com/glfw/glfw.git
synced 2026-09-17 22:32:50 +00:00
372e908682
Inclusion of internal headers is already both centralized and follows strict rules. Inclusion guards are both an unneccessary maintenance burden and may hide inclusion order bugs.
960 lines
34 KiB
C
960 lines
34 KiB
C
//========================================================================
|
|
// GLFW 3.3 - www.glfw.org
|
|
//------------------------------------------------------------------------
|
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
|
// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>
|
|
//
|
|
// 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.
|
|
//
|
|
//========================================================================
|
|
|
|
#if defined(_GLFW_USE_CONFIG_H)
|
|
#include "glfw_config.h"
|
|
#endif
|
|
|
|
#if defined(GLFW_INCLUDE_GLCOREARB) || \
|
|
defined(GLFW_INCLUDE_ES1) || \
|
|
defined(GLFW_INCLUDE_ES2) || \
|
|
defined(GLFW_INCLUDE_ES3) || \
|
|
defined(GLFW_INCLUDE_ES31) || \
|
|
defined(GLFW_INCLUDE_ES32) || \
|
|
defined(GLFW_INCLUDE_NONE) || \
|
|
defined(GLFW_INCLUDE_GLEXT) || \
|
|
defined(GLFW_INCLUDE_GLU) || \
|
|
defined(GLFW_INCLUDE_VULKAN) || \
|
|
defined(GLFW_DLL)
|
|
#error "You must not define any header option macros when compiling GLFW"
|
|
#endif
|
|
|
|
#define GLFW_INCLUDE_NONE
|
|
#include "../include/GLFW/glfw3.h"
|
|
|
|
#define _GLFW_INSERT_FIRST 0
|
|
#define _GLFW_INSERT_LAST 1
|
|
|
|
#define _GLFW_POLL_PRESENCE 0
|
|
#define _GLFW_POLL_AXES 1
|
|
#define _GLFW_POLL_BUTTONS 2
|
|
|
|
typedef int GLFWbool;
|
|
|
|
typedef struct _GLFWinitconfig _GLFWinitconfig;
|
|
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;
|
|
typedef struct _GLFWjoystick _GLFWjoystick;
|
|
typedef struct _GLFWtls _GLFWtls;
|
|
|
|
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*);
|
|
|
|
#define GL_VERSION 0x1f02
|
|
#define GL_NONE 0
|
|
#define GL_COLOR_BUFFER_BIT 0x00004000
|
|
#define GL_UNSIGNED_BYTE 0x1401
|
|
#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
|
|
#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008
|
|
|
|
typedef int GLint;
|
|
typedef unsigned int GLuint;
|
|
typedef unsigned int GLenum;
|
|
typedef unsigned int GLbitfield;
|
|
typedef unsigned char GLubyte;
|
|
|
|
typedef void (APIENTRY * PFNGLCLEARPROC)(GLbitfield);
|
|
typedef const GLubyte* (APIENTRY * PFNGLGETSTRINGPROC)(GLenum);
|
|
typedef void (APIENTRY * PFNGLGETINTEGERVPROC)(GLenum,GLint*);
|
|
typedef const GLubyte* (APIENTRY * PFNGLGETSTRINGIPROC)(GLenum,GLuint);
|
|
|
|
#define VK_NULL_HANDLE 0
|
|
|
|
typedef void* VkInstance;
|
|
typedef void* VkPhysicalDevice;
|
|
typedef uint64_t VkSurfaceKHR;
|
|
typedef uint32_t VkFlags;
|
|
typedef uint32_t VkBool32;
|
|
|
|
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_MIR_SURFACE_CREATE_INFO_KHR = 1000007000,
|
|
VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR = 1000009000,
|
|
VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK = 1000053000,
|
|
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];
|
|
uint32_t specVersion;
|
|
} VkExtensionProperties;
|
|
|
|
typedef void (APIENTRY * PFN_vkVoidFunction)(void);
|
|
|
|
#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
|
|
|
|
#if defined(_GLFW_COCOA)
|
|
#include "cocoa_platform.h"
|
|
#elif defined(_GLFW_WIN32)
|
|
#include "win32_platform.h"
|
|
#elif defined(_GLFW_X11)
|
|
#include "x11_platform.h"
|
|
#elif defined(_GLFW_WAYLAND)
|
|
#include "wl_platform.h"
|
|
#elif defined(_GLFW_MIR)
|
|
#include "mir_platform.h"
|
|
#elif defined(_GLFW_OSMESA)
|
|
#include "null_platform.h"
|
|
#else
|
|
#error "No supported window creation API selected"
|
|
#endif
|
|
|
|
|
|
//========================================================================
|
|
// Doxygen group definitions
|
|
//========================================================================
|
|
|
|
/*! @defgroup platform Platform interface
|
|
* @brief The interface implemented by the platform-specific code.
|
|
*
|
|
* The platform API is the interface exposed by the platform-specific code for
|
|
* each platform and is called by the shared code of the public API It mirrors
|
|
* the public API except it uses objects instead of handles.
|
|
*/
|
|
/*! @defgroup event Event interface
|
|
* @brief The interface used by the platform-specific code to report events.
|
|
*
|
|
* The event API is used by the platform-specific code to notify the shared
|
|
* code of events that can be translated into state changes and/or callback
|
|
* calls.
|
|
*/
|
|
/*! @defgroup utility Utility functions
|
|
* @brief Various utility functions for internal use.
|
|
*
|
|
* These functions are shared code and may be used by any part of GLFW
|
|
* Each platform may add its own utility functions, but those must only be
|
|
* called by the platform-specific code
|
|
*/
|
|
|
|
|
|
//========================================================================
|
|
// Helper macros
|
|
//========================================================================
|
|
|
|
// 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)
|
|
|
|
// Checks for whether the library has been initialized
|
|
#define _GLFW_REQUIRE_INIT() \
|
|
if (!_glfw.initialized) \
|
|
{ \
|
|
_glfwInputError(GLFW_NOT_INITIALIZED, NULL); \
|
|
return; \
|
|
}
|
|
#define _GLFW_REQUIRE_INIT_OR_RETURN(x) \
|
|
if (!_glfw.initialized) \
|
|
{ \
|
|
_glfwInputError(GLFW_NOT_INITIALIZED, NULL); \
|
|
return x; \
|
|
}
|
|
|
|
// Swaps the provided pointers
|
|
#define _GLFW_SWAP_POINTERS(x, y) \
|
|
{ \
|
|
void* t; \
|
|
t = x; \
|
|
x = y; \
|
|
y = t; \
|
|
}
|
|
|
|
// Maps a joystick pointer to an ID
|
|
#define _GLFW_JOYSTICK_ID(js) ((int) ((js) - _glfw.joysticks))
|
|
|
|
|
|
//========================================================================
|
|
// Platform-independent structures
|
|
//========================================================================
|
|
|
|
/*! @brief Initialization configuration.
|
|
*
|
|
* Parameters relating to the initialization of the library.
|
|
*/
|
|
struct _GLFWinitconfig
|
|
{
|
|
GLFWbool hatButtons;
|
|
struct {
|
|
GLFWbool menubar;
|
|
GLFWbool chdir;
|
|
} ns;
|
|
};
|
|
|
|
/*! @brief 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.
|
|
*/
|
|
struct _GLFWwndconfig
|
|
{
|
|
int width;
|
|
int height;
|
|
const char* title;
|
|
GLFWbool resizable;
|
|
GLFWbool visible;
|
|
GLFWbool decorated;
|
|
GLFWbool focused;
|
|
GLFWbool autoIconify;
|
|
GLFWbool floating;
|
|
GLFWbool maximized;
|
|
GLFWbool centerCursor;
|
|
struct {
|
|
GLFWbool retina;
|
|
GLFWbool frame;
|
|
} ns;
|
|
};
|
|
|
|
/*! @brief 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.
|
|
*/
|
|
struct _GLFWctxconfig
|
|
{
|
|
int client;
|
|
int source;
|
|
int major;
|
|
int minor;
|
|
GLFWbool forward;
|
|
GLFWbool debug;
|
|
GLFWbool noerror;
|
|
int profile;
|
|
int robustness;
|
|
int release;
|
|
_GLFWwindow* share;
|
|
struct {
|
|
GLFWbool offline;
|
|
} nsgl;
|
|
};
|
|
|
|
/*! @brief 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.
|
|
*/
|
|
struct _GLFWfbconfig
|
|
{
|
|
int redBits;
|
|
int greenBits;
|
|
int blueBits;
|
|
int alphaBits;
|
|
int depthBits;
|
|
int stencilBits;
|
|
int accumRedBits;
|
|
int accumGreenBits;
|
|
int accumBlueBits;
|
|
int accumAlphaBits;
|
|
int auxBuffers;
|
|
GLFWbool stereo;
|
|
int samples;
|
|
GLFWbool sRGB;
|
|
GLFWbool doublebuffer;
|
|
uintptr_t handle;
|
|
};
|
|
|
|
/*! @brief Context structure.
|
|
*/
|
|
struct _GLFWcontext
|
|
{
|
|
int client;
|
|
int source;
|
|
int major, minor, revision;
|
|
GLFWbool forward, debug, noerror;
|
|
int profile;
|
|
int robustness;
|
|
int release;
|
|
|
|
PFNGLGETSTRINGIPROC GetStringi;
|
|
PFNGLGETINTEGERVPROC GetIntegerv;
|
|
PFNGLGETSTRINGPROC GetString;
|
|
|
|
_GLFWmakecontextcurrentfun makeCurrent;
|
|
_GLFWswapbuffersfun swapBuffers;
|
|
_GLFWswapintervalfun swapInterval;
|
|
_GLFWextensionsupportedfun extensionSupported;
|
|
_GLFWgetprocaddressfun getProcAddress;
|
|
_GLFWdestroycontextfun destroy;
|
|
|
|
// This is defined in the context API's context.h
|
|
_GLFW_PLATFORM_CONTEXT_STATE;
|
|
// This is defined in egl_context.h
|
|
_GLFW_EGL_CONTEXT_STATE;
|
|
// This is defined in osmesa_context.h
|
|
_GLFW_OSMESA_CONTEXT_STATE;
|
|
};
|
|
|
|
/*! @brief Window and context structure.
|
|
*/
|
|
struct _GLFWwindow
|
|
{
|
|
struct _GLFWwindow* next;
|
|
|
|
// Window settings and state
|
|
GLFWbool resizable;
|
|
GLFWbool decorated;
|
|
GLFWbool autoIconify;
|
|
GLFWbool floating;
|
|
GLFWbool shouldClose;
|
|
void* userPointer;
|
|
GLFWvidmode videoMode;
|
|
_GLFWmonitor* monitor;
|
|
_GLFWcursor* cursor;
|
|
|
|
int minwidth, minheight;
|
|
int maxwidth, maxheight;
|
|
int numer, denom;
|
|
|
|
GLFWbool stickyKeys;
|
|
GLFWbool stickyMouseButtons;
|
|
int cursorMode;
|
|
char mouseButtons[GLFW_MOUSE_BUTTON_LAST + 1];
|
|
char keys[GLFW_KEY_LAST + 1];
|
|
// Virtual cursor position when cursor is disabled
|
|
double virtualCursorPosX, virtualCursorPosY;
|
|
|
|
_GLFWcontext context;
|
|
|
|
struct {
|
|
GLFWwindowposfun pos;
|
|
GLFWwindowsizefun size;
|
|
GLFWwindowclosefun close;
|
|
GLFWwindowrefreshfun refresh;
|
|
GLFWwindowfocusfun focus;
|
|
GLFWwindowiconifyfun iconify;
|
|
GLFWwindowmaximizefun maximize;
|
|
GLFWframebuffersizefun fbsize;
|
|
GLFWmousebuttonfun mouseButton;
|
|
GLFWcursorposfun cursorPos;
|
|
GLFWcursorenterfun cursorEnter;
|
|
GLFWscrollfun scroll;
|
|
GLFWkeyfun key;
|
|
GLFWcharfun character;
|
|
GLFWcharmodsfun charmods;
|
|
GLFWdropfun drop;
|
|
} callbacks;
|
|
|
|
// This is defined in the window API's platform.h
|
|
_GLFW_PLATFORM_WINDOW_STATE;
|
|
};
|
|
|
|
/*! @brief Monitor structure.
|
|
*/
|
|
struct _GLFWmonitor
|
|
{
|
|
char* name;
|
|
|
|
// Physical dimensions in millimeters.
|
|
int widthMM, heightMM;
|
|
|
|
// The window whose video mode is current on this monitor
|
|
_GLFWwindow* window;
|
|
|
|
GLFWvidmode* modes;
|
|
int modeCount;
|
|
GLFWvidmode currentMode;
|
|
|
|
GLFWgammaramp originalRamp;
|
|
GLFWgammaramp currentRamp;
|
|
|
|
// This is defined in the window API's platform.h
|
|
_GLFW_PLATFORM_MONITOR_STATE;
|
|
};
|
|
|
|
/*! @brief Cursor structure
|
|
*/
|
|
struct _GLFWcursor
|
|
{
|
|
_GLFWcursor* next;
|
|
|
|
// This is defined in the window API's platform.h
|
|
_GLFW_PLATFORM_CURSOR_STATE;
|
|
};
|
|
|
|
/*! @brief Joystick structure
|
|
*/
|
|
struct _GLFWjoystick
|
|
{
|
|
GLFWbool present;
|
|
float* axes;
|
|
int axisCount;
|
|
unsigned char* buttons;
|
|
int buttonCount;
|
|
unsigned char* hats;
|
|
int hatCount;
|
|
char* name;
|
|
|
|
// This is defined in the joystick API's joystick.h
|
|
_GLFW_PLATFORM_JOYSTICK_STATE;
|
|
};
|
|
|
|
/*! @brief Thread local storage structure.
|
|
*/
|
|
struct _GLFWtls
|
|
{
|
|
// This is defined in the platform's tls.h
|
|
_GLFW_PLATFORM_TLS_STATE;
|
|
};
|
|
|
|
/*! @brief Library global data.
|
|
*/
|
|
struct _GLFWlibrary
|
|
{
|
|
GLFWbool initialized;
|
|
|
|
struct {
|
|
_GLFWinitconfig init;
|
|
_GLFWfbconfig framebuffer;
|
|
_GLFWwndconfig window;
|
|
_GLFWctxconfig context;
|
|
int refreshRate;
|
|
} hints;
|
|
|
|
_GLFWcursor* cursorListHead;
|
|
|
|
_GLFWwindow* windowListHead;
|
|
|
|
_GLFWmonitor** monitors;
|
|
int monitorCount;
|
|
|
|
_GLFWjoystick joysticks[GLFW_JOYSTICK_LAST + 1];
|
|
|
|
_GLFWtls error;
|
|
_GLFWtls context;
|
|
|
|
struct {
|
|
uint64_t offset;
|
|
// This is defined in the platform's time.h
|
|
_GLFW_PLATFORM_LIBRARY_TIMER_STATE;
|
|
} timer;
|
|
|
|
struct {
|
|
GLFWbool available;
|
|
void* handle;
|
|
char* extensions[2];
|
|
#if !defined(_GLFW_VULKAN_STATIC)
|
|
PFN_vkEnumerateInstanceExtensionProperties EnumerateInstanceExtensionProperties;
|
|
PFN_vkGetInstanceProcAddr GetInstanceProcAddr;
|
|
#endif
|
|
GLFWbool KHR_surface;
|
|
#if defined(_GLFW_WIN32)
|
|
GLFWbool KHR_win32_surface;
|
|
#elif defined(_GLFW_COCOA)
|
|
GLFWbool MVK_macos_surface;
|
|
#elif defined(_GLFW_X11)
|
|
GLFWbool KHR_xlib_surface;
|
|
GLFWbool KHR_xcb_surface;
|
|
#elif defined(_GLFW_WAYLAND)
|
|
GLFWbool KHR_wayland_surface;
|
|
#elif defined(_GLFW_MIR)
|
|
GLFWbool KHR_mir_surface;
|
|
#endif
|
|
} vk;
|
|
|
|
struct {
|
|
GLFWmonitorfun monitor;
|
|
GLFWjoystickfun joystick;
|
|
} callbacks;
|
|
|
|
// This is defined in the window API's platform.h
|
|
_GLFW_PLATFORM_LIBRARY_WINDOW_STATE;
|
|
// This is defined in the context API's context.h
|
|
_GLFW_PLATFORM_LIBRARY_CONTEXT_STATE;
|
|
// This is defined in the platform's joystick.h
|
|
_GLFW_PLATFORM_LIBRARY_JOYSTICK_STATE;
|
|
// This is defined in egl_context.h
|
|
_GLFW_EGL_LIBRARY_CONTEXT_STATE;
|
|
// This is defined in osmesa_context.h
|
|
_GLFW_OSMESA_LIBRARY_CONTEXT_STATE;
|
|
};
|
|
|
|
|
|
//========================================================================
|
|
// Global state shared between compilation units of GLFW
|
|
//========================================================================
|
|
|
|
/*! @brief All global data shared between compilation units.
|
|
*/
|
|
extern _GLFWlibrary _glfw;
|
|
|
|
|
|
//========================================================================
|
|
// Platform API functions
|
|
//========================================================================
|
|
|
|
/*! @addtogroup platform @{ */
|
|
|
|
int _glfwPlatformInit(void);
|
|
void _glfwPlatformTerminate(void);
|
|
const char* _glfwPlatformGetVersionString(void);
|
|
|
|
void _glfwPlatformGetCursorPos(_GLFWwindow* window, double* xpos, double* ypos);
|
|
void _glfwPlatformSetCursorPos(_GLFWwindow* window, double xpos, double ypos);
|
|
void _glfwPlatformSetCursorMode(_GLFWwindow* window, int mode);
|
|
int _glfwPlatformCreateCursor(_GLFWcursor* cursor, const GLFWimage* image, int xhot, int yhot);
|
|
int _glfwPlatformCreateStandardCursor(_GLFWcursor* cursor, int shape);
|
|
void _glfwPlatformDestroyCursor(_GLFWcursor* cursor);
|
|
void _glfwPlatformSetCursor(_GLFWwindow* window, _GLFWcursor* cursor);
|
|
|
|
const char* _glfwPlatformGetKeyName(int key, int scancode);
|
|
int _glfwPlatformGetKeyScancode(int key);
|
|
|
|
void _glfwPlatformGetMonitorPos(_GLFWmonitor* monitor, int* xpos, int* ypos);
|
|
GLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* count);
|
|
void _glfwPlatformGetVideoMode(_GLFWmonitor* monitor, GLFWvidmode* mode);
|
|
void _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp);
|
|
void _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor, const GLFWgammaramp* ramp);
|
|
|
|
void _glfwPlatformSetClipboardString(_GLFWwindow* window, const char* string);
|
|
const char* _glfwPlatformGetClipboardString(_GLFWwindow* window);
|
|
|
|
int _glfwPlatformPollJoystick(int jid, int mode);
|
|
|
|
uint64_t _glfwPlatformGetTimerValue(void);
|
|
uint64_t _glfwPlatformGetTimerFrequency(void);
|
|
|
|
int _glfwPlatformCreateWindow(_GLFWwindow* window,
|
|
const _GLFWwndconfig* wndconfig,
|
|
const _GLFWctxconfig* ctxconfig,
|
|
const _GLFWfbconfig* fbconfig);
|
|
void _glfwPlatformDestroyWindow(_GLFWwindow* window);
|
|
void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title);
|
|
void _glfwPlatformSetWindowIcon(_GLFWwindow* window, int count, const GLFWimage* images);
|
|
void _glfwPlatformGetWindowPos(_GLFWwindow* window, int* xpos, int* ypos);
|
|
void _glfwPlatformSetWindowPos(_GLFWwindow* window, int xpos, int ypos);
|
|
void _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height);
|
|
void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height);
|
|
void _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window, int minwidth, int minheight, int maxwidth, int maxheight);
|
|
void _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window, int numer, int denom);
|
|
void _glfwPlatformGetFramebufferSize(_GLFWwindow* window, int* width, int* height);
|
|
void _glfwPlatformGetWindowFrameSize(_GLFWwindow* window, int* left, int* top, int* right, int* bottom);
|
|
void _glfwPlatformIconifyWindow(_GLFWwindow* window);
|
|
void _glfwPlatformRestoreWindow(_GLFWwindow* window);
|
|
void _glfwPlatformMaximizeWindow(_GLFWwindow* window);
|
|
void _glfwPlatformShowWindow(_GLFWwindow* window);
|
|
void _glfwPlatformHideWindow(_GLFWwindow* window);
|
|
void _glfwPlatformRequestWindowAttention(_GLFWwindow* window);
|
|
void _glfwPlatformFocusWindow(_GLFWwindow* window);
|
|
void _glfwPlatformSetWindowMonitor(_GLFWwindow* window, _GLFWmonitor* monitor, int xpos, int ypos, int width, int height, int refreshRate);
|
|
int _glfwPlatformWindowFocused(_GLFWwindow* window);
|
|
int _glfwPlatformWindowIconified(_GLFWwindow* window);
|
|
int _glfwPlatformWindowVisible(_GLFWwindow* window);
|
|
int _glfwPlatformWindowMaximized(_GLFWwindow* window);
|
|
void _glfwPlatformSetWindowResizable(_GLFWwindow* window, GLFWbool enabled);
|
|
void _glfwPlatformSetWindowDecorated(_GLFWwindow* window, GLFWbool enabled);
|
|
void _glfwPlatformSetWindowFloating(_GLFWwindow* window, GLFWbool enabled);
|
|
|
|
void _glfwPlatformPollEvents(void);
|
|
void _glfwPlatformWaitEvents(void);
|
|
void _glfwPlatformWaitEventsTimeout(double timeout);
|
|
void _glfwPlatformPostEmptyEvent(void);
|
|
|
|
void _glfwPlatformGetRequiredInstanceExtensions(char** extensions);
|
|
int _glfwPlatformGetPhysicalDevicePresentationSupport(VkInstance instance, VkPhysicalDevice device, uint32_t queuefamily);
|
|
VkResult _glfwPlatformCreateWindowSurface(VkInstance instance, _GLFWwindow* window, const VkAllocationCallbacks* allocator, VkSurfaceKHR* surface);
|
|
|
|
GLFWbool _glfwPlatformCreateTls(_GLFWtls* tls);
|
|
void _glfwPlatformDestroyTls(_GLFWtls* tls);
|
|
void* _glfwPlatformGetTls(_GLFWtls* tls);
|
|
void _glfwPlatformSetTls(_GLFWtls* tls, void* value);
|
|
GLFWbool _glfwPlatformIsValidTls(_GLFWtls* tls);
|
|
|
|
/*! @} */
|
|
|
|
|
|
//========================================================================
|
|
// Event API functions
|
|
//========================================================================
|
|
|
|
/*! @brief Notifies shared code that a window has lost or received input focus.
|
|
* @param[in] window The window that received the event.
|
|
* @param[in] focused `GLFW_TRUE` if the window received focus, or `GLFW_FALSE`
|
|
* if it lost focus.
|
|
* @ingroup event
|
|
*/
|
|
void _glfwInputWindowFocus(_GLFWwindow* window, GLFWbool focused);
|
|
|
|
/*! @brief Notifies shared code that a window has moved.
|
|
* @param[in] window The window that received the event.
|
|
* @param[in] xpos The new x-coordinate of the client area of the window.
|
|
* @param[in] ypos The new y-coordinate of the client area of the window.
|
|
* @ingroup event
|
|
*/
|
|
void _glfwInputWindowPos(_GLFWwindow* window, int xpos, int ypos);
|
|
|
|
/*! @brief Notifies shared code that a window has been resized.
|
|
* @param[in] window The window that received the event.
|
|
* @param[in] width The new width of the client area of the window.
|
|
* @param[in] height The new height of the client area of the window.
|
|
* @ingroup event
|
|
*/
|
|
void _glfwInputWindowSize(_GLFWwindow* window, int width, int height);
|
|
|
|
/*! @brief Notifies shared code that a window framebuffer has been resized.
|
|
* @param[in] window The window that received the event.
|
|
* @param[in] width The new width, in pixels, of the framebuffer.
|
|
* @param[in] height The new height, in pixels, of the framebuffer.
|
|
* @ingroup event
|
|
*/
|
|
void _glfwInputFramebufferSize(_GLFWwindow* window, int width, int height);
|
|
|
|
/*! @brief Notifies shared code that a window has been iconified or restored.
|
|
* @param[in] window The window that received the event.
|
|
* @param[in] iconified `GLFW_TRUE` if the window was iconified, or
|
|
* `GLFW_FALSE` if it was restored.
|
|
* @ingroup event
|
|
*/
|
|
void _glfwInputWindowIconify(_GLFWwindow* window, GLFWbool iconified);
|
|
|
|
/*! @brief Notifies shared code that a window has been maximized or restored.
|
|
* @param[in] window The window that received the event.
|
|
* @param[in] maximized `GLFW_TRUE` if the window was maximized, or
|
|
* `GLFW_FALSE` if it was restored.
|
|
* @ingroup event
|
|
*/
|
|
void _glfwInputWindowMaximize(_GLFWwindow* window, GLFWbool maximized);
|
|
|
|
/*! @brief Notifies shared code that a window's contents needs updating.
|
|
* @param[in] window The window that received the event.
|
|
*/
|
|
void _glfwInputWindowDamage(_GLFWwindow* window);
|
|
|
|
/*! @brief Notifies shared code that the user wishes to close a window.
|
|
* @param[in] window The window that received the event.
|
|
* @ingroup event
|
|
*/
|
|
void _glfwInputWindowCloseRequest(_GLFWwindow* window);
|
|
|
|
/*! @brief Notifies shared code that a window has changed its desired monitor.
|
|
* @param[in] window The window that received the event.
|
|
* @param[in] monitor The new desired monitor, or `NULL`.
|
|
* @ingroup event
|
|
*/
|
|
void _glfwInputWindowMonitorChange(_GLFWwindow* window, _GLFWmonitor* monitor);
|
|
|
|
/*! @brief Notifies shared code of a physical key event.
|
|
* @param[in] window The window that received the event.
|
|
* @param[in] key The key that was pressed or released.
|
|
* @param[in] scancode The system-specific scan code of the key.
|
|
* @param[in] action @ref GLFW_PRESS or @ref GLFW_RELEASE.
|
|
* @param[in] mods The modifiers pressed when the event was generated.
|
|
* @ingroup event
|
|
*/
|
|
void _glfwInputKey(_GLFWwindow* window, int key, int scancode, int action, int mods);
|
|
|
|
/*! @brief Notifies shared code of a Unicode character input event.
|
|
* @param[in] window The window that received the event.
|
|
* @param[in] codepoint The Unicode code point of the input character.
|
|
* @param[in] mods Bit field describing which modifier keys were held down.
|
|
* @param[in] plain `GLFW_TRUE` if the character is regular text input, or
|
|
* `GLFW_FALSE` otherwise.
|
|
* @ingroup event
|
|
*/
|
|
void _glfwInputChar(_GLFWwindow* window, unsigned int codepoint, int mods, GLFWbool plain);
|
|
|
|
/*! @brief Notifies shared code of a scroll event.
|
|
* @param[in] window The window that received the event.
|
|
* @param[in] xoffset The scroll offset along the x-axis.
|
|
* @param[in] yoffset The scroll offset along the y-axis.
|
|
* @ingroup event
|
|
*/
|
|
void _glfwInputScroll(_GLFWwindow* window, double xoffset, double yoffset);
|
|
|
|
/*! @brief Notifies shared code of a mouse button click event.
|
|
* @param[in] window The window that received the event.
|
|
* @param[in] button The button that was pressed or released.
|
|
* @param[in] action @ref GLFW_PRESS or @ref GLFW_RELEASE.
|
|
* @param[in] mods The modifiers pressed when the event was generated.
|
|
* @ingroup event
|
|
*/
|
|
void _glfwInputMouseClick(_GLFWwindow* window, int button, int action, int mods);
|
|
|
|
/*! @brief Notifies shared code of a cursor motion event.
|
|
* @param[in] window The window that received the event.
|
|
* @param[in] xpos The new x-coordinate of the cursor, relative to the left
|
|
* edge of the client area of the window.
|
|
* @param[in] ypos The new y-coordinate of the cursor, relative to the top edge
|
|
* of the client area of the window.
|
|
* @ingroup event
|
|
*/
|
|
void _glfwInputCursorPos(_GLFWwindow* window, double xpos, double ypos);
|
|
|
|
/*! @brief Notifies shared code of a cursor enter/leave event.
|
|
* @param[in] window The window that received the event.
|
|
* @param[in] entered `GLFW_TRUE` if the cursor entered the client area of the
|
|
* window, or `GLFW_FALSE` if it left it.
|
|
* @ingroup event
|
|
*/
|
|
void _glfwInputCursorEnter(_GLFWwindow* window, GLFWbool entered);
|
|
|
|
/*! @brief Notifies shared code of a monitor connection or disconnection.
|
|
* @param[in] monitor The monitor that was connected or disconnected.
|
|
* @param[in] action One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`.
|
|
* @param[in] placement `_GLFW_INSERT_FIRST` or `_GLFW_INSERT_LAST`.
|
|
* @ingroup event
|
|
*/
|
|
void _glfwInputMonitor(_GLFWmonitor* monitor, int action, int placement);
|
|
|
|
/*! @brief Notifies shared code that a full screen window has acquired or
|
|
* released a monitor.
|
|
* @param[in] monitor The monitor that was acquired or released.
|
|
* @param[in] window The window that acquired the monitor, or `NULL`.
|
|
* @ingroup event
|
|
*/
|
|
void _glfwInputMonitorWindow(_GLFWmonitor* monitor, _GLFWwindow* window);
|
|
|
|
/*! @brief Notifies shared code of an error.
|
|
* @param[in] error The error code most suitable for the error.
|
|
* @param[in] format The `printf` style format string of the error
|
|
* description.
|
|
* @ingroup event
|
|
*/
|
|
#if defined(__GNUC__)
|
|
void _glfwInputError(int error, const char* format, ...) __attribute__((format(printf, 2, 3)));
|
|
#else
|
|
void _glfwInputError(int error, const char* format, ...);
|
|
#endif
|
|
|
|
/*! @brief Notifies shared code of files or directories dropped on a window.
|
|
* @param[in] window The window that received the event.
|
|
* @param[in] count The number of dropped objects.
|
|
* @param[in] names The names of the dropped objects.
|
|
* @ingroup event
|
|
*/
|
|
void _glfwInputDrop(_GLFWwindow* window, int count, const char** names);
|
|
|
|
/*! @brief Notifies shared code of a joystick connection or disconnection.
|
|
* @param[in] jid The joystick that was connected or disconnected.
|
|
* @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`.
|
|
* @ingroup event
|
|
*/
|
|
void _glfwInputJoystick(int jid, int event);
|
|
|
|
/*! @brief Notifies shared code of the new value of a joystick axis.
|
|
* @param[in] jid The joystick whose axis to update.
|
|
* @param[in] axis The index of the axis to update.
|
|
* @param[in] value The new value of the axis.
|
|
*/
|
|
void _glfwInputJoystickAxis(int jid, int axis, float value);
|
|
|
|
/*! @brief Notifies shared code of the new value of a joystick button.
|
|
* @param[in] jid The joystick whose button to update.
|
|
* @param[in] button The index of the button to update.
|
|
* @param[in] value The new value of the button.
|
|
*/
|
|
void _glfwInputJoystickButton(int jid, int button, char value);
|
|
|
|
/*! @brief Notifies shared code of the new value of a joystick hat.
|
|
* @param[in] jid The joystick whose hat to update.
|
|
* @param[in] button The index of the hat to update.
|
|
* @param[in] value The new value of the hat.
|
|
*/
|
|
void _glfwInputJoystickHat(int jid, int hat, char value);
|
|
|
|
|
|
//========================================================================
|
|
// Utility functions
|
|
//========================================================================
|
|
|
|
/*! @brief Chooses the video mode most closely matching the desired one.
|
|
* @ingroup utility
|
|
*/
|
|
const GLFWvidmode* _glfwChooseVideoMode(_GLFWmonitor* monitor,
|
|
const GLFWvidmode* desired);
|
|
|
|
/*! @brief Performs lexical comparison between two @ref GLFWvidmode structures.
|
|
* @ingroup utility
|
|
*/
|
|
int _glfwCompareVideoModes(const GLFWvidmode* first, const GLFWvidmode* second);
|
|
|
|
/*! @brief Splits a color depth into red, green and blue bit depths.
|
|
* @ingroup utility
|
|
*/
|
|
void _glfwSplitBPP(int bpp, int* red, int* green, int* blue);
|
|
|
|
/*! @brief Searches an extension string for the specified extension.
|
|
* @param[in] string The extension string to search.
|
|
* @param[in] extensions The extension to search for.
|
|
* @return `GLFW_TRUE` if the extension was found, or `GLFW_FALSE` otherwise.
|
|
* @ingroup utility
|
|
*/
|
|
GLFWbool _glfwStringInExtensionString(const char* string, const char* extensions);
|
|
|
|
/*! @brief Chooses the framebuffer config that best matches the desired one.
|
|
* @param[in] desired The desired framebuffer config.
|
|
* @param[in] alternatives The framebuffer configs supported by the system.
|
|
* @param[in] count The number of entries in the alternatives array.
|
|
* @return The framebuffer config most closely matching the desired one, or @c
|
|
* NULL if none fulfilled the hard constraints of the desired values.
|
|
* @ingroup utility
|
|
*/
|
|
const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired,
|
|
const _GLFWfbconfig* alternatives,
|
|
unsigned int count);
|
|
|
|
/*! @brief Retrieves the attributes of the current context.
|
|
* @param[in] ctxconfig The desired context attributes.
|
|
* @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if the context is
|
|
* unusable.
|
|
* @ingroup utility
|
|
*/
|
|
GLFWbool _glfwRefreshContextAttribs(const _GLFWctxconfig* ctxconfig);
|
|
|
|
/*! @brief Checks whether the desired context attributes are valid.
|
|
* @param[in] ctxconfig The context attributes to check.
|
|
* @return `GLFW_TRUE` if the context attributes are valid, or `GLFW_FALSE`
|
|
* otherwise.
|
|
* @ingroup utility
|
|
*
|
|
* This function checks things like whether the specified client API version
|
|
* exists and whether all relevant options have supported and non-conflicting
|
|
* values.
|
|
*/
|
|
GLFWbool _glfwIsValidContextConfig(const _GLFWctxconfig* ctxconfig);
|
|
|
|
/*! @brief Allocates red, green and blue value arrays of the specified size.
|
|
* @ingroup utility
|
|
*/
|
|
void _glfwAllocGammaArrays(GLFWgammaramp* ramp, unsigned int size);
|
|
|
|
/*! @brief Frees the red, green and blue value arrays and clears the struct.
|
|
* @ingroup utility
|
|
*/
|
|
void _glfwFreeGammaArrays(GLFWgammaramp* ramp);
|
|
|
|
/*! @brief Allocates and returns a monitor object with the specified name
|
|
* and dimensions.
|
|
* @param[in] name The name of the monitor.
|
|
* @param[in] widthMM The width, in mm, of the monitor's display area.
|
|
* @param[in] heightMM The height, in mm, of the monitor's display area.
|
|
* @return The newly created object.
|
|
* @ingroup utility
|
|
*/
|
|
_GLFWmonitor* _glfwAllocMonitor(const char* name, int widthMM, int heightMM);
|
|
|
|
/*! @brief Frees a monitor object and any data associated with it.
|
|
* @ingroup utility
|
|
*/
|
|
void _glfwFreeMonitor(_GLFWmonitor* monitor);
|
|
|
|
/*! @brief Returns an available joystick object with arrays and name allocated.
|
|
* @ingroup utility
|
|
*/
|
|
_GLFWjoystick* _glfwAllocJoystick(const char* name, int axisCount, int buttonCount, int hatCount);
|
|
|
|
/*! @brief Frees arrays and name and flags the joystick object as unused.
|
|
* @ingroup utility
|
|
*/
|
|
void _glfwFreeJoystick(_GLFWjoystick* js);
|
|
|
|
/*! @ingroup utility
|
|
*/
|
|
GLFWbool _glfwIsPrintable(int key);
|
|
|
|
/*! @ingroup utility
|
|
*/
|
|
GLFWbool _glfwInitVulkan(int mode);
|
|
|
|
/*! @ingroup utility
|
|
*/
|
|
void _glfwTerminateVulkan(void);
|
|
|
|
/*! @ingroup utility
|
|
*/
|
|
const char* _glfwGetVulkanResultString(VkResult result);
|
|
|