From 3d5fa879700ff978a55792dda4b927c9ee19398d Mon Sep 17 00:00:00 2001 From: silverweed Date: Fri, 26 Jul 2024 13:54:28 +0200 Subject: [PATCH] remove useless GLFW files in third_party --- third_party/GLFW/glfw3.h | 5912 -------------------------------- third_party/GLFW/glfw3.lib | Bin 634898 -> 0 bytes third_party/GLFW/glfw3native.h | 628 ---- 3 files changed, 6540 deletions(-) delete mode 100644 third_party/GLFW/glfw3.h delete mode 100644 third_party/GLFW/glfw3.lib delete mode 100644 third_party/GLFW/glfw3native.h diff --git a/third_party/GLFW/glfw3.h b/third_party/GLFW/glfw3.h deleted file mode 100644 index 31b201a..0000000 --- a/third_party/GLFW/glfw3.h +++ /dev/null @@ -1,5912 +0,0 @@ -/************************************************************************* - * GLFW 3.3 - www.glfw.org - * A library for OpenGL, window and input - *------------------------------------------------------------------------ - * Copyright (c) 2002-2006 Marcus Geelnard - * Copyright (c) 2006-2019 Camilla Löwy - * - * 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. - * - *************************************************************************/ - -#ifndef _glfw3_h_ -#define _glfw3_h_ - -#ifdef __cplusplus -extern "C" { -#endif - - -/************************************************************************* - * Doxygen documentation - *************************************************************************/ - -/*! @file glfw3.h - * @brief The header of the GLFW 3 API. - * - * This is the header file of the GLFW 3 API. It defines all its types and - * declares all its functions. - * - * For more information about how to use this file, see @ref build_include. - */ -/*! @defgroup context Context reference - * @brief Functions and types related to OpenGL and OpenGL ES contexts. - * - * This is the reference documentation for OpenGL and OpenGL ES context related - * functions. For more task-oriented information, see the @ref context_guide. - */ -/*! @defgroup vulkan Vulkan support reference - * @brief Functions and types related to Vulkan. - * - * This is the reference documentation for Vulkan related functions and types. - * For more task-oriented information, see the @ref vulkan_guide. - */ -/*! @defgroup init Initialization, version and error reference - * @brief Functions and types related to initialization and error handling. - * - * This is the reference documentation for initialization and termination of - * the library, version management and error handling. For more task-oriented - * information, see the @ref intro_guide. - */ -/*! @defgroup input Input reference - * @brief Functions and types related to input handling. - * - * This is the reference documentation for input related functions and types. - * For more task-oriented information, see the @ref input_guide. - */ -/*! @defgroup monitor Monitor reference - * @brief Functions and types related to monitors. - * - * This is the reference documentation for monitor related functions and types. - * For more task-oriented information, see the @ref monitor_guide. - */ -/*! @defgroup window Window reference - * @brief Functions and types related to windows. - * - * This is the reference documentation for window related functions and types, - * including creation, deletion and event polling. For more task-oriented - * information, see the @ref window_guide. - */ - - -/************************************************************************* - * Compiler- and platform-specific preprocessor work - *************************************************************************/ - -/* If we are we on Windows, we want a single define for it. - */ -#if !defined(_WIN32) && (defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__)) - #define _WIN32 -#endif /* _WIN32 */ - -/* Include because most Windows GLU headers need wchar_t and - * the macOS OpenGL header blocks the definition of ptrdiff_t by glext.h. - * Include it unconditionally to avoid surprising side-effects. - */ -#include - -/* Include because it is needed by Vulkan and related functions. - * Include it unconditionally to avoid surprising side-effects. - */ -#include - -#if defined(GLFW_INCLUDE_VULKAN) - #include -#endif /* Vulkan header */ - -/* The Vulkan header may have indirectly included windows.h (because of - * VK_USE_PLATFORM_WIN32_KHR) so we offer our replacement symbols after it. - */ - -/* It is customary to use APIENTRY for OpenGL function pointer declarations on - * all platforms. Additionally, the Windows OpenGL header needs APIENTRY. - */ -#if !defined(APIENTRY) - #if defined(_WIN32) - #define APIENTRY __stdcall - #else - #define APIENTRY - #endif - #define GLFW_APIENTRY_DEFINED -#endif /* APIENTRY */ - -/* Some Windows OpenGL headers need this. - */ -#if !defined(WINGDIAPI) && defined(_WIN32) - #define WINGDIAPI __declspec(dllimport) - #define GLFW_WINGDIAPI_DEFINED -#endif /* WINGDIAPI */ - -/* Some Windows GLU headers need this. - */ -#if !defined(CALLBACK) && defined(_WIN32) - #define CALLBACK __stdcall - #define GLFW_CALLBACK_DEFINED -#endif /* CALLBACK */ - -/* Include the chosen OpenGL or OpenGL ES headers. - */ -#if defined(GLFW_INCLUDE_ES1) - - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - -#elif defined(GLFW_INCLUDE_ES2) - - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - -#elif defined(GLFW_INCLUDE_ES3) - - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - -#elif defined(GLFW_INCLUDE_ES31) - - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - -#elif defined(GLFW_INCLUDE_ES32) - - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - -#elif defined(GLFW_INCLUDE_GLCOREARB) - - #if defined(__APPLE__) - - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif /*GLFW_INCLUDE_GLEXT*/ - - #else /*__APPLE__*/ - - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - - #endif /*__APPLE__*/ - -#elif defined(GLFW_INCLUDE_GLU) - - #if defined(__APPLE__) - - #if defined(GLFW_INCLUDE_GLU) - #include - #endif - - #else /*__APPLE__*/ - - #if defined(GLFW_INCLUDE_GLU) - #include - #endif - - #endif /*__APPLE__*/ - -#elif !defined(GLFW_INCLUDE_NONE) && \ - !defined(__gl_h_) && \ - !defined(__gles1_gl_h_) && \ - !defined(__gles2_gl2_h_) && \ - !defined(__gles2_gl3_h_) && \ - !defined(__gles2_gl31_h_) && \ - !defined(__gles2_gl32_h_) && \ - !defined(__gl_glcorearb_h_) && \ - !defined(__gl2_h_) /*legacy*/ && \ - !defined(__gl3_h_) /*legacy*/ && \ - !defined(__gl31_h_) /*legacy*/ && \ - !defined(__gl32_h_) /*legacy*/ && \ - !defined(__glcorearb_h_) /*legacy*/ && \ - !defined(__GL_H__) /*non-standard*/ && \ - !defined(__gltypes_h_) /*non-standard*/ && \ - !defined(__glee_h_) /*non-standard*/ - - #if defined(__APPLE__) - - #if !defined(GLFW_INCLUDE_GLEXT) - #define GL_GLEXT_LEGACY - #endif - #include - - #else /*__APPLE__*/ - - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - - #endif /*__APPLE__*/ - -#endif /* OpenGL and OpenGL ES headers */ - -#if defined(GLFW_DLL) && defined(_GLFW_BUILD_DLL) - /* GLFW_DLL must be defined by applications that are linking against the DLL - * version of the GLFW library. _GLFW_BUILD_DLL is defined by the GLFW - * configuration header when compiling the DLL version of the library. - */ - #error "You must not have both GLFW_DLL and _GLFW_BUILD_DLL defined" -#endif - -/* GLFWAPI is used to declare public API functions for export - * from the DLL / shared library / dynamic library. - */ -#if defined(_WIN32) && defined(_GLFW_BUILD_DLL) - /* We are building GLFW as a Win32 DLL */ - #define GLFWAPI __declspec(dllexport) -#elif defined(_WIN32) && defined(GLFW_DLL) - /* We are calling a GLFW Win32 DLL */ - #define GLFWAPI __declspec(dllimport) -#elif defined(__GNUC__) && defined(_GLFW_BUILD_DLL) - /* We are building GLFW as a Unix shared library */ - #define GLFWAPI __attribute__((visibility("default"))) -#else - #define GLFWAPI -#endif - - -/************************************************************************* - * GLFW API tokens - *************************************************************************/ - -/*! @name GLFW version macros - * @{ */ -/*! @brief The major version number of the GLFW header. - * - * The major version number of the GLFW header. This is incremented when the - * API is changed in non-compatible ways. - * @ingroup init - */ -#define GLFW_VERSION_MAJOR 3 -/*! @brief The minor version number of the GLFW header. - * - * The minor version number of the GLFW header. This is incremented when - * features are added to the API but it remains backward-compatible. - * @ingroup init - */ -#define GLFW_VERSION_MINOR 3 -/*! @brief The revision number of the GLFW header. - * - * The revision number of the GLFW header. This is incremented when a bug fix - * release is made that does not contain any API changes. - * @ingroup init - */ -#define GLFW_VERSION_REVISION 8 -/*! @} */ - -/*! @brief One. - * - * This is only semantic sugar for the number 1. You can instead use `1` or - * `true` or `_True` or `GL_TRUE` or `VK_TRUE` or anything else that is equal - * to one. - * - * @ingroup init - */ -#define GLFW_TRUE 1 -/*! @brief Zero. - * - * This is only semantic sugar for the number 0. You can instead use `0` or - * `false` or `_False` or `GL_FALSE` or `VK_FALSE` or anything else that is - * equal to zero. - * - * @ingroup init - */ -#define GLFW_FALSE 0 - -/*! @name Key and button actions - * @{ */ -/*! @brief The key or mouse button was released. - * - * The key or mouse button was released. - * - * @ingroup input - */ -#define GLFW_RELEASE 0 -/*! @brief The key or mouse button was pressed. - * - * The key or mouse button was pressed. - * - * @ingroup input - */ -#define GLFW_PRESS 1 -/*! @brief The key was held down until it repeated. - * - * The key was held down until it repeated. - * - * @ingroup input - */ -#define GLFW_REPEAT 2 -/*! @} */ - -/*! @defgroup hat_state Joystick hat states - * @brief Joystick hat states. - * - * See [joystick hat input](@ref joystick_hat) for how these are used. - * - * @ingroup input - * @{ */ -#define GLFW_HAT_CENTERED 0 -#define GLFW_HAT_UP 1 -#define GLFW_HAT_RIGHT 2 -#define GLFW_HAT_DOWN 4 -#define GLFW_HAT_LEFT 8 -#define GLFW_HAT_RIGHT_UP (GLFW_HAT_RIGHT | GLFW_HAT_UP) -#define GLFW_HAT_RIGHT_DOWN (GLFW_HAT_RIGHT | GLFW_HAT_DOWN) -#define GLFW_HAT_LEFT_UP (GLFW_HAT_LEFT | GLFW_HAT_UP) -#define GLFW_HAT_LEFT_DOWN (GLFW_HAT_LEFT | GLFW_HAT_DOWN) -/*! @} */ - -/*! @defgroup keys Keyboard keys - * @brief Keyboard key IDs. - * - * See [key input](@ref input_key) for how these are used. - * - * These key codes are inspired by the _USB HID Usage Tables v1.12_ (p. 53-60), - * but re-arranged to map to 7-bit ASCII for printable keys (function keys are - * put in the 256+ range). - * - * The naming of the key codes follow these rules: - * - The US keyboard layout is used - * - Names of printable alpha-numeric characters are used (e.g. "A", "R", - * "3", etc.) - * - For non-alphanumeric characters, Unicode:ish names are used (e.g. - * "COMMA", "LEFT_SQUARE_BRACKET", etc.). Note that some names do not - * correspond to the Unicode standard (usually for brevity) - * - Keys that lack a clear US mapping are named "WORLD_x" - * - For non-printable keys, custom names are used (e.g. "F4", - * "BACKSPACE", etc.) - * - * @ingroup input - * @{ - */ - -/* The unknown key */ -#define GLFW_KEY_UNKNOWN -1 - -/* Printable keys */ -#define GLFW_KEY_SPACE 32 -#define GLFW_KEY_APOSTROPHE 39 /* ' */ -#define GLFW_KEY_COMMA 44 /* , */ -#define GLFW_KEY_MINUS 45 /* - */ -#define GLFW_KEY_PERIOD 46 /* . */ -#define GLFW_KEY_SLASH 47 /* / */ -#define GLFW_KEY_0 48 -#define GLFW_KEY_1 49 -#define GLFW_KEY_2 50 -#define GLFW_KEY_3 51 -#define GLFW_KEY_4 52 -#define GLFW_KEY_5 53 -#define GLFW_KEY_6 54 -#define GLFW_KEY_7 55 -#define GLFW_KEY_8 56 -#define GLFW_KEY_9 57 -#define GLFW_KEY_SEMICOLON 59 /* ; */ -#define GLFW_KEY_EQUAL 61 /* = */ -#define GLFW_KEY_A 65 -#define GLFW_KEY_B 66 -#define GLFW_KEY_C 67 -#define GLFW_KEY_D 68 -#define GLFW_KEY_E 69 -#define GLFW_KEY_F 70 -#define GLFW_KEY_G 71 -#define GLFW_KEY_H 72 -#define GLFW_KEY_I 73 -#define GLFW_KEY_J 74 -#define GLFW_KEY_K 75 -#define GLFW_KEY_L 76 -#define GLFW_KEY_M 77 -#define GLFW_KEY_N 78 -#define GLFW_KEY_O 79 -#define GLFW_KEY_P 80 -#define GLFW_KEY_Q 81 -#define GLFW_KEY_R 82 -#define GLFW_KEY_S 83 -#define GLFW_KEY_T 84 -#define GLFW_KEY_U 85 -#define GLFW_KEY_V 86 -#define GLFW_KEY_W 87 -#define GLFW_KEY_X 88 -#define GLFW_KEY_Y 89 -#define GLFW_KEY_Z 90 -#define GLFW_KEY_LEFT_BRACKET 91 /* [ */ -#define GLFW_KEY_BACKSLASH 92 /* \ */ -#define GLFW_KEY_RIGHT_BRACKET 93 /* ] */ -#define GLFW_KEY_GRAVE_ACCENT 96 /* ` */ -#define GLFW_KEY_WORLD_1 161 /* non-US #1 */ -#define GLFW_KEY_WORLD_2 162 /* non-US #2 */ - -/* Function keys */ -#define GLFW_KEY_ESCAPE 256 -#define GLFW_KEY_ENTER 257 -#define GLFW_KEY_TAB 258 -#define GLFW_KEY_BACKSPACE 259 -#define GLFW_KEY_INSERT 260 -#define GLFW_KEY_DELETE 261 -#define GLFW_KEY_RIGHT 262 -#define GLFW_KEY_LEFT 263 -#define GLFW_KEY_DOWN 264 -#define GLFW_KEY_UP 265 -#define GLFW_KEY_PAGE_UP 266 -#define GLFW_KEY_PAGE_DOWN 267 -#define GLFW_KEY_HOME 268 -#define GLFW_KEY_END 269 -#define GLFW_KEY_CAPS_LOCK 280 -#define GLFW_KEY_SCROLL_LOCK 281 -#define GLFW_KEY_NUM_LOCK 282 -#define GLFW_KEY_PRINT_SCREEN 283 -#define GLFW_KEY_PAUSE 284 -#define GLFW_KEY_F1 290 -#define GLFW_KEY_F2 291 -#define GLFW_KEY_F3 292 -#define GLFW_KEY_F4 293 -#define GLFW_KEY_F5 294 -#define GLFW_KEY_F6 295 -#define GLFW_KEY_F7 296 -#define GLFW_KEY_F8 297 -#define GLFW_KEY_F9 298 -#define GLFW_KEY_F10 299 -#define GLFW_KEY_F11 300 -#define GLFW_KEY_F12 301 -#define GLFW_KEY_F13 302 -#define GLFW_KEY_F14 303 -#define GLFW_KEY_F15 304 -#define GLFW_KEY_F16 305 -#define GLFW_KEY_F17 306 -#define GLFW_KEY_F18 307 -#define GLFW_KEY_F19 308 -#define GLFW_KEY_F20 309 -#define GLFW_KEY_F21 310 -#define GLFW_KEY_F22 311 -#define GLFW_KEY_F23 312 -#define GLFW_KEY_F24 313 -#define GLFW_KEY_F25 314 -#define GLFW_KEY_KP_0 320 -#define GLFW_KEY_KP_1 321 -#define GLFW_KEY_KP_2 322 -#define GLFW_KEY_KP_3 323 -#define GLFW_KEY_KP_4 324 -#define GLFW_KEY_KP_5 325 -#define GLFW_KEY_KP_6 326 -#define GLFW_KEY_KP_7 327 -#define GLFW_KEY_KP_8 328 -#define GLFW_KEY_KP_9 329 -#define GLFW_KEY_KP_DECIMAL 330 -#define GLFW_KEY_KP_DIVIDE 331 -#define GLFW_KEY_KP_MULTIPLY 332 -#define GLFW_KEY_KP_SUBTRACT 333 -#define GLFW_KEY_KP_ADD 334 -#define GLFW_KEY_KP_ENTER 335 -#define GLFW_KEY_KP_EQUAL 336 -#define GLFW_KEY_LEFT_SHIFT 340 -#define GLFW_KEY_LEFT_CONTROL 341 -#define GLFW_KEY_LEFT_ALT 342 -#define GLFW_KEY_LEFT_SUPER 343 -#define GLFW_KEY_RIGHT_SHIFT 344 -#define GLFW_KEY_RIGHT_CONTROL 345 -#define GLFW_KEY_RIGHT_ALT 346 -#define GLFW_KEY_RIGHT_SUPER 347 -#define GLFW_KEY_MENU 348 - -#define GLFW_KEY_LAST GLFW_KEY_MENU - -/*! @} */ - -/*! @defgroup mods Modifier key flags - * @brief Modifier key flags. - * - * See [key input](@ref input_key) for how these are used. - * - * @ingroup input - * @{ */ - -/*! @brief If this bit is set one or more Shift keys were held down. - * - * If this bit is set one or more Shift keys were held down. - */ -#define GLFW_MOD_SHIFT 0x0001 -/*! @brief If this bit is set one or more Control keys were held down. - * - * If this bit is set one or more Control keys were held down. - */ -#define GLFW_MOD_CONTROL 0x0002 -/*! @brief If this bit is set one or more Alt keys were held down. - * - * If this bit is set one or more Alt keys were held down. - */ -#define GLFW_MOD_ALT 0x0004 -/*! @brief If this bit is set one or more Super keys were held down. - * - * If this bit is set one or more Super keys were held down. - */ -#define GLFW_MOD_SUPER 0x0008 -/*! @brief If this bit is set the Caps Lock key is enabled. - * - * If this bit is set the Caps Lock key is enabled and the @ref - * GLFW_LOCK_KEY_MODS input mode is set. - */ -#define GLFW_MOD_CAPS_LOCK 0x0010 -/*! @brief If this bit is set the Num Lock key is enabled. - * - * If this bit is set the Num Lock key is enabled and the @ref - * GLFW_LOCK_KEY_MODS input mode is set. - */ -#define GLFW_MOD_NUM_LOCK 0x0020 - -/*! @} */ - -/*! @defgroup buttons Mouse buttons - * @brief Mouse button IDs. - * - * See [mouse button input](@ref input_mouse_button) for how these are used. - * - * @ingroup input - * @{ */ -#define GLFW_MOUSE_BUTTON_1 0 -#define GLFW_MOUSE_BUTTON_2 1 -#define GLFW_MOUSE_BUTTON_3 2 -#define GLFW_MOUSE_BUTTON_4 3 -#define GLFW_MOUSE_BUTTON_5 4 -#define GLFW_MOUSE_BUTTON_6 5 -#define GLFW_MOUSE_BUTTON_7 6 -#define GLFW_MOUSE_BUTTON_8 7 -#define GLFW_MOUSE_BUTTON_LAST GLFW_MOUSE_BUTTON_8 -#define GLFW_MOUSE_BUTTON_LEFT GLFW_MOUSE_BUTTON_1 -#define GLFW_MOUSE_BUTTON_RIGHT GLFW_MOUSE_BUTTON_2 -#define GLFW_MOUSE_BUTTON_MIDDLE GLFW_MOUSE_BUTTON_3 -/*! @} */ - -/*! @defgroup joysticks Joysticks - * @brief Joystick IDs. - * - * See [joystick input](@ref joystick) for how these are used. - * - * @ingroup input - * @{ */ -#define GLFW_JOYSTICK_1 0 -#define GLFW_JOYSTICK_2 1 -#define GLFW_JOYSTICK_3 2 -#define GLFW_JOYSTICK_4 3 -#define GLFW_JOYSTICK_5 4 -#define GLFW_JOYSTICK_6 5 -#define GLFW_JOYSTICK_7 6 -#define GLFW_JOYSTICK_8 7 -#define GLFW_JOYSTICK_9 8 -#define GLFW_JOYSTICK_10 9 -#define GLFW_JOYSTICK_11 10 -#define GLFW_JOYSTICK_12 11 -#define GLFW_JOYSTICK_13 12 -#define GLFW_JOYSTICK_14 13 -#define GLFW_JOYSTICK_15 14 -#define GLFW_JOYSTICK_16 15 -#define GLFW_JOYSTICK_LAST GLFW_JOYSTICK_16 -/*! @} */ - -/*! @defgroup gamepad_buttons Gamepad buttons - * @brief Gamepad buttons. - * - * See @ref gamepad for how these are used. - * - * @ingroup input - * @{ */ -#define GLFW_GAMEPAD_BUTTON_A 0 -#define GLFW_GAMEPAD_BUTTON_B 1 -#define GLFW_GAMEPAD_BUTTON_X 2 -#define GLFW_GAMEPAD_BUTTON_Y 3 -#define GLFW_GAMEPAD_BUTTON_LEFT_BUMPER 4 -#define GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER 5 -#define GLFW_GAMEPAD_BUTTON_BACK 6 -#define GLFW_GAMEPAD_BUTTON_START 7 -#define GLFW_GAMEPAD_BUTTON_GUIDE 8 -#define GLFW_GAMEPAD_BUTTON_LEFT_THUMB 9 -#define GLFW_GAMEPAD_BUTTON_RIGHT_THUMB 10 -#define GLFW_GAMEPAD_BUTTON_DPAD_UP 11 -#define GLFW_GAMEPAD_BUTTON_DPAD_RIGHT 12 -#define GLFW_GAMEPAD_BUTTON_DPAD_DOWN 13 -#define GLFW_GAMEPAD_BUTTON_DPAD_LEFT 14 -#define GLFW_GAMEPAD_BUTTON_LAST GLFW_GAMEPAD_BUTTON_DPAD_LEFT - -#define GLFW_GAMEPAD_BUTTON_CROSS GLFW_GAMEPAD_BUTTON_A -#define GLFW_GAMEPAD_BUTTON_CIRCLE GLFW_GAMEPAD_BUTTON_B -#define GLFW_GAMEPAD_BUTTON_SQUARE GLFW_GAMEPAD_BUTTON_X -#define GLFW_GAMEPAD_BUTTON_TRIANGLE GLFW_GAMEPAD_BUTTON_Y -/*! @} */ - -/*! @defgroup gamepad_axes Gamepad axes - * @brief Gamepad axes. - * - * See @ref gamepad for how these are used. - * - * @ingroup input - * @{ */ -#define GLFW_GAMEPAD_AXIS_LEFT_X 0 -#define GLFW_GAMEPAD_AXIS_LEFT_Y 1 -#define GLFW_GAMEPAD_AXIS_RIGHT_X 2 -#define GLFW_GAMEPAD_AXIS_RIGHT_Y 3 -#define GLFW_GAMEPAD_AXIS_LEFT_TRIGGER 4 -#define GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER 5 -#define GLFW_GAMEPAD_AXIS_LAST GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER -/*! @} */ - -/*! @defgroup errors Error codes - * @brief Error codes. - * - * See [error handling](@ref error_handling) for how these are used. - * - * @ingroup init - * @{ */ -/*! @brief No error has occurred. - * - * No error has occurred. - * - * @analysis Yay. - */ -#define GLFW_NO_ERROR 0 -/*! @brief GLFW has not been initialized. - * - * This occurs if a GLFW function was called that must not be called unless the - * library is [initialized](@ref intro_init). - * - * @analysis Application programmer error. Initialize GLFW before calling any - * function that requires initialization. - */ -#define GLFW_NOT_INITIALIZED 0x00010001 -/*! @brief No context is current for this thread. - * - * This occurs if a GLFW function was called that needs and operates on the - * current OpenGL or OpenGL ES context but no context is current on the calling - * thread. One such function is @ref glfwSwapInterval. - * - * @analysis Application programmer error. Ensure a context is current before - * calling functions that require a current context. - */ -#define GLFW_NO_CURRENT_CONTEXT 0x00010002 -/*! @brief One of the arguments to the function was an invalid enum value. - * - * One of the arguments to the function was an invalid enum value, for example - * requesting @ref GLFW_RED_BITS with @ref glfwGetWindowAttrib. - * - * @analysis Application programmer error. Fix the offending call. - */ -#define GLFW_INVALID_ENUM 0x00010003 -/*! @brief One of the arguments to the function was an invalid value. - * - * One of the arguments to the function was an invalid value, for example - * requesting a non-existent OpenGL or OpenGL ES version like 2.7. - * - * Requesting a valid but unavailable OpenGL or OpenGL ES version will instead - * result in a @ref GLFW_VERSION_UNAVAILABLE error. - * - * @analysis Application programmer error. Fix the offending call. - */ -#define GLFW_INVALID_VALUE 0x00010004 -/*! @brief A memory allocation failed. - * - * A memory allocation failed. - * - * @analysis A bug in GLFW or the underlying operating system. Report the bug - * to our [issue tracker](https://github.com/glfw/glfw/issues). - */ -#define GLFW_OUT_OF_MEMORY 0x00010005 -/*! @brief GLFW could not find support for the requested API on the system. - * - * GLFW could not find support for the requested API on the system. - * - * @analysis The installed graphics driver does not support the requested - * API, or does not support it via the chosen context creation backend. - * Below are a few examples. - * - * @par - * Some pre-installed Windows graphics drivers do not support OpenGL. AMD only - * supports OpenGL ES via EGL, while Nvidia and Intel only support it via - * a WGL or GLX extension. macOS does not provide OpenGL ES at all. The Mesa - * EGL, OpenGL and OpenGL ES libraries do not interface with the Nvidia binary - * driver. Older graphics drivers do not support Vulkan. - */ -#define GLFW_API_UNAVAILABLE 0x00010006 -/*! @brief The requested OpenGL or OpenGL ES version is not available. - * - * The requested OpenGL or OpenGL ES version (including any requested context - * or framebuffer hints) is not available on this machine. - * - * @analysis The machine does not support your requirements. If your - * application is sufficiently flexible, downgrade your requirements and try - * again. Otherwise, inform the user that their machine does not match your - * requirements. - * - * @par - * Future invalid OpenGL and OpenGL ES versions, for example OpenGL 4.8 if 5.0 - * comes out before the 4.x series gets that far, also fail with this error and - * not @ref GLFW_INVALID_VALUE, because GLFW cannot know what future versions - * will exist. - */ -#define GLFW_VERSION_UNAVAILABLE 0x00010007 -/*! @brief A platform-specific error occurred that does not match any of the - * more specific categories. - * - * A platform-specific error occurred that does not match any of the more - * specific categories. - * - * @analysis A bug or configuration error in GLFW, the underlying operating - * system or its drivers, or a lack of required resources. Report the issue to - * our [issue tracker](https://github.com/glfw/glfw/issues). - */ -#define GLFW_PLATFORM_ERROR 0x00010008 -/*! @brief The requested format is not supported or available. - * - * If emitted during window creation, the requested pixel format is not - * supported. - * - * If emitted when querying the clipboard, the contents of the clipboard could - * not be converted to the requested format. - * - * @analysis If emitted during window creation, one or more - * [hard constraints](@ref window_hints_hard) did not match any of the - * available pixel formats. If your application is sufficiently flexible, - * downgrade your requirements and try again. Otherwise, inform the user that - * their machine does not match your requirements. - * - * @par - * If emitted when querying the clipboard, ignore the error or report it to - * the user, as appropriate. - */ -#define GLFW_FORMAT_UNAVAILABLE 0x00010009 -/*! @brief The specified window does not have an OpenGL or OpenGL ES context. - * - * A window that does not have an OpenGL or OpenGL ES context was passed to - * a function that requires it to have one. - * - * @analysis Application programmer error. Fix the offending call. - */ -#define GLFW_NO_WINDOW_CONTEXT 0x0001000A -/*! @} */ - -/*! @addtogroup window - * @{ */ -/*! @brief Input focus window hint and attribute - * - * Input focus [window hint](@ref GLFW_FOCUSED_hint) or - * [window attribute](@ref GLFW_FOCUSED_attrib). - */ -#define GLFW_FOCUSED 0x00020001 -/*! @brief Window iconification window attribute - * - * Window iconification [window attribute](@ref GLFW_ICONIFIED_attrib). - */ -#define GLFW_ICONIFIED 0x00020002 -/*! @brief Window resize-ability window hint and attribute - * - * Window resize-ability [window hint](@ref GLFW_RESIZABLE_hint) and - * [window attribute](@ref GLFW_RESIZABLE_attrib). - */ -#define GLFW_RESIZABLE 0x00020003 -/*! @brief Window visibility window hint and attribute - * - * Window visibility [window hint](@ref GLFW_VISIBLE_hint) and - * [window attribute](@ref GLFW_VISIBLE_attrib). - */ -#define GLFW_VISIBLE 0x00020004 -/*! @brief Window decoration window hint and attribute - * - * Window decoration [window hint](@ref GLFW_DECORATED_hint) and - * [window attribute](@ref GLFW_DECORATED_attrib). - */ -#define GLFW_DECORATED 0x00020005 -/*! @brief Window auto-iconification window hint and attribute - * - * Window auto-iconification [window hint](@ref GLFW_AUTO_ICONIFY_hint) and - * [window attribute](@ref GLFW_AUTO_ICONIFY_attrib). - */ -#define GLFW_AUTO_ICONIFY 0x00020006 -/*! @brief Window decoration window hint and attribute - * - * Window decoration [window hint](@ref GLFW_FLOATING_hint) and - * [window attribute](@ref GLFW_FLOATING_attrib). - */ -#define GLFW_FLOATING 0x00020007 -/*! @brief Window maximization window hint and attribute - * - * Window maximization [window hint](@ref GLFW_MAXIMIZED_hint) and - * [window attribute](@ref GLFW_MAXIMIZED_attrib). - */ -#define GLFW_MAXIMIZED 0x00020008 -/*! @brief Cursor centering window hint - * - * Cursor centering [window hint](@ref GLFW_CENTER_CURSOR_hint). - */ -#define GLFW_CENTER_CURSOR 0x00020009 -/*! @brief Window framebuffer transparency hint and attribute - * - * Window framebuffer transparency - * [window hint](@ref GLFW_TRANSPARENT_FRAMEBUFFER_hint) and - * [window attribute](@ref GLFW_TRANSPARENT_FRAMEBUFFER_attrib). - */ -#define GLFW_TRANSPARENT_FRAMEBUFFER 0x0002000A -/*! @brief Mouse cursor hover window attribute. - * - * Mouse cursor hover [window attribute](@ref GLFW_HOVERED_attrib). - */ -#define GLFW_HOVERED 0x0002000B -/*! @brief Input focus on calling show window hint and attribute - * - * Input focus [window hint](@ref GLFW_FOCUS_ON_SHOW_hint) or - * [window attribute](@ref GLFW_FOCUS_ON_SHOW_attrib). - */ -#define GLFW_FOCUS_ON_SHOW 0x0002000C - -/*! @brief Framebuffer bit depth hint. - * - * Framebuffer bit depth [hint](@ref GLFW_RED_BITS). - */ -#define GLFW_RED_BITS 0x00021001 -/*! @brief Framebuffer bit depth hint. - * - * Framebuffer bit depth [hint](@ref GLFW_GREEN_BITS). - */ -#define GLFW_GREEN_BITS 0x00021002 -/*! @brief Framebuffer bit depth hint. - * - * Framebuffer bit depth [hint](@ref GLFW_BLUE_BITS). - */ -#define GLFW_BLUE_BITS 0x00021003 -/*! @brief Framebuffer bit depth hint. - * - * Framebuffer bit depth [hint](@ref GLFW_ALPHA_BITS). - */ -#define GLFW_ALPHA_BITS 0x00021004 -/*! @brief Framebuffer bit depth hint. - * - * Framebuffer bit depth [hint](@ref GLFW_DEPTH_BITS). - */ -#define GLFW_DEPTH_BITS 0x00021005 -/*! @brief Framebuffer bit depth hint. - * - * Framebuffer bit depth [hint](@ref GLFW_STENCIL_BITS). - */ -#define GLFW_STENCIL_BITS 0x00021006 -/*! @brief Framebuffer bit depth hint. - * - * Framebuffer bit depth [hint](@ref GLFW_ACCUM_RED_BITS). - */ -#define GLFW_ACCUM_RED_BITS 0x00021007 -/*! @brief Framebuffer bit depth hint. - * - * Framebuffer bit depth [hint](@ref GLFW_ACCUM_GREEN_BITS). - */ -#define GLFW_ACCUM_GREEN_BITS 0x00021008 -/*! @brief Framebuffer bit depth hint. - * - * Framebuffer bit depth [hint](@ref GLFW_ACCUM_BLUE_BITS). - */ -#define GLFW_ACCUM_BLUE_BITS 0x00021009 -/*! @brief Framebuffer bit depth hint. - * - * Framebuffer bit depth [hint](@ref GLFW_ACCUM_ALPHA_BITS). - */ -#define GLFW_ACCUM_ALPHA_BITS 0x0002100A -/*! @brief Framebuffer auxiliary buffer hint. - * - * Framebuffer auxiliary buffer [hint](@ref GLFW_AUX_BUFFERS). - */ -#define GLFW_AUX_BUFFERS 0x0002100B -/*! @brief OpenGL stereoscopic rendering hint. - * - * OpenGL stereoscopic rendering [hint](@ref GLFW_STEREO). - */ -#define GLFW_STEREO 0x0002100C -/*! @brief Framebuffer MSAA samples hint. - * - * Framebuffer MSAA samples [hint](@ref GLFW_SAMPLES). - */ -#define GLFW_SAMPLES 0x0002100D -/*! @brief Framebuffer sRGB hint. - * - * Framebuffer sRGB [hint](@ref GLFW_SRGB_CAPABLE). - */ -#define GLFW_SRGB_CAPABLE 0x0002100E -/*! @brief Monitor refresh rate hint. - * - * Monitor refresh rate [hint](@ref GLFW_REFRESH_RATE). - */ -#define GLFW_REFRESH_RATE 0x0002100F -/*! @brief Framebuffer double buffering hint. - * - * Framebuffer double buffering [hint](@ref GLFW_DOUBLEBUFFER). - */ -#define GLFW_DOUBLEBUFFER 0x00021010 - -/*! @brief Context client API hint and attribute. - * - * Context client API [hint](@ref GLFW_CLIENT_API_hint) and - * [attribute](@ref GLFW_CLIENT_API_attrib). - */ -#define GLFW_CLIENT_API 0x00022001 -/*! @brief Context client API major version hint and attribute. - * - * Context client API major version [hint](@ref GLFW_CONTEXT_VERSION_MAJOR_hint) - * and [attribute](@ref GLFW_CONTEXT_VERSION_MAJOR_attrib). - */ -#define GLFW_CONTEXT_VERSION_MAJOR 0x00022002 -/*! @brief Context client API minor version hint and attribute. - * - * Context client API minor version [hint](@ref GLFW_CONTEXT_VERSION_MINOR_hint) - * and [attribute](@ref GLFW_CONTEXT_VERSION_MINOR_attrib). - */ -#define GLFW_CONTEXT_VERSION_MINOR 0x00022003 -/*! @brief Context client API revision number attribute. - * - * Context client API revision number - * [attribute](@ref GLFW_CONTEXT_REVISION_attrib). - */ -#define GLFW_CONTEXT_REVISION 0x00022004 -/*! @brief Context robustness hint and attribute. - * - * Context client API revision number [hint](@ref GLFW_CONTEXT_ROBUSTNESS_hint) - * and [attribute](@ref GLFW_CONTEXT_ROBUSTNESS_attrib). - */ -#define GLFW_CONTEXT_ROBUSTNESS 0x00022005 -/*! @brief OpenGL forward-compatibility hint and attribute. - * - * OpenGL forward-compatibility [hint](@ref GLFW_OPENGL_FORWARD_COMPAT_hint) - * and [attribute](@ref GLFW_OPENGL_FORWARD_COMPAT_attrib). - */ -#define GLFW_OPENGL_FORWARD_COMPAT 0x00022006 -/*! @brief Debug mode context hint and attribute. - * - * Debug mode context [hint](@ref GLFW_OPENGL_DEBUG_CONTEXT_hint) and - * [attribute](@ref GLFW_OPENGL_DEBUG_CONTEXT_attrib). - */ -#define GLFW_OPENGL_DEBUG_CONTEXT 0x00022007 -/*! @brief OpenGL profile hint and attribute. - * - * OpenGL profile [hint](@ref GLFW_OPENGL_PROFILE_hint) and - * [attribute](@ref GLFW_OPENGL_PROFILE_attrib). - */ -#define GLFW_OPENGL_PROFILE 0x00022008 -/*! @brief Context flush-on-release hint and attribute. - * - * Context flush-on-release [hint](@ref GLFW_CONTEXT_RELEASE_BEHAVIOR_hint) and - * [attribute](@ref GLFW_CONTEXT_RELEASE_BEHAVIOR_attrib). - */ -#define GLFW_CONTEXT_RELEASE_BEHAVIOR 0x00022009 -/*! @brief Context error suppression hint and attribute. - * - * Context error suppression [hint](@ref GLFW_CONTEXT_NO_ERROR_hint) and - * [attribute](@ref GLFW_CONTEXT_NO_ERROR_attrib). - */ -#define GLFW_CONTEXT_NO_ERROR 0x0002200A -/*! @brief Context creation API hint and attribute. - * - * Context creation API [hint](@ref GLFW_CONTEXT_CREATION_API_hint) and - * [attribute](@ref GLFW_CONTEXT_CREATION_API_attrib). - */ -#define GLFW_CONTEXT_CREATION_API 0x0002200B -/*! @brief Window content area scaling window - * [window hint](@ref GLFW_SCALE_TO_MONITOR). - */ -#define GLFW_SCALE_TO_MONITOR 0x0002200C -/*! @brief macOS specific - * [window hint](@ref GLFW_COCOA_RETINA_FRAMEBUFFER_hint). - */ -#define GLFW_COCOA_RETINA_FRAMEBUFFER 0x00023001 -/*! @brief macOS specific - * [window hint](@ref GLFW_COCOA_FRAME_NAME_hint). - */ -#define GLFW_COCOA_FRAME_NAME 0x00023002 -/*! @brief macOS specific - * [window hint](@ref GLFW_COCOA_GRAPHICS_SWITCHING_hint). - */ -#define GLFW_COCOA_GRAPHICS_SWITCHING 0x00023003 -/*! @brief X11 specific - * [window hint](@ref GLFW_X11_CLASS_NAME_hint). - */ -#define GLFW_X11_CLASS_NAME 0x00024001 -/*! @brief X11 specific - * [window hint](@ref GLFW_X11_CLASS_NAME_hint). - */ -#define GLFW_X11_INSTANCE_NAME 0x00024002 -/*! @} */ - -#define GLFW_NO_API 0 -#define GLFW_OPENGL_API 0x00030001 -#define GLFW_OPENGL_ES_API 0x00030002 - -#define GLFW_NO_ROBUSTNESS 0 -#define GLFW_NO_RESET_NOTIFICATION 0x00031001 -#define GLFW_LOSE_CONTEXT_ON_RESET 0x00031002 - -#define GLFW_OPENGL_ANY_PROFILE 0 -#define GLFW_OPENGL_CORE_PROFILE 0x00032001 -#define GLFW_OPENGL_COMPAT_PROFILE 0x00032002 - -#define GLFW_CURSOR 0x00033001 -#define GLFW_STICKY_KEYS 0x00033002 -#define GLFW_STICKY_MOUSE_BUTTONS 0x00033003 -#define GLFW_LOCK_KEY_MODS 0x00033004 -#define GLFW_RAW_MOUSE_MOTION 0x00033005 - -#define GLFW_CURSOR_NORMAL 0x00034001 -#define GLFW_CURSOR_HIDDEN 0x00034002 -#define GLFW_CURSOR_DISABLED 0x00034003 - -#define GLFW_ANY_RELEASE_BEHAVIOR 0 -#define GLFW_RELEASE_BEHAVIOR_FLUSH 0x00035001 -#define GLFW_RELEASE_BEHAVIOR_NONE 0x00035002 - -#define GLFW_NATIVE_CONTEXT_API 0x00036001 -#define GLFW_EGL_CONTEXT_API 0x00036002 -#define GLFW_OSMESA_CONTEXT_API 0x00036003 - -/*! @defgroup shapes Standard cursor shapes - * @brief Standard system cursor shapes. - * - * See [standard cursor creation](@ref cursor_standard) for how these are used. - * - * @ingroup input - * @{ */ - -/*! @brief The regular arrow cursor shape. - * - * The regular arrow cursor. - */ -#define GLFW_ARROW_CURSOR 0x00036001 -/*! @brief The text input I-beam cursor shape. - * - * The text input I-beam cursor shape. - */ -#define GLFW_IBEAM_CURSOR 0x00036002 -/*! @brief The crosshair shape. - * - * The crosshair shape. - */ -#define GLFW_CROSSHAIR_CURSOR 0x00036003 -/*! @brief The hand shape. - * - * The hand shape. - */ -#define GLFW_HAND_CURSOR 0x00036004 -/*! @brief The horizontal resize arrow shape. - * - * The horizontal resize arrow shape. - */ -#define GLFW_HRESIZE_CURSOR 0x00036005 -/*! @brief The vertical resize arrow shape. - * - * The vertical resize arrow shape. - */ -#define GLFW_VRESIZE_CURSOR 0x00036006 -/*! @} */ - -#define GLFW_CONNECTED 0x00040001 -#define GLFW_DISCONNECTED 0x00040002 - -/*! @addtogroup init - * @{ */ -/*! @brief Joystick hat buttons init hint. - * - * Joystick hat buttons [init hint](@ref GLFW_JOYSTICK_HAT_BUTTONS). - */ -#define GLFW_JOYSTICK_HAT_BUTTONS 0x00050001 -/*! @brief macOS specific init hint. - * - * macOS specific [init hint](@ref GLFW_COCOA_CHDIR_RESOURCES_hint). - */ -#define GLFW_COCOA_CHDIR_RESOURCES 0x00051001 -/*! @brief macOS specific init hint. - * - * macOS specific [init hint](@ref GLFW_COCOA_MENUBAR_hint). - */ -#define GLFW_COCOA_MENUBAR 0x00051002 -/*! @} */ - -#define GLFW_DONT_CARE -1 - - -/************************************************************************* - * GLFW API types - *************************************************************************/ - -/*! @brief Client API function pointer type. - * - * Generic function pointer used for returning client API function pointers - * without forcing a cast from a regular pointer. - * - * @sa @ref context_glext - * @sa @ref glfwGetProcAddress - * - * @since Added in version 3.0. - * - * @ingroup context - */ -typedef void (*GLFWglproc)(void); - -/*! @brief Vulkan API function pointer type. - * - * Generic function pointer used for returning Vulkan API function pointers - * without forcing a cast from a regular pointer. - * - * @sa @ref vulkan_proc - * @sa @ref glfwGetInstanceProcAddress - * - * @since Added in version 3.2. - * - * @ingroup vulkan - */ -typedef void (*GLFWvkproc)(void); - -/*! @brief Opaque monitor object. - * - * Opaque monitor object. - * - * @see @ref monitor_object - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -typedef struct GLFWmonitor GLFWmonitor; - -/*! @brief Opaque window object. - * - * Opaque window object. - * - * @see @ref window_object - * - * @since Added in version 3.0. - * - * @ingroup window - */ -typedef struct GLFWwindow GLFWwindow; - -/*! @brief Opaque cursor object. - * - * Opaque cursor object. - * - * @see @ref cursor_object - * - * @since Added in version 3.1. - * - * @ingroup input - */ -typedef struct GLFWcursor GLFWcursor; - -/*! @brief The function pointer type for error callbacks. - * - * This is the function pointer type for error callbacks. An error callback - * function has the following signature: - * @code - * void callback_name(int error_code, const char* description) - * @endcode - * - * @param[in] error_code An [error code](@ref errors). Future releases may add - * more error codes. - * @param[in] description A UTF-8 encoded string describing the error. - * - * @pointer_lifetime The error description string is valid until the callback - * function returns. - * - * @sa @ref error_handling - * @sa @ref glfwSetErrorCallback - * - * @since Added in version 3.0. - * - * @ingroup init - */ -typedef void (* GLFWerrorfun)(int error_code, const char* description); - -/*! @brief The function pointer type for window position callbacks. - * - * This is the function pointer type for window position callbacks. A window - * position callback function has the following signature: - * @code - * void callback_name(GLFWwindow* window, int xpos, int ypos) - * @endcode - * - * @param[in] window The window that was moved. - * @param[in] xpos The new x-coordinate, in screen coordinates, of the - * upper-left corner of the content area of the window. - * @param[in] ypos The new y-coordinate, in screen coordinates, of the - * upper-left corner of the content area of the window. - * - * @sa @ref window_pos - * @sa @ref glfwSetWindowPosCallback - * - * @since Added in version 3.0. - * - * @ingroup window - */ -typedef void (* GLFWwindowposfun)(GLFWwindow* window, int xpos, int ypos); - -/*! @brief The function pointer type for window size callbacks. - * - * This is the function pointer type for window size callbacks. A window size - * callback function has the following signature: - * @code - * void callback_name(GLFWwindow* window, int width, int height) - * @endcode - * - * @param[in] window The window that was resized. - * @param[in] width The new width, in screen coordinates, of the window. - * @param[in] height The new height, in screen coordinates, of the window. - * - * @sa @ref window_size - * @sa @ref glfwSetWindowSizeCallback - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -typedef void (* GLFWwindowsizefun)(GLFWwindow* window, int width, int height); - -/*! @brief The function pointer type for window close callbacks. - * - * This is the function pointer type for window close callbacks. A window - * close callback function has the following signature: - * @code - * void function_name(GLFWwindow* window) - * @endcode - * - * @param[in] window The window that the user attempted to close. - * - * @sa @ref window_close - * @sa @ref glfwSetWindowCloseCallback - * - * @since Added in version 2.5. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -typedef void (* GLFWwindowclosefun)(GLFWwindow* window); - -/*! @brief The function pointer type for window content refresh callbacks. - * - * This is the function pointer type for window content refresh callbacks. - * A window content refresh callback function has the following signature: - * @code - * void function_name(GLFWwindow* window); - * @endcode - * - * @param[in] window The window whose content needs to be refreshed. - * - * @sa @ref window_refresh - * @sa @ref glfwSetWindowRefreshCallback - * - * @since Added in version 2.5. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -typedef void (* GLFWwindowrefreshfun)(GLFWwindow* window); - -/*! @brief The function pointer type for window focus callbacks. - * - * This is the function pointer type for window focus callbacks. A window - * focus callback function has the following signature: - * @code - * void function_name(GLFWwindow* window, int focused) - * @endcode - * - * @param[in] window The window that gained or lost input focus. - * @param[in] focused `GLFW_TRUE` if the window was given input focus, or - * `GLFW_FALSE` if it lost it. - * - * @sa @ref window_focus - * @sa @ref glfwSetWindowFocusCallback - * - * @since Added in version 3.0. - * - * @ingroup window - */ -typedef void (* GLFWwindowfocusfun)(GLFWwindow* window, int focused); - -/*! @brief The function pointer type for window iconify callbacks. - * - * This is the function pointer type for window iconify callbacks. A window - * iconify callback function has the following signature: - * @code - * void function_name(GLFWwindow* window, int iconified) - * @endcode - * - * @param[in] window The window that was iconified or restored. - * @param[in] iconified `GLFW_TRUE` if the window was iconified, or - * `GLFW_FALSE` if it was restored. - * - * @sa @ref window_iconify - * @sa @ref glfwSetWindowIconifyCallback - * - * @since Added in version 3.0. - * - * @ingroup window - */ -typedef void (* GLFWwindowiconifyfun)(GLFWwindow* window, int iconified); - -/*! @brief The function pointer type for window maximize callbacks. - * - * This is the function pointer type for window maximize callbacks. A window - * maximize callback function has the following signature: - * @code - * void function_name(GLFWwindow* window, int maximized) - * @endcode - * - * @param[in] window The window that was maximized or restored. - * @param[in] maximized `GLFW_TRUE` if the window was maximized, or - * `GLFW_FALSE` if it was restored. - * - * @sa @ref window_maximize - * @sa glfwSetWindowMaximizeCallback - * - * @since Added in version 3.3. - * - * @ingroup window - */ -typedef void (* GLFWwindowmaximizefun)(GLFWwindow* window, int maximized); - -/*! @brief The function pointer type for framebuffer size callbacks. - * - * This is the function pointer type for framebuffer size callbacks. - * A framebuffer size callback function has the following signature: - * @code - * void function_name(GLFWwindow* window, int width, int height) - * @endcode - * - * @param[in] window The window whose framebuffer was resized. - * @param[in] width The new width, in pixels, of the framebuffer. - * @param[in] height The new height, in pixels, of the framebuffer. - * - * @sa @ref window_fbsize - * @sa @ref glfwSetFramebufferSizeCallback - * - * @since Added in version 3.0. - * - * @ingroup window - */ -typedef void (* GLFWframebuffersizefun)(GLFWwindow* window, int width, int height); - -/*! @brief The function pointer type for window content scale callbacks. - * - * This is the function pointer type for window content scale callbacks. - * A window content scale callback function has the following signature: - * @code - * void function_name(GLFWwindow* window, float xscale, float yscale) - * @endcode - * - * @param[in] window The window whose content scale changed. - * @param[in] xscale The new x-axis content scale of the window. - * @param[in] yscale The new y-axis content scale of the window. - * - * @sa @ref window_scale - * @sa @ref glfwSetWindowContentScaleCallback - * - * @since Added in version 3.3. - * - * @ingroup window - */ -typedef void (* GLFWwindowcontentscalefun)(GLFWwindow* window, float xscale, float yscale); - -/*! @brief The function pointer type for mouse button callbacks. - * - * This is the function pointer type for mouse button callback functions. - * A mouse button callback function has the following signature: - * @code - * void function_name(GLFWwindow* window, int button, int action, int mods) - * @endcode - * - * @param[in] window The window that received the event. - * @param[in] button The [mouse button](@ref buttons) that was pressed or - * released. - * @param[in] action One of `GLFW_PRESS` or `GLFW_RELEASE`. Future releases - * may add more actions. - * @param[in] mods Bit field describing which [modifier keys](@ref mods) were - * held down. - * - * @sa @ref input_mouse_button - * @sa @ref glfwSetMouseButtonCallback - * - * @since Added in version 1.0. - * @glfw3 Added window handle and modifier mask parameters. - * - * @ingroup input - */ -typedef void (* GLFWmousebuttonfun)(GLFWwindow* window, int button, int action, int mods); - -/*! @brief The function pointer type for cursor position callbacks. - * - * This is the function pointer type for cursor position callbacks. A cursor - * position callback function has the following signature: - * @code - * void function_name(GLFWwindow* window, double xpos, double ypos); - * @endcode - * - * @param[in] window The window that received the event. - * @param[in] xpos The new cursor x-coordinate, relative to the left edge of - * the content area. - * @param[in] ypos The new cursor y-coordinate, relative to the top edge of the - * content area. - * - * @sa @ref cursor_pos - * @sa @ref glfwSetCursorPosCallback - * - * @since Added in version 3.0. Replaces `GLFWmouseposfun`. - * - * @ingroup input - */ -typedef void (* GLFWcursorposfun)(GLFWwindow* window, double xpos, double ypos); - -/*! @brief The function pointer type for cursor enter/leave callbacks. - * - * This is the function pointer type for cursor enter/leave callbacks. - * A cursor enter/leave callback function has the following signature: - * @code - * void function_name(GLFWwindow* window, int entered) - * @endcode - * - * @param[in] window The window that received the event. - * @param[in] entered `GLFW_TRUE` if the cursor entered the window's content - * area, or `GLFW_FALSE` if it left it. - * - * @sa @ref cursor_enter - * @sa @ref glfwSetCursorEnterCallback - * - * @since Added in version 3.0. - * - * @ingroup input - */ -typedef void (* GLFWcursorenterfun)(GLFWwindow* window, int entered); - -/*! @brief The function pointer type for scroll callbacks. - * - * This is the function pointer type for scroll callbacks. A scroll callback - * function has the following signature: - * @code - * void function_name(GLFWwindow* window, double xoffset, double yoffset) - * @endcode - * - * @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. - * - * @sa @ref scrolling - * @sa @ref glfwSetScrollCallback - * - * @since Added in version 3.0. Replaces `GLFWmousewheelfun`. - * - * @ingroup input - */ -typedef void (* GLFWscrollfun)(GLFWwindow* window, double xoffset, double yoffset); - -/*! @brief The function pointer type for keyboard key callbacks. - * - * This is the function pointer type for keyboard key callbacks. A keyboard - * key callback function has the following signature: - * @code - * void function_name(GLFWwindow* window, int key, int scancode, int action, int mods) - * @endcode - * - * @param[in] window The window that received the event. - * @param[in] key The [keyboard key](@ref keys) that was pressed or released. - * @param[in] scancode The system-specific scancode of the key. - * @param[in] action `GLFW_PRESS`, `GLFW_RELEASE` or `GLFW_REPEAT`. Future - * releases may add more actions. - * @param[in] mods Bit field describing which [modifier keys](@ref mods) were - * held down. - * - * @sa @ref input_key - * @sa @ref glfwSetKeyCallback - * - * @since Added in version 1.0. - * @glfw3 Added window handle, scancode and modifier mask parameters. - * - * @ingroup input - */ -typedef void (* GLFWkeyfun)(GLFWwindow* window, int key, int scancode, int action, int mods); - -/*! @brief The function pointer type for Unicode character callbacks. - * - * This is the function pointer type for Unicode character callbacks. - * A Unicode character callback function has the following signature: - * @code - * void function_name(GLFWwindow* window, unsigned int codepoint) - * @endcode - * - * @param[in] window The window that received the event. - * @param[in] codepoint The Unicode code point of the character. - * - * @sa @ref input_char - * @sa @ref glfwSetCharCallback - * - * @since Added in version 2.4. - * @glfw3 Added window handle parameter. - * - * @ingroup input - */ -typedef void (* GLFWcharfun)(GLFWwindow* window, unsigned int codepoint); - -/*! @brief The function pointer type for Unicode character with modifiers - * callbacks. - * - * This is the function pointer type for Unicode character with modifiers - * callbacks. It is called for each input character, regardless of what - * modifier keys are held down. A Unicode character with modifiers callback - * function has the following signature: - * @code - * void function_name(GLFWwindow* window, unsigned int codepoint, int mods) - * @endcode - * - * @param[in] window The window that received the event. - * @param[in] codepoint The Unicode code point of the character. - * @param[in] mods Bit field describing which [modifier keys](@ref mods) were - * held down. - * - * @sa @ref input_char - * @sa @ref glfwSetCharModsCallback - * - * @deprecated Scheduled for removal in version 4.0. - * - * @since Added in version 3.1. - * - * @ingroup input - */ -typedef void (* GLFWcharmodsfun)(GLFWwindow* window, unsigned int codepoint, int mods); - -/*! @brief The function pointer type for path drop callbacks. - * - * This is the function pointer type for path drop callbacks. A path drop - * callback function has the following signature: - * @code - * void function_name(GLFWwindow* window, int path_count, const char* paths[]) - * @endcode - * - * @param[in] window The window that received the event. - * @param[in] path_count The number of dropped paths. - * @param[in] paths The UTF-8 encoded file and/or directory path names. - * - * @pointer_lifetime The path array and its strings are valid until the - * callback function returns. - * - * @sa @ref path_drop - * @sa @ref glfwSetDropCallback - * - * @since Added in version 3.1. - * - * @ingroup input - */ -typedef void (* GLFWdropfun)(GLFWwindow* window, int path_count, const char* paths[]); - -/*! @brief The function pointer type for monitor configuration callbacks. - * - * This is the function pointer type for monitor configuration callbacks. - * A monitor callback function has the following signature: - * @code - * void function_name(GLFWmonitor* monitor, int event) - * @endcode - * - * @param[in] monitor The monitor that was connected or disconnected. - * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. Future - * releases may add more events. - * - * @sa @ref monitor_event - * @sa @ref glfwSetMonitorCallback - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -typedef void (* GLFWmonitorfun)(GLFWmonitor* monitor, int event); - -/*! @brief The function pointer type for joystick configuration callbacks. - * - * This is the function pointer type for joystick configuration callbacks. - * A joystick configuration callback function has the following signature: - * @code - * void function_name(int jid, int event) - * @endcode - * - * @param[in] jid The joystick that was connected or disconnected. - * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. Future - * releases may add more events. - * - * @sa @ref joystick_event - * @sa @ref glfwSetJoystickCallback - * - * @since Added in version 3.2. - * - * @ingroup input - */ -typedef void (* GLFWjoystickfun)(int jid, int event); - -/*! @brief Video mode type. - * - * This describes a single video mode. - * - * @sa @ref monitor_modes - * @sa @ref glfwGetVideoMode - * @sa @ref glfwGetVideoModes - * - * @since Added in version 1.0. - * @glfw3 Added refresh rate member. - * - * @ingroup monitor - */ -typedef struct GLFWvidmode -{ - /*! The width, in screen coordinates, of the video mode. - */ - int width; - /*! The height, in screen coordinates, of the video mode. - */ - int height; - /*! The bit depth of the red channel of the video mode. - */ - int redBits; - /*! The bit depth of the green channel of the video mode. - */ - int greenBits; - /*! The bit depth of the blue channel of the video mode. - */ - int blueBits; - /*! The refresh rate, in Hz, of the video mode. - */ - int refreshRate; -} GLFWvidmode; - -/*! @brief Gamma ramp. - * - * This describes the gamma ramp for a monitor. - * - * @sa @ref monitor_gamma - * @sa @ref glfwGetGammaRamp - * @sa @ref glfwSetGammaRamp - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -typedef struct GLFWgammaramp -{ - /*! An array of value describing the response of the red channel. - */ - unsigned short* red; - /*! An array of value describing the response of the green channel. - */ - unsigned short* green; - /*! An array of value describing the response of the blue channel. - */ - unsigned short* blue; - /*! The number of elements in each array. - */ - unsigned int size; -} GLFWgammaramp; - -/*! @brief Image data. - * - * This describes a single 2D image. See the documentation for each related - * function what the expected pixel format is. - * - * @sa @ref cursor_custom - * @sa @ref window_icon - * - * @since Added in version 2.1. - * @glfw3 Removed format and bytes-per-pixel members. - * - * @ingroup window - */ -typedef struct GLFWimage -{ - /*! The width, in pixels, of this image. - */ - int width; - /*! The height, in pixels, of this image. - */ - int height; - /*! The pixel data of this image, arranged left-to-right, top-to-bottom. - */ - unsigned char* pixels; -} GLFWimage; - -/*! @brief Gamepad input state - * - * This describes the input state of a gamepad. - * - * @sa @ref gamepad - * @sa @ref glfwGetGamepadState - * - * @since Added in version 3.3. - * - * @ingroup input - */ -typedef struct GLFWgamepadstate -{ - /*! The states of each [gamepad button](@ref gamepad_buttons), `GLFW_PRESS` - * or `GLFW_RELEASE`. - */ - unsigned char buttons[15]; - /*! The states of each [gamepad axis](@ref gamepad_axes), in the range -1.0 - * to 1.0 inclusive. - */ - float axes[6]; -} GLFWgamepadstate; - - -/************************************************************************* - * GLFW API functions - *************************************************************************/ - -/*! @brief Initializes the GLFW library. - * - * This function initializes the GLFW library. Before most GLFW functions can - * be used, GLFW must be initialized, and before an application terminates GLFW - * should be terminated in order to free any resources allocated during or - * after initialization. - * - * If this function fails, it calls @ref glfwTerminate before returning. If it - * succeeds, you should call @ref glfwTerminate before the application exits. - * - * Additional calls to this function after successful initialization but before - * termination will return `GLFW_TRUE` immediately. - * - * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_PLATFORM_ERROR. - * - * @remark @macos This function will change the current directory of the - * application to the `Contents/Resources` subdirectory of the application's - * bundle, if present. This can be disabled with the @ref - * GLFW_COCOA_CHDIR_RESOURCES init hint. - * - * @remark @x11 This function will set the `LC_CTYPE` category of the - * application locale according to the current environment if that category is - * still "C". This is because the "C" locale breaks Unicode text input. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref intro_init - * @sa @ref glfwTerminate - * - * @since Added in version 1.0. - * - * @ingroup init - */ -GLFWAPI int glfwInit(void); - -/*! @brief Terminates the GLFW library. - * - * This function destroys all remaining windows and cursors, restores any - * modified gamma ramps and frees any other allocated resources. Once this - * function is called, you must again call @ref glfwInit successfully before - * you will be able to use most GLFW functions. - * - * If GLFW has been successfully initialized, this function should be called - * before the application exits. If initialization fails, there is no need to - * call this function, as it is called by @ref glfwInit before it returns - * failure. - * - * This function has no effect if GLFW is not initialized. - * - * @errors Possible errors include @ref GLFW_PLATFORM_ERROR. - * - * @remark This function may be called before @ref glfwInit. - * - * @warning The contexts of any remaining windows must not be current on any - * other thread when this function is called. - * - * @reentrancy This function must not be called from a callback. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref intro_init - * @sa @ref glfwInit - * - * @since Added in version 1.0. - * - * @ingroup init - */ -GLFWAPI void glfwTerminate(void); - -/*! @brief Sets the specified init hint to the desired value. - * - * This function sets hints for the next initialization of GLFW. - * - * The values you set hints to are never reset by GLFW, but they only take - * effect during initialization. Once GLFW has been initialized, any values - * you set will be ignored until the library is terminated and initialized - * again. - * - * Some hints are platform specific. These may be set on any platform but they - * will only affect their specific platform. Other platforms will ignore them. - * Setting these hints requires no platform specific headers or functions. - * - * @param[in] hint The [init hint](@ref init_hints) to set. - * @param[in] value The new value of the init hint. - * - * @errors Possible errors include @ref GLFW_INVALID_ENUM and @ref - * GLFW_INVALID_VALUE. - * - * @remarks This function may be called before @ref glfwInit. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa init_hints - * @sa glfwInit - * - * @since Added in version 3.3. - * - * @ingroup init - */ -GLFWAPI void glfwInitHint(int hint, int value); - -/*! @brief Retrieves the version of the GLFW library. - * - * This function retrieves the major, minor and revision numbers of the GLFW - * library. It is intended for when you are using GLFW as a shared library and - * want to ensure that you are using the minimum required version. - * - * Any or all of the version arguments may be `NULL`. - * - * @param[out] major Where to store the major version number, or `NULL`. - * @param[out] minor Where to store the minor version number, or `NULL`. - * @param[out] rev Where to store the revision number, or `NULL`. - * - * @errors None. - * - * @remark This function may be called before @ref glfwInit. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref intro_version - * @sa @ref glfwGetVersionString - * - * @since Added in version 1.0. - * - * @ingroup init - */ -GLFWAPI void glfwGetVersion(int* major, int* minor, int* rev); - -/*! @brief Returns a string describing the compile-time configuration. - * - * This function returns the compile-time generated - * [version string](@ref intro_version_string) of the GLFW library binary. It - * describes the version, platform, compiler and any platform-specific - * compile-time options. It should not be confused with the OpenGL or OpenGL - * ES version string, queried with `glGetString`. - * - * __Do not use the version string__ to parse the GLFW library version. The - * @ref glfwGetVersion function provides the version of the running library - * binary in numerical format. - * - * @return The ASCII encoded GLFW version string. - * - * @errors None. - * - * @remark This function may be called before @ref glfwInit. - * - * @pointer_lifetime The returned string is static and compile-time generated. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref intro_version - * @sa @ref glfwGetVersion - * - * @since Added in version 3.0. - * - * @ingroup init - */ -GLFWAPI const char* glfwGetVersionString(void); - -/*! @brief Returns and clears the last error for the calling thread. - * - * This function returns and clears the [error code](@ref errors) of the last - * error that occurred on the calling thread, and optionally a UTF-8 encoded - * human-readable description of it. If no error has occurred since the last - * call, it returns @ref GLFW_NO_ERROR (zero) and the description pointer is - * set to `NULL`. - * - * @param[in] description Where to store the error description pointer, or `NULL`. - * @return The last error code for the calling thread, or @ref GLFW_NO_ERROR - * (zero). - * - * @errors None. - * - * @pointer_lifetime The returned string is allocated and freed by GLFW. You - * should not free it yourself. It is guaranteed to be valid only until the - * next error occurs or the library is terminated. - * - * @remark This function may be called before @ref glfwInit. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref error_handling - * @sa @ref glfwSetErrorCallback - * - * @since Added in version 3.3. - * - * @ingroup init - */ -GLFWAPI int glfwGetError(const char** description); - -/*! @brief Sets the error callback. - * - * This function sets the error callback, which is called with an error code - * and a human-readable description each time a GLFW error occurs. - * - * The error code is set before the callback is called. Calling @ref - * glfwGetError from the error callback will return the same value as the error - * code argument. - * - * The error callback is called on the thread where the error occurred. If you - * are using GLFW from multiple threads, your error callback needs to be - * written accordingly. - * - * Because the description string may have been generated specifically for that - * error, it is not guaranteed to be valid after the callback has returned. If - * you wish to use it after the callback returns, you need to make a copy. - * - * Once set, the error callback remains set even after the library has been - * terminated. - * - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set. - * - * @callback_signature - * @code - * void callback_name(int error_code, const char* description) - * @endcode - * For more information about the callback parameters, see the - * [callback pointer type](@ref GLFWerrorfun). - * - * @errors None. - * - * @remark This function may be called before @ref glfwInit. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref error_handling - * @sa @ref glfwGetError - * - * @since Added in version 3.0. - * - * @ingroup init - */ -GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun callback); - -/*! @brief Returns the currently connected monitors. - * - * This function returns an array of handles for all currently connected - * monitors. The primary monitor is always first in the returned array. If no - * monitors were found, this function returns `NULL`. - * - * @param[out] count Where to store the number of monitors in the returned - * array. This is set to zero if an error occurred. - * @return An array of monitor handles, or `NULL` if no monitors were found or - * if an [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @pointer_lifetime The returned array is allocated and freed by GLFW. You - * should not free it yourself. It is guaranteed to be valid only until the - * monitor configuration changes or the library is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_monitors - * @sa @ref monitor_event - * @sa @ref glfwGetPrimaryMonitor - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -GLFWAPI GLFWmonitor** glfwGetMonitors(int* count); - -/*! @brief Returns the primary monitor. - * - * This function returns the primary monitor. This is usually the monitor - * where elements like the task bar or global menu bar are located. - * - * @return The primary monitor, or `NULL` if no monitors were found or if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @remark The primary monitor is always first in the array returned by @ref - * glfwGetMonitors. - * - * @sa @ref monitor_monitors - * @sa @ref glfwGetMonitors - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -GLFWAPI GLFWmonitor* glfwGetPrimaryMonitor(void); - -/*! @brief Returns the position of the monitor's viewport on the virtual screen. - * - * This function returns the position, in screen coordinates, of the upper-left - * corner of the specified monitor. - * - * Any or all of the position arguments may be `NULL`. If an error occurs, all - * non-`NULL` position arguments will be set to zero. - * - * @param[in] monitor The monitor to query. - * @param[out] xpos Where to store the monitor x-coordinate, or `NULL`. - * @param[out] ypos Where to store the monitor y-coordinate, or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_properties - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -GLFWAPI void glfwGetMonitorPos(GLFWmonitor* monitor, int* xpos, int* ypos); - -/*! @brief Retrieves the work area of the monitor. - * - * This function returns the position, in screen coordinates, of the upper-left - * corner of the work area of the specified monitor along with the work area - * size in screen coordinates. The work area is defined as the area of the - * monitor not occluded by the operating system task bar where present. If no - * task bar exists then the work area is the monitor resolution in screen - * coordinates. - * - * Any or all of the position and size arguments may be `NULL`. If an error - * occurs, all non-`NULL` position and size arguments will be set to zero. - * - * @param[in] monitor The monitor to query. - * @param[out] xpos Where to store the monitor x-coordinate, or `NULL`. - * @param[out] ypos Where to store the monitor y-coordinate, or `NULL`. - * @param[out] width Where to store the monitor width, or `NULL`. - * @param[out] height Where to store the monitor height, or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_workarea - * - * @since Added in version 3.3. - * - * @ingroup monitor - */ -GLFWAPI void glfwGetMonitorWorkarea(GLFWmonitor* monitor, int* xpos, int* ypos, int* width, int* height); - -/*! @brief Returns the physical size of the monitor. - * - * This function returns the size, in millimetres, of the display area of the - * specified monitor. - * - * Some systems do not provide accurate monitor size information, either - * because the monitor - * [EDID](https://en.wikipedia.org/wiki/Extended_display_identification_data) - * data is incorrect or because the driver does not report it accurately. - * - * Any or all of the size arguments may be `NULL`. If an error occurs, all - * non-`NULL` size arguments will be set to zero. - * - * @param[in] monitor The monitor to query. - * @param[out] widthMM Where to store the width, in millimetres, of the - * monitor's display area, or `NULL`. - * @param[out] heightMM Where to store the height, in millimetres, of the - * monitor's display area, or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @remark @win32 On Windows 8 and earlier the physical size is calculated from - * the current resolution and system DPI instead of querying the monitor EDID data. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_properties - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -GLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* monitor, int* widthMM, int* heightMM); - -/*! @brief Retrieves the content scale for the specified monitor. - * - * This function retrieves the content scale for the specified monitor. The - * content scale is the ratio between the current DPI and the platform's - * default DPI. This is especially important for text and any UI elements. If - * the pixel dimensions of your UI scaled by this look appropriate on your - * machine then it should appear at a reasonable size on other machines - * regardless of their DPI and scaling settings. This relies on the system DPI - * and scaling settings being somewhat correct. - * - * The content scale may depend on both the monitor resolution and pixel - * density and on user settings. It may be very different from the raw DPI - * calculated from the physical size and current resolution. - * - * @param[in] monitor The monitor to query. - * @param[out] xscale Where to store the x-axis content scale, or `NULL`. - * @param[out] yscale Where to store the y-axis content scale, or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_scale - * @sa @ref glfwGetWindowContentScale - * - * @since Added in version 3.3. - * - * @ingroup monitor - */ -GLFWAPI void glfwGetMonitorContentScale(GLFWmonitor* monitor, float* xscale, float* yscale); - -/*! @brief Returns the name of the specified monitor. - * - * This function returns a human-readable name, encoded as UTF-8, of the - * specified monitor. The name typically reflects the make and model of the - * monitor and is not guaranteed to be unique among the connected monitors. - * - * @param[in] monitor The monitor to query. - * @return The UTF-8 encoded name of the monitor, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @pointer_lifetime The returned string is allocated and freed by GLFW. You - * should not free it yourself. It is valid until the specified monitor is - * disconnected or the library is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_properties - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -GLFWAPI const char* glfwGetMonitorName(GLFWmonitor* monitor); - -/*! @brief Sets the user pointer of the specified monitor. - * - * This function sets the user-defined pointer of the specified monitor. The - * current value is retained until the monitor is disconnected. The initial - * value is `NULL`. - * - * This function may be called from the monitor callback, even for a monitor - * that is being disconnected. - * - * @param[in] monitor The monitor whose pointer to set. - * @param[in] pointer The new value. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @sa @ref monitor_userptr - * @sa @ref glfwGetMonitorUserPointer - * - * @since Added in version 3.3. - * - * @ingroup monitor - */ -GLFWAPI void glfwSetMonitorUserPointer(GLFWmonitor* monitor, void* pointer); - -/*! @brief Returns the user pointer of the specified monitor. - * - * This function returns the current value of the user-defined pointer of the - * specified monitor. The initial value is `NULL`. - * - * This function may be called from the monitor callback, even for a monitor - * that is being disconnected. - * - * @param[in] monitor The monitor whose pointer to return. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @sa @ref monitor_userptr - * @sa @ref glfwSetMonitorUserPointer - * - * @since Added in version 3.3. - * - * @ingroup monitor - */ -GLFWAPI void* glfwGetMonitorUserPointer(GLFWmonitor* monitor); - -/*! @brief Sets the monitor configuration callback. - * - * This function sets the monitor configuration callback, or removes the - * currently set callback. This is called when a monitor is connected to or - * disconnected from the system. - * - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWmonitor* monitor, int event) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWmonitorfun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_event - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -GLFWAPI GLFWmonitorfun glfwSetMonitorCallback(GLFWmonitorfun callback); - -/*! @brief Returns the available video modes for the specified monitor. - * - * This function returns an array of all video modes supported by the specified - * monitor. The returned array is sorted in ascending order, first by color - * bit depth (the sum of all channel depths), then by resolution area (the - * product of width and height), then resolution width and finally by refresh - * rate. - * - * @param[in] monitor The monitor to query. - * @param[out] count Where to store the number of video modes in the returned - * array. This is set to zero if an error occurred. - * @return An array of video modes, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The returned array is allocated and freed by GLFW. You - * should not free it yourself. It is valid until the specified monitor is - * disconnected, this function is called again for that monitor or the library - * is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_modes - * @sa @ref glfwGetVideoMode - * - * @since Added in version 1.0. - * @glfw3 Changed to return an array of modes for a specific monitor. - * - * @ingroup monitor - */ -GLFWAPI const GLFWvidmode* glfwGetVideoModes(GLFWmonitor* monitor, int* count); - -/*! @brief Returns the current mode of the specified monitor. - * - * This function returns the current video mode of the specified monitor. If - * you have created a full screen window for that monitor, the return value - * will depend on whether that window is iconified. - * - * @param[in] monitor The monitor to query. - * @return The current mode of the monitor, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The returned array is allocated and freed by GLFW. You - * should not free it yourself. It is valid until the specified monitor is - * disconnected or the library is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_modes - * @sa @ref glfwGetVideoModes - * - * @since Added in version 3.0. Replaces `glfwGetDesktopMode`. - * - * @ingroup monitor - */ -GLFWAPI const GLFWvidmode* glfwGetVideoMode(GLFWmonitor* monitor); - -/*! @brief Generates a gamma ramp and sets it for the specified monitor. - * - * This function generates an appropriately sized gamma ramp from the specified - * exponent and then calls @ref glfwSetGammaRamp with it. The value must be - * a finite number greater than zero. - * - * The software controlled gamma ramp is applied _in addition_ to the hardware - * gamma correction, which today is usually an approximation of sRGB gamma. - * This means that setting a perfectly linear ramp, or gamma 1.0, will produce - * the default (usually sRGB-like) behavior. - * - * For gamma correct rendering with OpenGL or OpenGL ES, see the @ref - * GLFW_SRGB_CAPABLE hint. - * - * @param[in] monitor The monitor whose gamma ramp to set. - * @param[in] gamma The desired exponent. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. - * - * @remark @wayland Gamma handling is a privileged protocol, this function - * will thus never be implemented and emits @ref GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_gamma - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -GLFWAPI void glfwSetGamma(GLFWmonitor* monitor, float gamma); - -/*! @brief Returns the current gamma ramp for the specified monitor. - * - * This function returns the current gamma ramp of the specified monitor. - * - * @param[in] monitor The monitor to query. - * @return The current gamma ramp, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark @wayland Gamma handling is a privileged protocol, this function - * will thus never be implemented and emits @ref GLFW_PLATFORM_ERROR while - * returning `NULL`. - * - * @pointer_lifetime The returned structure and its arrays are allocated and - * freed by GLFW. You should not free them yourself. They are valid until the - * specified monitor is disconnected, this function is called again for that - * monitor or the library is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_gamma - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -GLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* monitor); - -/*! @brief Sets the current gamma ramp for the specified monitor. - * - * This function sets the current gamma ramp for the specified monitor. The - * original gamma ramp for that monitor is saved by GLFW the first time this - * function is called and is restored by @ref glfwTerminate. - * - * The software controlled gamma ramp is applied _in addition_ to the hardware - * gamma correction, which today is usually an approximation of sRGB gamma. - * This means that setting a perfectly linear ramp, or gamma 1.0, will produce - * the default (usually sRGB-like) behavior. - * - * For gamma correct rendering with OpenGL or OpenGL ES, see the @ref - * GLFW_SRGB_CAPABLE hint. - * - * @param[in] monitor The monitor whose gamma ramp to set. - * @param[in] ramp The gamma ramp to use. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark The size of the specified gamma ramp should match the size of the - * current ramp for that monitor. - * - * @remark @win32 The gamma ramp size must be 256. - * - * @remark @wayland Gamma handling is a privileged protocol, this function - * will thus never be implemented and emits @ref GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The specified gamma ramp is copied before this function - * returns. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_gamma - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -GLFWAPI void glfwSetGammaRamp(GLFWmonitor* monitor, const GLFWgammaramp* ramp); - -/*! @brief Resets all window hints to their default values. - * - * This function resets all window hints to their - * [default values](@ref window_hints_values). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_hints - * @sa @ref glfwWindowHint - * @sa @ref glfwWindowHintString - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwDefaultWindowHints(void); - -/*! @brief Sets the specified window hint to the desired value. - * - * This function sets hints for the next call to @ref glfwCreateWindow. The - * hints, once set, retain their values until changed by a call to this - * function or @ref glfwDefaultWindowHints, or until the library is terminated. - * - * Only integer value hints can be set with this function. String value hints - * are set with @ref glfwWindowHintString. - * - * This function does not check whether the specified hint values are valid. - * If you set hints to invalid values this will instead be reported by the next - * call to @ref glfwCreateWindow. - * - * Some hints are platform specific. These may be set on any platform but they - * will only affect their specific platform. Other platforms will ignore them. - * Setting these hints requires no platform specific headers or functions. - * - * @param[in] hint The [window hint](@ref window_hints) to set. - * @param[in] value The new value of the window hint. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_INVALID_ENUM. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_hints - * @sa @ref glfwWindowHintString - * @sa @ref glfwDefaultWindowHints - * - * @since Added in version 3.0. Replaces `glfwOpenWindowHint`. - * - * @ingroup window - */ -GLFWAPI void glfwWindowHint(int hint, int value); - -/*! @brief Sets the specified window hint to the desired value. - * - * This function sets hints for the next call to @ref glfwCreateWindow. The - * hints, once set, retain their values until changed by a call to this - * function or @ref glfwDefaultWindowHints, or until the library is terminated. - * - * Only string type hints can be set with this function. Integer value hints - * are set with @ref glfwWindowHint. - * - * This function does not check whether the specified hint values are valid. - * If you set hints to invalid values this will instead be reported by the next - * call to @ref glfwCreateWindow. - * - * Some hints are platform specific. These may be set on any platform but they - * will only affect their specific platform. Other platforms will ignore them. - * Setting these hints requires no platform specific headers or functions. - * - * @param[in] hint The [window hint](@ref window_hints) to set. - * @param[in] value The new value of the window hint. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_INVALID_ENUM. - * - * @pointer_lifetime The specified string is copied before this function - * returns. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_hints - * @sa @ref glfwWindowHint - * @sa @ref glfwDefaultWindowHints - * - * @since Added in version 3.3. - * - * @ingroup window - */ -GLFWAPI void glfwWindowHintString(int hint, const char* value); - -/*! @brief Creates a window and its associated context. - * - * This function creates a window and its associated OpenGL or OpenGL ES - * context. Most of the options controlling how the window and its context - * should be created are specified with [window hints](@ref window_hints). - * - * Successful creation does not change which context is current. Before you - * can use the newly created context, you need to - * [make it current](@ref context_current). For information about the `share` - * parameter, see @ref context_sharing. - * - * The created window, framebuffer and context may differ from what you - * requested, as not all parameters and hints are - * [hard constraints](@ref window_hints_hard). This includes the size of the - * window, especially for full screen windows. To query the actual attributes - * of the created window, framebuffer and context, see @ref - * glfwGetWindowAttrib, @ref glfwGetWindowSize and @ref glfwGetFramebufferSize. - * - * To create a full screen window, you need to specify the monitor the window - * will cover. If no monitor is specified, the window will be windowed mode. - * Unless you have a way for the user to choose a specific monitor, it is - * recommended that you pick the primary monitor. For more information on how - * to query connected monitors, see @ref monitor_monitors. - * - * For full screen windows, the specified size becomes the resolution of the - * window's _desired video mode_. As long as a full screen window is not - * iconified, the supported video mode most closely matching the desired video - * mode is set for the specified monitor. For more information about full - * screen windows, including the creation of so called _windowed full screen_ - * or _borderless full screen_ windows, see @ref window_windowed_full_screen. - * - * Once you have created the window, you can switch it between windowed and - * full screen mode with @ref glfwSetWindowMonitor. This will not affect its - * OpenGL or OpenGL ES context. - * - * By default, newly created windows use the placement recommended by the - * window system. To create the window at a specific position, make it - * initially invisible using the [GLFW_VISIBLE](@ref GLFW_VISIBLE_hint) window - * hint, set its [position](@ref window_pos) and then [show](@ref window_hide) - * it. - * - * As long as at least one full screen window is not iconified, the screensaver - * is prohibited from starting. - * - * Window systems put limits on window sizes. Very large or very small window - * dimensions may be overridden by the window system on creation. Check the - * actual [size](@ref window_size) after creation. - * - * The [swap interval](@ref buffer_swap) is not set during window creation and - * the initial value may vary depending on driver settings and defaults. - * - * @param[in] width The desired width, in screen coordinates, of the window. - * This must be greater than zero. - * @param[in] height The desired height, in screen coordinates, of the window. - * This must be greater than zero. - * @param[in] title The initial, UTF-8 encoded window title. - * @param[in] monitor The monitor to use for full screen mode, or `NULL` for - * windowed mode. - * @param[in] share The window whose context to share resources with, or `NULL` - * to not share resources. - * @return The handle of the created window, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM, @ref GLFW_INVALID_VALUE, @ref GLFW_API_UNAVAILABLE, @ref - * GLFW_VERSION_UNAVAILABLE, @ref GLFW_FORMAT_UNAVAILABLE and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark @win32 Window creation will fail if the Microsoft GDI software - * OpenGL implementation is the only one available. - * - * @remark @win32 If the executable has an icon resource named `GLFW_ICON,` it - * will be set as the initial icon for the window. If no such icon is present, - * the `IDI_APPLICATION` icon will be used instead. To set a different icon, - * see @ref glfwSetWindowIcon. - * - * @remark @win32 The context to share resources with must not be current on - * any other thread. - * - * @remark @macos The OS only supports forward-compatible core profile contexts - * for OpenGL versions 3.2 and later. Before creating an OpenGL context of - * version 3.2 or later you must set the - * [GLFW_OPENGL_FORWARD_COMPAT](@ref GLFW_OPENGL_FORWARD_COMPAT_hint) and - * [GLFW_OPENGL_PROFILE](@ref GLFW_OPENGL_PROFILE_hint) hints accordingly. - * OpenGL 3.0 and 3.1 contexts are not supported at all on macOS. - * - * @remark @macos The GLFW window has no icon, as it is not a document - * window, but the dock icon will be the same as the application bundle's icon. - * For more information on bundles, see the - * [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/) - * in the Mac Developer Library. - * - * @remark @macos The first time a window is created the menu bar is created. - * If GLFW finds a `MainMenu.nib` it is loaded and assumed to contain a menu - * bar. Otherwise a minimal menu bar is created manually with common commands - * like Hide, Quit and About. The About entry opens a minimal about dialog - * with information from the application's bundle. Menu bar creation can be - * disabled entirely with the @ref GLFW_COCOA_MENUBAR init hint. - * - * @remark @macos On OS X 10.10 and later the window frame will not be rendered - * at full resolution on Retina displays unless the - * [GLFW_COCOA_RETINA_FRAMEBUFFER](@ref GLFW_COCOA_RETINA_FRAMEBUFFER_hint) - * hint is `GLFW_TRUE` and the `NSHighResolutionCapable` key is enabled in the - * application bundle's `Info.plist`. For more information, see - * [High Resolution Guidelines for OS X](https://developer.apple.com/library/mac/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html) - * in the Mac Developer Library. The GLFW test and example programs use - * a custom `Info.plist` template for this, which can be found as - * `CMake/MacOSXBundleInfo.plist.in` in the source tree. - * - * @remark @macos When activating frame autosaving with - * [GLFW_COCOA_FRAME_NAME](@ref GLFW_COCOA_FRAME_NAME_hint), the specified - * window size and position may be overridden by previously saved values. - * - * @remark @x11 Some window managers will not respect the placement of - * initially hidden windows. - * - * @remark @x11 Due to the asynchronous nature of X11, it may take a moment for - * a window to reach its requested state. This means you may not be able to - * query the final size, position or other attributes directly after window - * creation. - * - * @remark @x11 The class part of the `WM_CLASS` window property will by - * default be set to the window title passed to this function. The instance - * part will use the contents of the `RESOURCE_NAME` environment variable, if - * present and not empty, or fall back to the window title. Set the - * [GLFW_X11_CLASS_NAME](@ref GLFW_X11_CLASS_NAME_hint) and - * [GLFW_X11_INSTANCE_NAME](@ref GLFW_X11_INSTANCE_NAME_hint) window hints to - * override this. - * - * @remark @wayland Compositors should implement the xdg-decoration protocol - * for GLFW to decorate the window properly. If this protocol isn't - * supported, or if the compositor prefers client-side decorations, a very - * simple fallback frame will be drawn using the wp_viewporter protocol. A - * compositor can still emit close, maximize or fullscreen events, using for - * instance a keybind mechanism. If neither of these protocols is supported, - * the window won't be decorated. - * - * @remark @wayland A full screen window will not attempt to change the mode, - * no matter what the requested size or refresh rate. - * - * @remark @wayland Screensaver inhibition requires the idle-inhibit protocol - * to be implemented in the user's compositor. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_creation - * @sa @ref glfwDestroyWindow - * - * @since Added in version 3.0. Replaces `glfwOpenWindow`. - * - * @ingroup window - */ -GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share); - -/*! @brief Destroys the specified window and its context. - * - * This function destroys the specified window and its context. On calling - * this function, no further callbacks will be called for that window. - * - * If the context of the specified window is current on the main thread, it is - * detached before being destroyed. - * - * @param[in] window The window to destroy. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @note The context of the specified window must not be current on any other - * thread when this function is called. - * - * @reentrancy This function must not be called from a callback. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_creation - * @sa @ref glfwCreateWindow - * - * @since Added in version 3.0. Replaces `glfwCloseWindow`. - * - * @ingroup window - */ -GLFWAPI void glfwDestroyWindow(GLFWwindow* window); - -/*! @brief Checks the close flag of the specified window. - * - * This function returns the value of the close flag of the specified window. - * - * @param[in] window The window to query. - * @return The value of the close flag. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @sa @ref window_close - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI int glfwWindowShouldClose(GLFWwindow* window); - -/*! @brief Sets the close flag of the specified window. - * - * This function sets the value of the close flag of the specified window. - * This can be used to override the user's attempt to close the window, or - * to signal that it should be closed. - * - * @param[in] window The window whose flag to change. - * @param[in] value The new value. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @sa @ref window_close - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowShouldClose(GLFWwindow* window, int value); - -/*! @brief Sets the title of the specified window. - * - * This function sets the window title, encoded as UTF-8, of the specified - * window. - * - * @param[in] window The window whose title to change. - * @param[in] title The UTF-8 encoded window title. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark @macos The window title will not be updated until the next time you - * process events. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_title - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowTitle(GLFWwindow* window, const char* title); - -/*! @brief Sets the icon for the specified window. - * - * This function sets the icon of the specified window. If passed an array of - * candidate images, those of or closest to the sizes desired by the system are - * selected. If no images are specified, the window reverts to its default - * icon. - * - * The pixels are 32-bit, little-endian, non-premultiplied RGBA, i.e. eight - * bits per channel with the red channel first. They are arranged canonically - * as packed sequential rows, starting from the top-left corner. - * - * The desired image sizes varies depending on platform and system settings. - * The selected images will be rescaled as needed. Good sizes include 16x16, - * 32x32 and 48x48. - * - * @param[in] window The window whose icon to set. - * @param[in] count The number of images in the specified array, or zero to - * revert to the default window icon. - * @param[in] images The images to create the icon from. This is ignored if - * count is zero. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The specified image data is copied before this function - * returns. - * - * @remark @macos The GLFW window has no icon, as it is not a document - * window, so this function does nothing. The dock icon will be the same as - * the application bundle's icon. For more information on bundles, see the - * [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/) - * in the Mac Developer Library. - * - * @remark @wayland There is no existing protocol to change an icon, the - * window will thus inherit the one defined in the application's desktop file. - * This function always emits @ref GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_icon - * - * @since Added in version 3.2. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowIcon(GLFWwindow* window, int count, const GLFWimage* images); - -/*! @brief Retrieves the position of the content area of the specified window. - * - * This function retrieves the position, in screen coordinates, of the - * upper-left corner of the content area of the specified window. - * - * Any or all of the position arguments may be `NULL`. If an error occurs, all - * non-`NULL` position arguments will be set to zero. - * - * @param[in] window The window to query. - * @param[out] xpos Where to store the x-coordinate of the upper-left corner of - * the content area, or `NULL`. - * @param[out] ypos Where to store the y-coordinate of the upper-left corner of - * the content area, or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark @wayland There is no way for an application to retrieve the global - * position of its windows, this function will always emit @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_pos - * @sa @ref glfwSetWindowPos - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos); - -/*! @brief Sets the position of the content area of the specified window. - * - * This function sets the position, in screen coordinates, of the upper-left - * corner of the content area of the specified windowed mode window. If the - * window is a full screen window, this function does nothing. - * - * __Do not use this function__ to move an already visible window unless you - * have very good reasons for doing so, as it will confuse and annoy the user. - * - * The window manager may put limits on what positions are allowed. GLFW - * cannot and should not override these limits. - * - * @param[in] window The window to query. - * @param[in] xpos The x-coordinate of the upper-left corner of the content area. - * @param[in] ypos The y-coordinate of the upper-left corner of the content area. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark @wayland There is no way for an application to set the global - * position of its windows, this function will always emit @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_pos - * @sa @ref glfwGetWindowPos - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowPos(GLFWwindow* window, int xpos, int ypos); - -/*! @brief Retrieves the size of the content area of the specified window. - * - * This function retrieves the size, in screen coordinates, of the content area - * of the specified window. If you wish to retrieve the size of the - * framebuffer of the window in pixels, see @ref glfwGetFramebufferSize. - * - * Any or all of the size arguments may be `NULL`. If an error occurs, all - * non-`NULL` size arguments will be set to zero. - * - * @param[in] window The window whose size to retrieve. - * @param[out] width Where to store the width, in screen coordinates, of the - * content area, or `NULL`. - * @param[out] height Where to store the height, in screen coordinates, of the - * content area, or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_size - * @sa @ref glfwSetWindowSize - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwGetWindowSize(GLFWwindow* window, int* width, int* height); - -/*! @brief Sets the size limits of the specified window. - * - * This function sets the size limits of the content area of the specified - * window. If the window is full screen, the size limits only take effect - * once it is made windowed. If the window is not resizable, this function - * does nothing. - * - * The size limits are applied immediately to a windowed mode window and may - * cause it to be resized. - * - * The maximum dimensions must be greater than or equal to the minimum - * dimensions and all must be greater than or equal to zero. - * - * @param[in] window The window to set limits for. - * @param[in] minwidth The minimum width, in screen coordinates, of the content - * area, or `GLFW_DONT_CARE`. - * @param[in] minheight The minimum height, in screen coordinates, of the - * content area, or `GLFW_DONT_CARE`. - * @param[in] maxwidth The maximum width, in screen coordinates, of the content - * area, or `GLFW_DONT_CARE`. - * @param[in] maxheight The maximum height, in screen coordinates, of the - * content area, or `GLFW_DONT_CARE`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. - * - * @remark If you set size limits and an aspect ratio that conflict, the - * results are undefined. - * - * @remark @wayland The size limits will not be applied until the window is - * actually resized, either by the user or by the compositor. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_sizelimits - * @sa @ref glfwSetWindowAspectRatio - * - * @since Added in version 3.2. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowSizeLimits(GLFWwindow* window, int minwidth, int minheight, int maxwidth, int maxheight); - -/*! @brief Sets the aspect ratio of the specified window. - * - * This function sets the required aspect ratio of the content area of the - * specified window. If the window is full screen, the aspect ratio only takes - * effect once it is made windowed. If the window is not resizable, this - * function does nothing. - * - * The aspect ratio is specified as a numerator and a denominator and both - * values must be greater than zero. For example, the common 16:9 aspect ratio - * is specified as 16 and 9, respectively. - * - * If the numerator and denominator is set to `GLFW_DONT_CARE` then the aspect - * ratio limit is disabled. - * - * The aspect ratio is applied immediately to a windowed mode window and may - * cause it to be resized. - * - * @param[in] window The window to set limits for. - * @param[in] numer The numerator of the desired aspect ratio, or - * `GLFW_DONT_CARE`. - * @param[in] denom The denominator of the desired aspect ratio, or - * `GLFW_DONT_CARE`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. - * - * @remark If you set size limits and an aspect ratio that conflict, the - * results are undefined. - * - * @remark @wayland The aspect ratio will not be applied until the window is - * actually resized, either by the user or by the compositor. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_sizelimits - * @sa @ref glfwSetWindowSizeLimits - * - * @since Added in version 3.2. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowAspectRatio(GLFWwindow* window, int numer, int denom); - -/*! @brief Sets the size of the content area of the specified window. - * - * This function sets the size, in screen coordinates, of the content area of - * the specified window. - * - * For full screen windows, this function updates the resolution of its desired - * video mode and switches to the video mode closest to it, without affecting - * the window's context. As the context is unaffected, the bit depths of the - * framebuffer remain unchanged. - * - * If you wish to update the refresh rate of the desired video mode in addition - * to its resolution, see @ref glfwSetWindowMonitor. - * - * The window manager may put limits on what sizes are allowed. GLFW cannot - * and should not override these limits. - * - * @param[in] window The window to resize. - * @param[in] width The desired width, in screen coordinates, of the window - * content area. - * @param[in] height The desired height, in screen coordinates, of the window - * content area. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark @wayland A full screen window will not attempt to change the mode, - * no matter what the requested size. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_size - * @sa @ref glfwGetWindowSize - * @sa @ref glfwSetWindowMonitor - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowSize(GLFWwindow* window, int width, int height); - -/*! @brief Retrieves the size of the framebuffer of the specified window. - * - * This function retrieves the size, in pixels, of the framebuffer of the - * specified window. If you wish to retrieve the size of the window in screen - * coordinates, see @ref glfwGetWindowSize. - * - * Any or all of the size arguments may be `NULL`. If an error occurs, all - * non-`NULL` size arguments will be set to zero. - * - * @param[in] window The window whose framebuffer to query. - * @param[out] width Where to store the width, in pixels, of the framebuffer, - * or `NULL`. - * @param[out] height Where to store the height, in pixels, of the framebuffer, - * or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_fbsize - * @sa @ref glfwSetFramebufferSizeCallback - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwGetFramebufferSize(GLFWwindow* window, int* width, int* height); - -/*! @brief Retrieves the size of the frame of the window. - * - * This function retrieves the size, in screen coordinates, of each edge of the - * frame of the specified window. This size includes the title bar, if the - * window has one. The size of the frame may vary depending on the - * [window-related hints](@ref window_hints_wnd) used to create it. - * - * Because this function retrieves the size of each window frame edge and not - * the offset along a particular coordinate axis, the retrieved values will - * always be zero or positive. - * - * Any or all of the size arguments may be `NULL`. If an error occurs, all - * non-`NULL` size arguments will be set to zero. - * - * @param[in] window The window whose frame size to query. - * @param[out] left Where to store the size, in screen coordinates, of the left - * edge of the window frame, or `NULL`. - * @param[out] top Where to store the size, in screen coordinates, of the top - * edge of the window frame, or `NULL`. - * @param[out] right Where to store the size, in screen coordinates, of the - * right edge of the window frame, or `NULL`. - * @param[out] bottom Where to store the size, in screen coordinates, of the - * bottom edge of the window frame, or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_size - * - * @since Added in version 3.1. - * - * @ingroup window - */ -GLFWAPI void glfwGetWindowFrameSize(GLFWwindow* window, int* left, int* top, int* right, int* bottom); - -/*! @brief Retrieves the content scale for the specified window. - * - * This function retrieves the content scale for the specified window. The - * content scale is the ratio between the current DPI and the platform's - * default DPI. This is especially important for text and any UI elements. If - * the pixel dimensions of your UI scaled by this look appropriate on your - * machine then it should appear at a reasonable size on other machines - * regardless of their DPI and scaling settings. This relies on the system DPI - * and scaling settings being somewhat correct. - * - * On systems where each monitors can have its own content scale, the window - * content scale will depend on which monitor the system considers the window - * to be on. - * - * @param[in] window The window to query. - * @param[out] xscale Where to store the x-axis content scale, or `NULL`. - * @param[out] yscale Where to store the y-axis content scale, or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_scale - * @sa @ref glfwSetWindowContentScaleCallback - * @sa @ref glfwGetMonitorContentScale - * - * @since Added in version 3.3. - * - * @ingroup window - */ -GLFWAPI void glfwGetWindowContentScale(GLFWwindow* window, float* xscale, float* yscale); - -/*! @brief Returns the opacity of the whole window. - * - * This function returns the opacity of the window, including any decorations. - * - * The opacity (or alpha) value is a positive finite number between zero and - * one, where zero is fully transparent and one is fully opaque. If the system - * does not support whole window transparency, this function always returns one. - * - * The initial opacity value for newly created windows is one. - * - * @param[in] window The window to query. - * @return The opacity value of the specified window. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_transparency - * @sa @ref glfwSetWindowOpacity - * - * @since Added in version 3.3. - * - * @ingroup window - */ -GLFWAPI float glfwGetWindowOpacity(GLFWwindow* window); - -/*! @brief Sets the opacity of the whole window. - * - * This function sets the opacity of the window, including any decorations. - * - * The opacity (or alpha) value is a positive finite number between zero and - * one, where zero is fully transparent and one is fully opaque. - * - * The initial opacity value for newly created windows is one. - * - * A window created with framebuffer transparency may not use whole window - * transparency. The results of doing this are undefined. - * - * @param[in] window The window to set the opacity for. - * @param[in] opacity The desired opacity of the specified window. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_transparency - * @sa @ref glfwGetWindowOpacity - * - * @since Added in version 3.3. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowOpacity(GLFWwindow* window, float opacity); - -/*! @brief Iconifies the specified window. - * - * This function iconifies (minimizes) the specified window if it was - * previously restored. If the window is already iconified, this function does - * nothing. - * - * If the specified window is a full screen window, GLFW restores the original - * video mode of the monitor. The window's desired video mode is set again - * when the window is restored. - * - * @param[in] window The window to iconify. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_iconify - * @sa @ref glfwRestoreWindow - * @sa @ref glfwMaximizeWindow - * - * @since Added in version 2.1. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwIconifyWindow(GLFWwindow* window); - -/*! @brief Restores the specified window. - * - * This function restores the specified window if it was previously iconified - * (minimized) or maximized. If the window is already restored, this function - * does nothing. - * - * If the specified window is an iconified full screen window, its desired - * video mode is set again for its monitor when the window is restored. - * - * @param[in] window The window to restore. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_iconify - * @sa @ref glfwIconifyWindow - * @sa @ref glfwMaximizeWindow - * - * @since Added in version 2.1. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwRestoreWindow(GLFWwindow* window); - -/*! @brief Maximizes the specified window. - * - * This function maximizes the specified window if it was previously not - * maximized. If the window is already maximized, this function does nothing. - * - * If the specified window is a full screen window, this function does nothing. - * - * @param[in] window The window to maximize. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_iconify - * @sa @ref glfwIconifyWindow - * @sa @ref glfwRestoreWindow - * - * @since Added in GLFW 3.2. - * - * @ingroup window - */ -GLFWAPI void glfwMaximizeWindow(GLFWwindow* window); - -/*! @brief Makes the specified window visible. - * - * This function makes the specified window visible if it was previously - * hidden. If the window is already visible or is in full screen mode, this - * function does nothing. - * - * By default, windowed mode windows are focused when shown - * Set the [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_hint) window hint - * to change this behavior for all newly created windows, or change the - * behavior for an existing window with @ref glfwSetWindowAttrib. - * - * @param[in] window The window to make visible. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark @wayland Because Wayland wants every frame of the desktop to be - * complete, this function does not immediately make the window visible. - * Instead it will become visible the next time the window framebuffer is - * updated after this call. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_hide - * @sa @ref glfwHideWindow - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwShowWindow(GLFWwindow* window); - -/*! @brief Hides the specified window. - * - * This function hides the specified window if it was previously visible. If - * the window is already hidden or is in full screen mode, this function does - * nothing. - * - * @param[in] window The window to hide. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_hide - * @sa @ref glfwShowWindow - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwHideWindow(GLFWwindow* window); - -/*! @brief Brings the specified window to front and sets input focus. - * - * This function brings the specified window to front and sets input focus. - * The window should already be visible and not iconified. - * - * By default, both windowed and full screen mode windows are focused when - * initially created. Set the [GLFW_FOCUSED](@ref GLFW_FOCUSED_hint) to - * disable this behavior. - * - * Also by default, windowed mode windows are focused when shown - * with @ref glfwShowWindow. Set the - * [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_hint) to disable this behavior. - * - * __Do not use this function__ to steal focus from other applications unless - * you are certain that is what the user wants. Focus stealing can be - * extremely disruptive. - * - * For a less disruptive way of getting the user's attention, see - * [attention requests](@ref window_attention). - * - * @param[in] window The window to give input focus. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark @wayland It is not possible for an application to bring its windows - * to front, this function will always emit @ref GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_focus - * @sa @ref window_attention - * - * @since Added in version 3.2. - * - * @ingroup window - */ -GLFWAPI void glfwFocusWindow(GLFWwindow* window); - -/*! @brief Requests user attention to the specified window. - * - * This function requests user attention to the specified window. On - * platforms where this is not supported, attention is requested to the - * application as a whole. - * - * Once the user has given attention, usually by focusing the window or - * application, the system will end the request automatically. - * - * @param[in] window The window to request attention to. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark @macos Attention is requested to the application as a whole, not the - * specific window. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_attention - * - * @since Added in version 3.3. - * - * @ingroup window - */ -GLFWAPI void glfwRequestWindowAttention(GLFWwindow* window); - -/*! @brief Returns the monitor that the window uses for full screen mode. - * - * This function returns the handle of the monitor that the specified window is - * in full screen on. - * - * @param[in] window The window to query. - * @return The monitor, or `NULL` if the window is in windowed mode or an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_monitor - * @sa @ref glfwSetWindowMonitor - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* window); - -/*! @brief Sets the mode, monitor, video mode and placement of a window. - * - * This function sets the monitor that the window uses for full screen mode or, - * if the monitor is `NULL`, makes it windowed mode. - * - * When setting a monitor, this function updates the width, height and refresh - * rate of the desired video mode and switches to the video mode closest to it. - * The window position is ignored when setting a monitor. - * - * When the monitor is `NULL`, the position, width and height are used to - * place the window content area. The refresh rate is ignored when no monitor - * is specified. - * - * If you only wish to update the resolution of a full screen window or the - * size of a windowed mode window, see @ref glfwSetWindowSize. - * - * When a window transitions from full screen to windowed mode, this function - * restores any previous window settings such as whether it is decorated, - * floating, resizable, has size or aspect ratio limits, etc. - * - * @param[in] window The window whose monitor, size or video mode to set. - * @param[in] monitor The desired monitor, or `NULL` to set windowed mode. - * @param[in] xpos The desired x-coordinate of the upper-left corner of the - * content area. - * @param[in] ypos The desired y-coordinate of the upper-left corner of the - * content area. - * @param[in] width The desired with, in screen coordinates, of the content - * area or video mode. - * @param[in] height The desired height, in screen coordinates, of the content - * area or video mode. - * @param[in] refreshRate The desired refresh rate, in Hz, of the video mode, - * or `GLFW_DONT_CARE`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark The OpenGL or OpenGL ES context will not be destroyed or otherwise - * affected by any resizing or mode switching, although you may need to update - * your viewport if the framebuffer size has changed. - * - * @remark @wayland The desired window position is ignored, as there is no way - * for an application to set this property. - * - * @remark @wayland Setting the window to full screen will not attempt to - * change the mode, no matter what the requested size or refresh rate. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_monitor - * @sa @ref window_full_screen - * @sa @ref glfwGetWindowMonitor - * @sa @ref glfwSetWindowSize - * - * @since Added in version 3.2. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowMonitor(GLFWwindow* window, GLFWmonitor* monitor, int xpos, int ypos, int width, int height, int refreshRate); - -/*! @brief Returns an attribute of the specified window. - * - * This function returns the value of an attribute of the specified window or - * its OpenGL or OpenGL ES context. - * - * @param[in] window The window to query. - * @param[in] attrib The [window attribute](@ref window_attribs) whose value to - * return. - * @return The value of the attribute, or zero if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. - * - * @remark Framebuffer related hints are not window attributes. See @ref - * window_attribs_fb for more information. - * - * @remark Zero is a valid value for many window and context related - * attributes so you cannot use a return value of zero as an indication of - * errors. However, this function should not fail as long as it is passed - * valid arguments and the library has been [initialized](@ref intro_init). - * - * @remark @wayland The Wayland protocol provides no way to check whether a - * window is iconfied, so @ref GLFW_ICONIFIED always returns `GLFW_FALSE`. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_attribs - * @sa @ref glfwSetWindowAttrib - * - * @since Added in version 3.0. Replaces `glfwGetWindowParam` and - * `glfwGetGLVersion`. - * - * @ingroup window - */ -GLFWAPI int glfwGetWindowAttrib(GLFWwindow* window, int attrib); - -/*! @brief Sets an attribute of the specified window. - * - * This function sets the value of an attribute of the specified window. - * - * The supported attributes are [GLFW_DECORATED](@ref GLFW_DECORATED_attrib), - * [GLFW_RESIZABLE](@ref GLFW_RESIZABLE_attrib), - * [GLFW_FLOATING](@ref GLFW_FLOATING_attrib), - * [GLFW_AUTO_ICONIFY](@ref GLFW_AUTO_ICONIFY_attrib) and - * [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_attrib). - * - * Some of these attributes are ignored for full screen windows. The new - * value will take effect if the window is later made windowed. - * - * Some of these attributes are ignored for windowed mode windows. The new - * value will take effect if the window is later made full screen. - * - * @param[in] window The window to set the attribute for. - * @param[in] attrib A supported window attribute. - * @param[in] value `GLFW_TRUE` or `GLFW_FALSE`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM, @ref GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. - * - * @remark Calling @ref glfwGetWindowAttrib will always return the latest - * value, even if that value is ignored by the current mode of the window. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_attribs - * @sa @ref glfwGetWindowAttrib - * - * @since Added in version 3.3. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowAttrib(GLFWwindow* window, int attrib, int value); - -/*! @brief Sets the user pointer of the specified window. - * - * This function sets the user-defined pointer of the specified window. The - * current value is retained until the window is destroyed. The initial value - * is `NULL`. - * - * @param[in] window The window whose pointer to set. - * @param[in] pointer The new value. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @sa @ref window_userptr - * @sa @ref glfwGetWindowUserPointer - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowUserPointer(GLFWwindow* window, void* pointer); - -/*! @brief Returns the user pointer of the specified window. - * - * This function returns the current value of the user-defined pointer of the - * specified window. The initial value is `NULL`. - * - * @param[in] window The window whose pointer to return. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @sa @ref window_userptr - * @sa @ref glfwSetWindowUserPointer - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow* window); - -/*! @brief Sets the position callback for the specified window. - * - * This function sets the position callback of the specified window, which is - * called when the window is moved. The callback is provided with the - * position, in screen coordinates, of the upper-left corner of the content - * area of the window. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, int xpos, int ypos) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWwindowposfun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @remark @wayland This callback will never be called, as there is no way for - * an application to know its global position. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_pos - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* window, GLFWwindowposfun callback); - -/*! @brief Sets the size callback for the specified window. - * - * This function sets the size callback of the specified window, which is - * called when the window is resized. The callback is provided with the size, - * in screen coordinates, of the content area of the window. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, int width, int height) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWwindowsizefun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_size - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter and return value. - * - * @ingroup window - */ -GLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwindowsizefun callback); - -/*! @brief Sets the close callback for the specified window. - * - * This function sets the close callback of the specified window, which is - * called when the user attempts to close the window, for example by clicking - * the close widget in the title bar. - * - * The close flag is set before this callback is called, but you can modify it - * at any time with @ref glfwSetWindowShouldClose. - * - * The close callback is not triggered by @ref glfwDestroyWindow. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWwindowclosefun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @remark @macos Selecting Quit from the application menu will trigger the - * close callback for all windows. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_close - * - * @since Added in version 2.5. - * @glfw3 Added window handle parameter and return value. - * - * @ingroup window - */ -GLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* window, GLFWwindowclosefun callback); - -/*! @brief Sets the refresh callback for the specified window. - * - * This function sets the refresh callback of the specified window, which is - * called when the content area of the window needs to be redrawn, for example - * if the window has been exposed after having been covered by another window. - * - * On compositing window systems such as Aero, Compiz, Aqua or Wayland, where - * the window contents are saved off-screen, this callback may be called only - * very infrequently or never at all. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window); - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWwindowrefreshfun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_refresh - * - * @since Added in version 2.5. - * @glfw3 Added window handle parameter and return value. - * - * @ingroup window - */ -GLFWAPI GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* window, GLFWwindowrefreshfun callback); - -/*! @brief Sets the focus callback for the specified window. - * - * This function sets the focus callback of the specified window, which is - * called when the window gains or loses input focus. - * - * After the focus callback is called for a window that lost input focus, - * synthetic key and mouse button release events will be generated for all such - * that had been pressed. For more information, see @ref glfwSetKeyCallback - * and @ref glfwSetMouseButtonCallback. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, int focused) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWwindowfocusfun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_focus - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* window, GLFWwindowfocusfun callback); - -/*! @brief Sets the iconify callback for the specified window. - * - * This function sets the iconification callback of the specified window, which - * is called when the window is iconified or restored. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, int iconified) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWwindowiconifyfun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @remark @wayland The XDG-shell protocol has no event for iconification, so - * this callback will never be called. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_iconify - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* window, GLFWwindowiconifyfun callback); - -/*! @brief Sets the maximize callback for the specified window. - * - * This function sets the maximization callback of the specified window, which - * is called when the window is maximized or restored. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, int maximized) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWwindowmaximizefun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_maximize - * - * @since Added in version 3.3. - * - * @ingroup window - */ -GLFWAPI GLFWwindowmaximizefun glfwSetWindowMaximizeCallback(GLFWwindow* window, GLFWwindowmaximizefun callback); - -/*! @brief Sets the framebuffer resize callback for the specified window. - * - * This function sets the framebuffer resize callback of the specified window, - * which is called when the framebuffer of the specified window is resized. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, int width, int height) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWframebuffersizefun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_fbsize - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* window, GLFWframebuffersizefun callback); - -/*! @brief Sets the window content scale callback for the specified window. - * - * This function sets the window content scale callback of the specified window, - * which is called when the content scale of the specified window changes. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, float xscale, float yscale) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWwindowcontentscalefun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_scale - * @sa @ref glfwGetWindowContentScale - * - * @since Added in version 3.3. - * - * @ingroup window - */ -GLFWAPI GLFWwindowcontentscalefun glfwSetWindowContentScaleCallback(GLFWwindow* window, GLFWwindowcontentscalefun callback); - -/*! @brief Processes all pending events. - * - * This function processes only those events that are already in the event - * queue and then returns immediately. Processing events will cause the window - * and input callbacks associated with those events to be called. - * - * On some platforms, a window move, resize or menu operation will cause event - * processing to block. This is due to how event processing is designed on - * those platforms. You can use the - * [window refresh callback](@ref window_refresh) to redraw the contents of - * your window when necessary during such operations. - * - * Do not assume that callbacks you set will _only_ be called in response to - * event processing functions like this one. While it is necessary to poll for - * events, window systems that require GLFW to register callbacks of its own - * can pass events to GLFW in response to many window system function calls. - * GLFW will pass those events on to the application callbacks before - * returning. - * - * Event processing is not required for joystick input to work. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @reentrancy This function must not be called from a callback. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref events - * @sa @ref glfwWaitEvents - * @sa @ref glfwWaitEventsTimeout - * - * @since Added in version 1.0. - * - * @ingroup window - */ -GLFWAPI void glfwPollEvents(void); - -/*! @brief Waits until events are queued and processes them. - * - * This function puts the calling thread to sleep until at least one event is - * available in the event queue. Once one or more events are available, - * it behaves exactly like @ref glfwPollEvents, i.e. the events in the queue - * are processed and the function then returns immediately. Processing events - * will cause the window and input callbacks associated with those events to be - * called. - * - * Since not all events are associated with callbacks, this function may return - * without a callback having been called even if you are monitoring all - * callbacks. - * - * On some platforms, a window move, resize or menu operation will cause event - * processing to block. This is due to how event processing is designed on - * those platforms. You can use the - * [window refresh callback](@ref window_refresh) to redraw the contents of - * your window when necessary during such operations. - * - * Do not assume that callbacks you set will _only_ be called in response to - * event processing functions like this one. While it is necessary to poll for - * events, window systems that require GLFW to register callbacks of its own - * can pass events to GLFW in response to many window system function calls. - * GLFW will pass those events on to the application callbacks before - * returning. - * - * Event processing is not required for joystick input to work. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @reentrancy This function must not be called from a callback. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref events - * @sa @ref glfwPollEvents - * @sa @ref glfwWaitEventsTimeout - * - * @since Added in version 2.5. - * - * @ingroup window - */ -GLFWAPI void glfwWaitEvents(void); - -/*! @brief Waits with timeout until events are queued and processes them. - * - * This function puts the calling thread to sleep until at least one event is - * available in the event queue, or until the specified timeout is reached. If - * one or more events are available, it behaves exactly like @ref - * glfwPollEvents, i.e. the events in the queue are processed and the function - * then returns immediately. Processing events will cause the window and input - * callbacks associated with those events to be called. - * - * The timeout value must be a positive finite number. - * - * Since not all events are associated with callbacks, this function may return - * without a callback having been called even if you are monitoring all - * callbacks. - * - * On some platforms, a window move, resize or menu operation will cause event - * processing to block. This is due to how event processing is designed on - * those platforms. You can use the - * [window refresh callback](@ref window_refresh) to redraw the contents of - * your window when necessary during such operations. - * - * Do not assume that callbacks you set will _only_ be called in response to - * event processing functions like this one. While it is necessary to poll for - * events, window systems that require GLFW to register callbacks of its own - * can pass events to GLFW in response to many window system function calls. - * GLFW will pass those events on to the application callbacks before - * returning. - * - * Event processing is not required for joystick input to work. - * - * @param[in] timeout The maximum amount of time, in seconds, to wait. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. - * - * @reentrancy This function must not be called from a callback. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref events - * @sa @ref glfwPollEvents - * @sa @ref glfwWaitEvents - * - * @since Added in version 3.2. - * - * @ingroup window - */ -GLFWAPI void glfwWaitEventsTimeout(double timeout); - -/*! @brief Posts an empty event to the event queue. - * - * This function posts an empty event from the current thread to the event - * queue, causing @ref glfwWaitEvents or @ref glfwWaitEventsTimeout to return. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref events - * @sa @ref glfwWaitEvents - * @sa @ref glfwWaitEventsTimeout - * - * @since Added in version 3.1. - * - * @ingroup window - */ -GLFWAPI void glfwPostEmptyEvent(void); - -/*! @brief Returns the value of an input option for the specified window. - * - * This function returns the value of an input option for the specified window. - * The mode must be one of @ref GLFW_CURSOR, @ref GLFW_STICKY_KEYS, - * @ref GLFW_STICKY_MOUSE_BUTTONS, @ref GLFW_LOCK_KEY_MODS or - * @ref GLFW_RAW_MOUSE_MOTION. - * - * @param[in] window The window to query. - * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS`, - * `GLFW_STICKY_MOUSE_BUTTONS`, `GLFW_LOCK_KEY_MODS` or - * `GLFW_RAW_MOUSE_MOTION`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_INVALID_ENUM. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref glfwSetInputMode - * - * @since Added in version 3.0. - * - * @ingroup input - */ -GLFWAPI int glfwGetInputMode(GLFWwindow* window, int mode); - -/*! @brief Sets an input option for the specified window. - * - * This function sets an input mode option for the specified window. The mode - * must be one of @ref GLFW_CURSOR, @ref GLFW_STICKY_KEYS, - * @ref GLFW_STICKY_MOUSE_BUTTONS, @ref GLFW_LOCK_KEY_MODS or - * @ref GLFW_RAW_MOUSE_MOTION. - * - * If the mode is `GLFW_CURSOR`, the value must be one of the following cursor - * modes: - * - `GLFW_CURSOR_NORMAL` makes the cursor visible and behaving normally. - * - `GLFW_CURSOR_HIDDEN` makes the cursor invisible when it is over the - * content area of the window but does not restrict the cursor from leaving. - * - `GLFW_CURSOR_DISABLED` hides and grabs the cursor, providing virtual - * and unlimited cursor movement. This is useful for implementing for - * example 3D camera controls. - * - * If the mode is `GLFW_STICKY_KEYS`, the value must be either `GLFW_TRUE` to - * enable sticky keys, or `GLFW_FALSE` to disable it. If sticky keys are - * enabled, a key press will ensure that @ref glfwGetKey returns `GLFW_PRESS` - * the next time it is called even if the key had been released before the - * call. This is useful when you are only interested in whether keys have been - * pressed but not when or in which order. - * - * If the mode is `GLFW_STICKY_MOUSE_BUTTONS`, the value must be either - * `GLFW_TRUE` to enable sticky mouse buttons, or `GLFW_FALSE` to disable it. - * If sticky mouse buttons are enabled, a mouse button press will ensure that - * @ref glfwGetMouseButton returns `GLFW_PRESS` the next time it is called even - * if the mouse button had been released before the call. This is useful when - * you are only interested in whether mouse buttons have been pressed but not - * when or in which order. - * - * If the mode is `GLFW_LOCK_KEY_MODS`, the value must be either `GLFW_TRUE` to - * enable lock key modifier bits, or `GLFW_FALSE` to disable them. If enabled, - * callbacks that receive modifier bits will also have the @ref - * GLFW_MOD_CAPS_LOCK bit set when the event was generated with Caps Lock on, - * and the @ref GLFW_MOD_NUM_LOCK bit when Num Lock was on. - * - * If the mode is `GLFW_RAW_MOUSE_MOTION`, the value must be either `GLFW_TRUE` - * to enable raw (unscaled and unaccelerated) mouse motion when the cursor is - * disabled, or `GLFW_FALSE` to disable it. If raw motion is not supported, - * attempting to set this will emit @ref GLFW_PLATFORM_ERROR. Call @ref - * glfwRawMouseMotionSupported to check for support. - * - * @param[in] window The window whose input mode to set. - * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS`, - * `GLFW_STICKY_MOUSE_BUTTONS`, `GLFW_LOCK_KEY_MODS` or - * `GLFW_RAW_MOUSE_MOTION`. - * @param[in] value The new value of the specified input mode. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref glfwGetInputMode - * - * @since Added in version 3.0. Replaces `glfwEnable` and `glfwDisable`. - * - * @ingroup input - */ -GLFWAPI void glfwSetInputMode(GLFWwindow* window, int mode, int value); - -/*! @brief Returns whether raw mouse motion is supported. - * - * This function returns whether raw mouse motion is supported on the current - * system. This status does not change after GLFW has been initialized so you - * only need to check this once. If you attempt to enable raw motion on - * a system that does not support it, @ref GLFW_PLATFORM_ERROR will be emitted. - * - * Raw mouse motion is closer to the actual motion of the mouse across - * a surface. It is not affected by the scaling and acceleration applied to - * the motion of the desktop cursor. That processing is suitable for a cursor - * while raw motion is better for controlling for example a 3D camera. Because - * of this, raw mouse motion is only provided when the cursor is disabled. - * - * @return `GLFW_TRUE` if raw mouse motion is supported on the current machine, - * or `GLFW_FALSE` otherwise. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref raw_mouse_motion - * @sa @ref glfwSetInputMode - * - * @since Added in version 3.3. - * - * @ingroup input - */ -GLFWAPI int glfwRawMouseMotionSupported(void); - -/*! @brief Returns the layout-specific name of the specified printable key. - * - * This function returns the name of the specified printable key, encoded as - * UTF-8. This is typically the character that key would produce without any - * modifier keys, intended for displaying key bindings to the user. For dead - * keys, it is typically the diacritic it would add to a character. - * - * __Do not use this function__ for [text input](@ref input_char). You will - * break text input for many languages even if it happens to work for yours. - * - * If the key is `GLFW_KEY_UNKNOWN`, the scancode is used to identify the key, - * otherwise the scancode is ignored. If you specify a non-printable key, or - * `GLFW_KEY_UNKNOWN` and a scancode that maps to a non-printable key, this - * function returns `NULL` but does not emit an error. - * - * This behavior allows you to always pass in the arguments in the - * [key callback](@ref input_key) without modification. - * - * The printable keys are: - * - `GLFW_KEY_APOSTROPHE` - * - `GLFW_KEY_COMMA` - * - `GLFW_KEY_MINUS` - * - `GLFW_KEY_PERIOD` - * - `GLFW_KEY_SLASH` - * - `GLFW_KEY_SEMICOLON` - * - `GLFW_KEY_EQUAL` - * - `GLFW_KEY_LEFT_BRACKET` - * - `GLFW_KEY_RIGHT_BRACKET` - * - `GLFW_KEY_BACKSLASH` - * - `GLFW_KEY_WORLD_1` - * - `GLFW_KEY_WORLD_2` - * - `GLFW_KEY_0` to `GLFW_KEY_9` - * - `GLFW_KEY_A` to `GLFW_KEY_Z` - * - `GLFW_KEY_KP_0` to `GLFW_KEY_KP_9` - * - `GLFW_KEY_KP_DECIMAL` - * - `GLFW_KEY_KP_DIVIDE` - * - `GLFW_KEY_KP_MULTIPLY` - * - `GLFW_KEY_KP_SUBTRACT` - * - `GLFW_KEY_KP_ADD` - * - `GLFW_KEY_KP_EQUAL` - * - * Names for printable keys depend on keyboard layout, while names for - * non-printable keys are the same across layouts but depend on the application - * language and should be localized along with other user interface text. - * - * @param[in] key The key to query, or `GLFW_KEY_UNKNOWN`. - * @param[in] scancode The scancode of the key to query. - * @return The UTF-8 encoded, layout-specific name of the key, or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark The contents of the returned string may change when a keyboard - * layout change event is received. - * - * @pointer_lifetime The returned string is allocated and freed by GLFW. You - * should not free it yourself. It is valid until the library is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref input_key_name - * - * @since Added in version 3.2. - * - * @ingroup input - */ -GLFWAPI const char* glfwGetKeyName(int key, int scancode); - -/*! @brief Returns the platform-specific scancode of the specified key. - * - * This function returns the platform-specific scancode of the specified key. - * - * If the key is `GLFW_KEY_UNKNOWN` or does not exist on the keyboard this - * method will return `-1`. - * - * @param[in] key Any [named key](@ref keys). - * @return The platform-specific scancode for the key, or `-1` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref input_key - * - * @since Added in version 3.3. - * - * @ingroup input - */ -GLFWAPI int glfwGetKeyScancode(int key); - -/*! @brief Returns the last reported state of a keyboard key for the specified - * window. - * - * This function returns the last state reported for the specified key to the - * specified window. The returned state is one of `GLFW_PRESS` or - * `GLFW_RELEASE`. The action `GLFW_REPEAT` is only reported to the key callback. - * - * If the @ref GLFW_STICKY_KEYS input mode is enabled, this function returns - * `GLFW_PRESS` the first time you call it for a key that was pressed, even if - * that key has already been released. - * - * The key functions deal with physical keys, with [key tokens](@ref keys) - * named after their use on the standard US keyboard layout. If you want to - * input text, use the Unicode character callback instead. - * - * The [modifier key bit masks](@ref mods) are not key tokens and cannot be - * used with this function. - * - * __Do not use this function__ to implement [text input](@ref input_char). - * - * @param[in] window The desired window. - * @param[in] key The desired [keyboard key](@ref keys). `GLFW_KEY_UNKNOWN` is - * not a valid key for this function. - * @return One of `GLFW_PRESS` or `GLFW_RELEASE`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_INVALID_ENUM. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref input_key - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter. - * - * @ingroup input - */ -GLFWAPI int glfwGetKey(GLFWwindow* window, int key); - -/*! @brief Returns the last reported state of a mouse button for the specified - * window. - * - * This function returns the last state reported for the specified mouse button - * to the specified window. The returned state is one of `GLFW_PRESS` or - * `GLFW_RELEASE`. - * - * If the @ref GLFW_STICKY_MOUSE_BUTTONS input mode is enabled, this function - * returns `GLFW_PRESS` the first time you call it for a mouse button that was - * pressed, even if that mouse button has already been released. - * - * @param[in] window The desired window. - * @param[in] button The desired [mouse button](@ref buttons). - * @return One of `GLFW_PRESS` or `GLFW_RELEASE`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_INVALID_ENUM. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref input_mouse_button - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter. - * - * @ingroup input - */ -GLFWAPI int glfwGetMouseButton(GLFWwindow* window, int button); - -/*! @brief Retrieves the position of the cursor relative to the content area of - * the window. - * - * This function returns the position of the cursor, in screen coordinates, - * relative to the upper-left corner of the content area of the specified - * window. - * - * If the cursor is disabled (with `GLFW_CURSOR_DISABLED`) then the cursor - * position is unbounded and limited only by the minimum and maximum values of - * a `double`. - * - * The coordinate can be converted to their integer equivalents with the - * `floor` function. Casting directly to an integer type works for positive - * coordinates, but fails for negative ones. - * - * Any or all of the position arguments may be `NULL`. If an error occurs, all - * non-`NULL` position arguments will be set to zero. - * - * @param[in] window The desired window. - * @param[out] xpos Where to store the cursor x-coordinate, relative to the - * left edge of the content area, or `NULL`. - * @param[out] ypos Where to store the cursor y-coordinate, relative to the to - * top edge of the content area, or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref cursor_pos - * @sa @ref glfwSetCursorPos - * - * @since Added in version 3.0. Replaces `glfwGetMousePos`. - * - * @ingroup input - */ -GLFWAPI void glfwGetCursorPos(GLFWwindow* window, double* xpos, double* ypos); - -/*! @brief Sets the position of the cursor, relative to the content area of the - * window. - * - * This function sets the position, in screen coordinates, of the cursor - * relative to the upper-left corner of the content area of the specified - * window. The window must have input focus. If the window does not have - * input focus when this function is called, it fails silently. - * - * __Do not use this function__ to implement things like camera controls. GLFW - * already provides the `GLFW_CURSOR_DISABLED` cursor mode that hides the - * cursor, transparently re-centers it and provides unconstrained cursor - * motion. See @ref glfwSetInputMode for more information. - * - * If the cursor mode is `GLFW_CURSOR_DISABLED` then the cursor position is - * unconstrained and limited only by the minimum and maximum values of - * a `double`. - * - * @param[in] window The desired window. - * @param[in] xpos The desired x-coordinate, relative to the left edge of the - * content area. - * @param[in] ypos The desired y-coordinate, relative to the top edge of the - * content area. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark @wayland This function will only work when the cursor mode is - * `GLFW_CURSOR_DISABLED`, otherwise it will do nothing. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref cursor_pos - * @sa @ref glfwGetCursorPos - * - * @since Added in version 3.0. Replaces `glfwSetMousePos`. - * - * @ingroup input - */ -GLFWAPI void glfwSetCursorPos(GLFWwindow* window, double xpos, double ypos); - -/*! @brief Creates a custom cursor. - * - * Creates a new custom cursor image that can be set for a window with @ref - * glfwSetCursor. The cursor can be destroyed with @ref glfwDestroyCursor. - * Any remaining cursors are destroyed by @ref glfwTerminate. - * - * The pixels are 32-bit, little-endian, non-premultiplied RGBA, i.e. eight - * bits per channel with the red channel first. They are arranged canonically - * as packed sequential rows, starting from the top-left corner. - * - * The cursor hotspot is specified in pixels, relative to the upper-left corner - * of the cursor image. Like all other coordinate systems in GLFW, the X-axis - * points to the right and the Y-axis points down. - * - * @param[in] image The desired cursor image. - * @param[in] xhot The desired x-coordinate, in pixels, of the cursor hotspot. - * @param[in] yhot The desired y-coordinate, in pixels, of the cursor hotspot. - * @return The handle of the created cursor, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The specified image data is copied before this function - * returns. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref cursor_object - * @sa @ref glfwDestroyCursor - * @sa @ref glfwCreateStandardCursor - * - * @since Added in version 3.1. - * - * @ingroup input - */ -GLFWAPI GLFWcursor* glfwCreateCursor(const GLFWimage* image, int xhot, int yhot); - -/*! @brief Creates a cursor with a standard shape. - * - * Returns a cursor with a [standard shape](@ref shapes), that can be set for - * a window with @ref glfwSetCursor. - * - * @param[in] shape One of the [standard shapes](@ref shapes). - * @return A new cursor ready to use or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref cursor_object - * @sa @ref glfwCreateCursor - * - * @since Added in version 3.1. - * - * @ingroup input - */ -GLFWAPI GLFWcursor* glfwCreateStandardCursor(int shape); - -/*! @brief Destroys a cursor. - * - * This function destroys a cursor previously created with @ref - * glfwCreateCursor. Any remaining cursors will be destroyed by @ref - * glfwTerminate. - * - * If the specified cursor is current for any window, that window will be - * reverted to the default cursor. This does not affect the cursor mode. - * - * @param[in] cursor The cursor object to destroy. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @reentrancy This function must not be called from a callback. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref cursor_object - * @sa @ref glfwCreateCursor - * - * @since Added in version 3.1. - * - * @ingroup input - */ -GLFWAPI void glfwDestroyCursor(GLFWcursor* cursor); - -/*! @brief Sets the cursor for the window. - * - * This function sets the cursor image to be used when the cursor is over the - * content area of the specified window. The set cursor will only be visible - * when the [cursor mode](@ref cursor_mode) of the window is - * `GLFW_CURSOR_NORMAL`. - * - * On some platforms, the set cursor may not be visible unless the window also - * has input focus. - * - * @param[in] window The window to set the cursor for. - * @param[in] cursor The cursor to set, or `NULL` to switch back to the default - * arrow cursor. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref cursor_object - * - * @since Added in version 3.1. - * - * @ingroup input - */ -GLFWAPI void glfwSetCursor(GLFWwindow* window, GLFWcursor* cursor); - -/*! @brief Sets the key callback. - * - * This function sets the key callback of the specified window, which is called - * when a key is pressed, repeated or released. - * - * The key functions deal with physical keys, with layout independent - * [key tokens](@ref keys) named after their values in the standard US keyboard - * layout. If you want to input text, use the - * [character callback](@ref glfwSetCharCallback) instead. - * - * When a window loses input focus, it will generate synthetic key release - * events for all pressed keys. You can tell these events from user-generated - * events by the fact that the synthetic ones are generated after the focus - * loss event has been processed, i.e. after the - * [window focus callback](@ref glfwSetWindowFocusCallback) has been called. - * - * The scancode of a key is specific to that platform or sometimes even to that - * machine. Scancodes are intended to allow users to bind keys that don't have - * a GLFW key token. Such keys have `key` set to `GLFW_KEY_UNKNOWN`, their - * state is not saved and so it cannot be queried with @ref glfwGetKey. - * - * Sometimes GLFW needs to generate synthetic key events, in which case the - * scancode may be zero. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new key callback, or `NULL` to remove the currently - * set callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, int key, int scancode, int action, int mods) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWkeyfun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref input_key - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter and return value. - * - * @ingroup input - */ -GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun callback); - -/*! @brief Sets the Unicode character callback. - * - * This function sets the character callback of the specified window, which is - * called when a Unicode character is input. - * - * The character callback is intended for Unicode text input. As it deals with - * characters, it is keyboard layout dependent, whereas the - * [key callback](@ref glfwSetKeyCallback) is not. Characters do not map 1:1 - * to physical keys, as a key may produce zero, one or more characters. If you - * want to know whether a specific physical key was pressed or released, see - * the key callback instead. - * - * The character callback behaves as system text input normally does and will - * not be called if modifier keys are held down that would prevent normal text - * input on that platform, for example a Super (Command) key on macOS or Alt key - * on Windows. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, unsigned int codepoint) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWcharfun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref input_char - * - * @since Added in version 2.4. - * @glfw3 Added window handle parameter and return value. - * - * @ingroup input - */ -GLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* window, GLFWcharfun callback); - -/*! @brief Sets the Unicode character with modifiers callback. - * - * This function sets the character with modifiers callback of the specified - * window, which is called when a Unicode character is input regardless of what - * modifier keys are used. - * - * The character with modifiers callback is intended for implementing custom - * Unicode character input. For regular Unicode text input, see the - * [character callback](@ref glfwSetCharCallback). Like the character - * callback, the character with modifiers callback deals with characters and is - * keyboard layout dependent. Characters do not map 1:1 to physical keys, as - * a key may produce zero, one or more characters. If you want to know whether - * a specific physical key was pressed or released, see the - * [key callback](@ref glfwSetKeyCallback) instead. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or an - * [error](@ref error_handling) occurred. - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, unsigned int codepoint, int mods) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWcharmodsfun). - * - * @deprecated Scheduled for removal in version 4.0. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref input_char - * - * @since Added in version 3.1. - * - * @ingroup input - */ -GLFWAPI GLFWcharmodsfun glfwSetCharModsCallback(GLFWwindow* window, GLFWcharmodsfun callback); - -/*! @brief Sets the mouse button callback. - * - * This function sets the mouse button callback of the specified window, which - * is called when a mouse button is pressed or released. - * - * When a window loses input focus, it will generate synthetic mouse button - * release events for all pressed mouse buttons. You can tell these events - * from user-generated events by the fact that the synthetic ones are generated - * after the focus loss event has been processed, i.e. after the - * [window focus callback](@ref glfwSetWindowFocusCallback) has been called. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, int button, int action, int mods) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWmousebuttonfun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref input_mouse_button - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter and return value. - * - * @ingroup input - */ -GLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* window, GLFWmousebuttonfun callback); - -/*! @brief Sets the cursor position callback. - * - * This function sets the cursor position callback of the specified window, - * which is called when the cursor is moved. The callback is provided with the - * position, in screen coordinates, relative to the upper-left corner of the - * content area of the window. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, double xpos, double ypos); - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWcursorposfun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref cursor_pos - * - * @since Added in version 3.0. Replaces `glfwSetMousePosCallback`. - * - * @ingroup input - */ -GLFWAPI GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* window, GLFWcursorposfun callback); - -/*! @brief Sets the cursor enter/leave callback. - * - * This function sets the cursor boundary crossing callback of the specified - * window, which is called when the cursor enters or leaves the content area of - * the window. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, int entered) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWcursorenterfun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref cursor_enter - * - * @since Added in version 3.0. - * - * @ingroup input - */ -GLFWAPI GLFWcursorenterfun glfwSetCursorEnterCallback(GLFWwindow* window, GLFWcursorenterfun callback); - -/*! @brief Sets the scroll callback. - * - * This function sets the scroll callback of the specified window, which is - * called when a scrolling device is used, such as a mouse wheel or scrolling - * area of a touchpad. - * - * The scroll callback receives all scrolling input, like that from a mouse - * wheel or a touchpad scrolling area. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new scroll callback, or `NULL` to remove the - * currently set callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, double xoffset, double yoffset) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWscrollfun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref scrolling - * - * @since Added in version 3.0. Replaces `glfwSetMouseWheelCallback`. - * - * @ingroup input - */ -GLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow* window, GLFWscrollfun callback); - -/*! @brief Sets the path drop callback. - * - * This function sets the path drop callback of the specified window, which is - * called when one or more dragged paths are dropped on the window. - * - * Because the path array and its strings may have been generated specifically - * for that event, they are not guaranteed to be valid after the callback has - * returned. If you wish to use them after the callback returns, you need to - * make a deep copy. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new file drop callback, or `NULL` to remove the - * currently set callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, int path_count, const char* paths[]) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWdropfun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @remark @wayland File drop is currently unimplemented. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref path_drop - * - * @since Added in version 3.1. - * - * @ingroup input - */ -GLFWAPI GLFWdropfun glfwSetDropCallback(GLFWwindow* window, GLFWdropfun callback); - -/*! @brief Returns whether the specified joystick is present. - * - * This function returns whether the specified joystick is present. - * - * There is no need to call this function before other functions that accept - * a joystick ID, as they all check for presence before performing any other - * work. - * - * @param[in] jid The [joystick](@ref joysticks) to query. - * @return `GLFW_TRUE` if the joystick is present, or `GLFW_FALSE` otherwise. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref joystick - * - * @since Added in version 3.0. Replaces `glfwGetJoystickParam`. - * - * @ingroup input - */ -GLFWAPI int glfwJoystickPresent(int jid); - -/*! @brief Returns the values of all axes of the specified joystick. - * - * This function returns the values of all axes of the specified joystick. - * Each element in the array is a value between -1.0 and 1.0. - * - * If the specified joystick is not present this function will return `NULL` - * but will not generate an error. This can be used instead of first calling - * @ref glfwJoystickPresent. - * - * @param[in] jid The [joystick](@ref joysticks) to query. - * @param[out] count Where to store the number of axis values in the returned - * array. This is set to zero if the joystick is not present or an error - * occurred. - * @return An array of axis values, or `NULL` if the joystick is not present or - * an [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The returned array is allocated and freed by GLFW. You - * should not free it yourself. It is valid until the specified joystick is - * disconnected or the library is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref joystick_axis - * - * @since Added in version 3.0. Replaces `glfwGetJoystickPos`. - * - * @ingroup input - */ -GLFWAPI const float* glfwGetJoystickAxes(int jid, int* count); - -/*! @brief Returns the state of all buttons of the specified joystick. - * - * This function returns the state of all buttons of the specified joystick. - * Each element in the array is either `GLFW_PRESS` or `GLFW_RELEASE`. - * - * For backward compatibility with earlier versions that did not have @ref - * glfwGetJoystickHats, the button array also includes all hats, each - * represented as four buttons. The hats are in the same order as returned by - * __glfwGetJoystickHats__ and are in the order _up_, _right_, _down_ and - * _left_. To disable these extra buttons, set the @ref - * GLFW_JOYSTICK_HAT_BUTTONS init hint before initialization. - * - * If the specified joystick is not present this function will return `NULL` - * but will not generate an error. This can be used instead of first calling - * @ref glfwJoystickPresent. - * - * @param[in] jid The [joystick](@ref joysticks) to query. - * @param[out] count Where to store the number of button states in the returned - * array. This is set to zero if the joystick is not present or an error - * occurred. - * @return An array of button states, or `NULL` if the joystick is not present - * or an [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The returned array is allocated and freed by GLFW. You - * should not free it yourself. It is valid until the specified joystick is - * disconnected or the library is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref joystick_button - * - * @since Added in version 2.2. - * @glfw3 Changed to return a dynamic array. - * - * @ingroup input - */ -GLFWAPI const unsigned char* glfwGetJoystickButtons(int jid, int* count); - -/*! @brief Returns the state of all hats of the specified joystick. - * - * This function returns the state of all hats of the specified joystick. - * Each element in the array is one of the following values: - * - * Name | Value - * ---- | ----- - * `GLFW_HAT_CENTERED` | 0 - * `GLFW_HAT_UP` | 1 - * `GLFW_HAT_RIGHT` | 2 - * `GLFW_HAT_DOWN` | 4 - * `GLFW_HAT_LEFT` | 8 - * `GLFW_HAT_RIGHT_UP` | `GLFW_HAT_RIGHT` \| `GLFW_HAT_UP` - * `GLFW_HAT_RIGHT_DOWN` | `GLFW_HAT_RIGHT` \| `GLFW_HAT_DOWN` - * `GLFW_HAT_LEFT_UP` | `GLFW_HAT_LEFT` \| `GLFW_HAT_UP` - * `GLFW_HAT_LEFT_DOWN` | `GLFW_HAT_LEFT` \| `GLFW_HAT_DOWN` - * - * The diagonal directions are bitwise combinations of the primary (up, right, - * down and left) directions and you can test for these individually by ANDing - * it with the corresponding direction. - * - * @code - * if (hats[2] & GLFW_HAT_RIGHT) - * { - * // State of hat 2 could be right-up, right or right-down - * } - * @endcode - * - * If the specified joystick is not present this function will return `NULL` - * but will not generate an error. This can be used instead of first calling - * @ref glfwJoystickPresent. - * - * @param[in] jid The [joystick](@ref joysticks) to query. - * @param[out] count Where to store the number of hat states in the returned - * array. This is set to zero if the joystick is not present or an error - * occurred. - * @return An array of hat states, or `NULL` if the joystick is not present - * or an [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The returned array is allocated and freed by GLFW. You - * should not free it yourself. It is valid until the specified joystick is - * disconnected, this function is called again for that joystick or the library - * is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref joystick_hat - * - * @since Added in version 3.3. - * - * @ingroup input - */ -GLFWAPI const unsigned char* glfwGetJoystickHats(int jid, int* count); - -/*! @brief Returns the name of the specified joystick. - * - * This function returns the name, encoded as UTF-8, of the specified joystick. - * The returned string is allocated and freed by GLFW. You should not free it - * yourself. - * - * If the specified joystick is not present this function will return `NULL` - * but will not generate an error. This can be used instead of first calling - * @ref glfwJoystickPresent. - * - * @param[in] jid The [joystick](@ref joysticks) to query. - * @return The UTF-8 encoded name of the joystick, or `NULL` if the joystick - * is not present or an [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The returned string is allocated and freed by GLFW. You - * should not free it yourself. It is valid until the specified joystick is - * disconnected or the library is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref joystick_name - * - * @since Added in version 3.0. - * - * @ingroup input - */ -GLFWAPI const char* glfwGetJoystickName(int jid); - -/*! @brief Returns the SDL compatible GUID of the specified joystick. - * - * This function returns the SDL compatible GUID, as a UTF-8 encoded - * hexadecimal string, of the specified joystick. The returned string is - * allocated and freed by GLFW. You should not free it yourself. - * - * The GUID is what connects a joystick to a gamepad mapping. A connected - * joystick will always have a GUID even if there is no gamepad mapping - * assigned to it. - * - * If the specified joystick is not present this function will return `NULL` - * but will not generate an error. This can be used instead of first calling - * @ref glfwJoystickPresent. - * - * The GUID uses the format introduced in SDL 2.0.5. This GUID tries to - * uniquely identify the make and model of a joystick but does not identify - * a specific unit, e.g. all wired Xbox 360 controllers will have the same - * GUID on that platform. The GUID for a unit may vary between platforms - * depending on what hardware information the platform specific APIs provide. - * - * @param[in] jid The [joystick](@ref joysticks) to query. - * @return The UTF-8 encoded GUID of the joystick, or `NULL` if the joystick - * is not present or an [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The returned string is allocated and freed by GLFW. You - * should not free it yourself. It is valid until the specified joystick is - * disconnected or the library is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref gamepad - * - * @since Added in version 3.3. - * - * @ingroup input - */ -GLFWAPI const char* glfwGetJoystickGUID(int jid); - -/*! @brief Sets the user pointer of the specified joystick. - * - * This function sets the user-defined pointer of the specified joystick. The - * current value is retained until the joystick is disconnected. The initial - * value is `NULL`. - * - * This function may be called from the joystick callback, even for a joystick - * that is being disconnected. - * - * @param[in] jid The joystick whose pointer to set. - * @param[in] pointer The new value. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @sa @ref joystick_userptr - * @sa @ref glfwGetJoystickUserPointer - * - * @since Added in version 3.3. - * - * @ingroup input - */ -GLFWAPI void glfwSetJoystickUserPointer(int jid, void* pointer); - -/*! @brief Returns the user pointer of the specified joystick. - * - * This function returns the current value of the user-defined pointer of the - * specified joystick. The initial value is `NULL`. - * - * This function may be called from the joystick callback, even for a joystick - * that is being disconnected. - * - * @param[in] jid The joystick whose pointer to return. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @sa @ref joystick_userptr - * @sa @ref glfwSetJoystickUserPointer - * - * @since Added in version 3.3. - * - * @ingroup input - */ -GLFWAPI void* glfwGetJoystickUserPointer(int jid); - -/*! @brief Returns whether the specified joystick has a gamepad mapping. - * - * This function returns whether the specified joystick is both present and has - * a gamepad mapping. - * - * If the specified joystick is present but does not have a gamepad mapping - * this function will return `GLFW_FALSE` but will not generate an error. Call - * @ref glfwJoystickPresent to check if a joystick is present regardless of - * whether it has a mapping. - * - * @param[in] jid The [joystick](@ref joysticks) to query. - * @return `GLFW_TRUE` if a joystick is both present and has a gamepad mapping, - * or `GLFW_FALSE` otherwise. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_INVALID_ENUM. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref gamepad - * @sa @ref glfwGetGamepadState - * - * @since Added in version 3.3. - * - * @ingroup input - */ -GLFWAPI int glfwJoystickIsGamepad(int jid); - -/*! @brief Sets the joystick configuration callback. - * - * This function sets the joystick configuration callback, or removes the - * currently set callback. This is called when a joystick is connected to or - * disconnected from the system. - * - * For joystick connection and disconnection events to be delivered on all - * platforms, you need to call one of the [event processing](@ref events) - * functions. Joystick disconnection may also be detected and the callback - * called by joystick functions. The function will then return whatever it - * returns if the joystick is not present. - * - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(int jid, int event) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWjoystickfun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref joystick_event - * - * @since Added in version 3.2. - * - * @ingroup input - */ -GLFWAPI GLFWjoystickfun glfwSetJoystickCallback(GLFWjoystickfun callback); - -/*! @brief Adds the specified SDL_GameControllerDB gamepad mappings. - * - * This function parses the specified ASCII encoded string and updates the - * internal list with any gamepad mappings it finds. This string may - * contain either a single gamepad mapping or many mappings separated by - * newlines. The parser supports the full format of the `gamecontrollerdb.txt` - * source file including empty lines and comments. - * - * See @ref gamepad_mapping for a description of the format. - * - * If there is already a gamepad mapping for a given GUID in the internal list, - * it will be replaced by the one passed to this function. If the library is - * terminated and re-initialized the internal list will revert to the built-in - * default. - * - * @param[in] string The string containing the gamepad mappings. - * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_INVALID_VALUE. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref gamepad - * @sa @ref glfwJoystickIsGamepad - * @sa @ref glfwGetGamepadName - * - * @since Added in version 3.3. - * - * @ingroup input - */ -GLFWAPI int glfwUpdateGamepadMappings(const char* string); - -/*! @brief Returns the human-readable gamepad name for the specified joystick. - * - * This function returns the human-readable name of the gamepad from the - * gamepad mapping assigned to the specified joystick. - * - * If the specified joystick is not present or does not have a gamepad mapping - * this function will return `NULL` but will not generate an error. Call - * @ref glfwJoystickPresent to check whether it is present regardless of - * whether it has a mapping. - * - * @param[in] jid The [joystick](@ref joysticks) to query. - * @return The UTF-8 encoded name of the gamepad, or `NULL` if the - * joystick is not present, does not have a mapping or an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref GLFW_INVALID_ENUM. - * - * @pointer_lifetime The returned string is allocated and freed by GLFW. You - * should not free it yourself. It is valid until the specified joystick is - * disconnected, the gamepad mappings are updated or the library is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref gamepad - * @sa @ref glfwJoystickIsGamepad - * - * @since Added in version 3.3. - * - * @ingroup input - */ -GLFWAPI const char* glfwGetGamepadName(int jid); - -/*! @brief Retrieves the state of the specified joystick remapped as a gamepad. - * - * This function retrieves the state of the specified joystick remapped to - * an Xbox-like gamepad. - * - * If the specified joystick is not present or does not have a gamepad mapping - * this function will return `GLFW_FALSE` but will not generate an error. Call - * @ref glfwJoystickPresent to check whether it is present regardless of - * whether it has a mapping. - * - * The Guide button may not be available for input as it is often hooked by the - * system or the Steam client. - * - * Not all devices have all the buttons or axes provided by @ref - * GLFWgamepadstate. Unavailable buttons and axes will always report - * `GLFW_RELEASE` and 0.0 respectively. - * - * @param[in] jid The [joystick](@ref joysticks) to query. - * @param[out] state The gamepad input state of the joystick. - * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if no joystick is - * connected, it has no gamepad mapping or an [error](@ref error_handling) - * occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_INVALID_ENUM. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref gamepad - * @sa @ref glfwUpdateGamepadMappings - * @sa @ref glfwJoystickIsGamepad - * - * @since Added in version 3.3. - * - * @ingroup input - */ -GLFWAPI int glfwGetGamepadState(int jid, GLFWgamepadstate* state); - -/*! @brief Sets the clipboard to the specified string. - * - * This function sets the system clipboard to the specified, UTF-8 encoded - * string. - * - * @param[in] window Deprecated. Any valid window or `NULL`. - * @param[in] string A UTF-8 encoded string. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The specified string is copied before this function - * returns. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref clipboard - * @sa @ref glfwGetClipboardString - * - * @since Added in version 3.0. - * - * @ingroup input - */ -GLFWAPI void glfwSetClipboardString(GLFWwindow* window, const char* string); - -/*! @brief Returns the contents of the clipboard as a string. - * - * This function returns the contents of the system clipboard, if it contains - * or is convertible to a UTF-8 encoded string. If the clipboard is empty or - * if its contents cannot be converted, `NULL` is returned and a @ref - * GLFW_FORMAT_UNAVAILABLE error is generated. - * - * @param[in] window Deprecated. Any valid window or `NULL`. - * @return The contents of the clipboard as a UTF-8 encoded string, or `NULL` - * if an [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_FORMAT_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The returned string is allocated and freed by GLFW. You - * should not free it yourself. It is valid until the next call to @ref - * glfwGetClipboardString or @ref glfwSetClipboardString, or until the library - * is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref clipboard - * @sa @ref glfwSetClipboardString - * - * @since Added in version 3.0. - * - * @ingroup input - */ -GLFWAPI const char* glfwGetClipboardString(GLFWwindow* window); - -/*! @brief Returns the GLFW time. - * - * This function returns the current GLFW time, in seconds. Unless the time - * has been set using @ref glfwSetTime it measures time elapsed since GLFW was - * initialized. - * - * This function and @ref glfwSetTime are helper functions on top of @ref - * glfwGetTimerFrequency and @ref glfwGetTimerValue. - * - * The resolution of the timer is system dependent, but is usually on the order - * of a few micro- or nanoseconds. It uses the highest-resolution monotonic - * time source on each supported platform. - * - * @return The current time, in seconds, or zero if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. Reading and - * writing of the internal base time is not atomic, so it needs to be - * externally synchronized with calls to @ref glfwSetTime. - * - * @sa @ref time - * - * @since Added in version 1.0. - * - * @ingroup input - */ -GLFWAPI double glfwGetTime(void); - -/*! @brief Sets the GLFW time. - * - * This function sets the current GLFW time, in seconds. The value must be - * a positive finite number less than or equal to 18446744073.0, which is - * approximately 584.5 years. - * - * This function and @ref glfwGetTime are helper functions on top of @ref - * glfwGetTimerFrequency and @ref glfwGetTimerValue. - * - * @param[in] time The new value, in seconds. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_INVALID_VALUE. - * - * @remark The upper limit of GLFW time is calculated as - * floor((264 - 1) / 109) and is due to implementations - * storing nanoseconds in 64 bits. The limit may be increased in the future. - * - * @thread_safety This function may be called from any thread. Reading and - * writing of the internal base time is not atomic, so it needs to be - * externally synchronized with calls to @ref glfwGetTime. - * - * @sa @ref time - * - * @since Added in version 2.2. - * - * @ingroup input - */ -GLFWAPI void glfwSetTime(double time); - -/*! @brief Returns the current value of the raw timer. - * - * This function returns the current value of the raw timer, measured in - * 1 / frequency seconds. To get the frequency, call @ref - * glfwGetTimerFrequency. - * - * @return The value of the timer, or zero if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref time - * @sa @ref glfwGetTimerFrequency - * - * @since Added in version 3.2. - * - * @ingroup input - */ -GLFWAPI uint64_t glfwGetTimerValue(void); - -/*! @brief Returns the frequency, in Hz, of the raw timer. - * - * This function returns the frequency, in Hz, of the raw timer. - * - * @return The frequency of the timer, in Hz, or zero if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref time - * @sa @ref glfwGetTimerValue - * - * @since Added in version 3.2. - * - * @ingroup input - */ -GLFWAPI uint64_t glfwGetTimerFrequency(void); - -/*! @brief Makes the context of the specified window current for the calling - * thread. - * - * This function makes the OpenGL or OpenGL ES context of the specified window - * current on the calling thread. A context must only be made current on - * a single thread at a time and each thread can have only a single current - * context at a time. - * - * When moving a context between threads, you must make it non-current on the - * old thread before making it current on the new one. - * - * By default, making a context non-current implicitly forces a pipeline flush. - * On machines that support `GL_KHR_context_flush_control`, you can control - * whether a context performs this flush by setting the - * [GLFW_CONTEXT_RELEASE_BEHAVIOR](@ref GLFW_CONTEXT_RELEASE_BEHAVIOR_hint) - * hint. - * - * The specified window must have an OpenGL or OpenGL ES context. Specifying - * a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT - * error. - * - * @param[in] window The window whose context to make current, or `NULL` to - * detach the current context. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref context_current - * @sa @ref glfwGetCurrentContext - * - * @since Added in version 3.0. - * - * @ingroup context - */ -GLFWAPI void glfwMakeContextCurrent(GLFWwindow* window); - -/*! @brief Returns the window whose context is current on the calling thread. - * - * This function returns the window whose OpenGL or OpenGL ES context is - * current on the calling thread. - * - * @return The window whose context is current, or `NULL` if no window's - * context is current. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref context_current - * @sa @ref glfwMakeContextCurrent - * - * @since Added in version 3.0. - * - * @ingroup context - */ -GLFWAPI GLFWwindow* glfwGetCurrentContext(void); - -/*! @brief Swaps the front and back buffers of the specified window. - * - * This function swaps the front and back buffers of the specified window when - * rendering with OpenGL or OpenGL ES. If the swap interval is greater than - * zero, the GPU driver waits the specified number of screen updates before - * swapping the buffers. - * - * The specified window must have an OpenGL or OpenGL ES context. Specifying - * a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT - * error. - * - * This function does not apply to Vulkan. If you are rendering with Vulkan, - * see `vkQueuePresentKHR` instead. - * - * @param[in] window The window whose buffers to swap. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR. - * - * @remark __EGL:__ The context of the specified window must be current on the - * calling thread. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref buffer_swap - * @sa @ref glfwSwapInterval - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwSwapBuffers(GLFWwindow* window); - -/*! @brief Sets the swap interval for the current context. - * - * This function sets the swap interval for the current OpenGL or OpenGL ES - * context, i.e. the number of screen updates to wait from the time @ref - * glfwSwapBuffers was called before swapping the buffers and returning. This - * is sometimes called _vertical synchronization_, _vertical retrace - * synchronization_ or just _vsync_. - * - * A context that supports either of the `WGL_EXT_swap_control_tear` and - * `GLX_EXT_swap_control_tear` extensions also accepts _negative_ swap - * intervals, which allows the driver to swap immediately even if a frame - * arrives a little bit late. You can check for these extensions with @ref - * glfwExtensionSupported. - * - * A context must be current on the calling thread. Calling this function - * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. - * - * This function does not apply to Vulkan. If you are rendering with Vulkan, - * see the present mode of your swapchain instead. - * - * @param[in] interval The minimum number of screen updates to wait for - * until the buffers are swapped by @ref glfwSwapBuffers. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_NO_CURRENT_CONTEXT and @ref GLFW_PLATFORM_ERROR. - * - * @remark This function is not called during context creation, leaving the - * swap interval set to whatever is the default on that platform. This is done - * because some swap interval extensions used by GLFW do not allow the swap - * interval to be reset to zero once it has been set to a non-zero value. - * - * @remark Some GPU drivers do not honor the requested swap interval, either - * because of a user setting that overrides the application's request or due to - * bugs in the driver. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref buffer_swap - * @sa @ref glfwSwapBuffers - * - * @since Added in version 1.0. - * - * @ingroup context - */ -GLFWAPI void glfwSwapInterval(int interval); - -/*! @brief Returns whether the specified extension is available. - * - * This function returns whether the specified - * [API extension](@ref context_glext) is supported by the current OpenGL or - * OpenGL ES context. It searches both for client API extension and context - * creation API extensions. - * - * A context must be current on the calling thread. Calling this function - * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. - * - * As this functions retrieves and searches one or more extension strings each - * call, it is recommended that you cache its results if it is going to be used - * frequently. The extension strings will not change during the lifetime of - * a context, so there is no danger in doing this. - * - * This function does not apply to Vulkan. If you are using Vulkan, see @ref - * glfwGetRequiredInstanceExtensions, `vkEnumerateInstanceExtensionProperties` - * and `vkEnumerateDeviceExtensionProperties` instead. - * - * @param[in] extension The ASCII encoded name of the extension. - * @return `GLFW_TRUE` if the extension is available, or `GLFW_FALSE` - * otherwise. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_NO_CURRENT_CONTEXT, @ref GLFW_INVALID_VALUE and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref context_glext - * @sa @ref glfwGetProcAddress - * - * @since Added in version 1.0. - * - * @ingroup context - */ -GLFWAPI int glfwExtensionSupported(const char* extension); - -/*! @brief Returns the address of the specified function for the current - * context. - * - * This function returns the address of the specified OpenGL or OpenGL ES - * [core or extension function](@ref context_glext), if it is supported - * by the current context. - * - * A context must be current on the calling thread. Calling this function - * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. - * - * This function does not apply to Vulkan. If you are rendering with Vulkan, - * see @ref glfwGetInstanceProcAddress, `vkGetInstanceProcAddr` and - * `vkGetDeviceProcAddr` instead. - * - * @param[in] procname The ASCII encoded name of the function. - * @return The address of the function, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_NO_CURRENT_CONTEXT and @ref GLFW_PLATFORM_ERROR. - * - * @remark The address of a given function is not guaranteed to be the same - * between contexts. - * - * @remark This function may return a non-`NULL` address despite the - * associated version or extension not being available. Always check the - * context version or extension string first. - * - * @pointer_lifetime The returned function pointer is valid until the context - * is destroyed or the library is terminated. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref context_glext - * @sa @ref glfwExtensionSupported - * - * @since Added in version 1.0. - * - * @ingroup context - */ -GLFWAPI GLFWglproc glfwGetProcAddress(const char* procname); - -/*! @brief Returns whether the Vulkan loader and an ICD have been found. - * - * This function returns whether the Vulkan loader and any minimally functional - * ICD have been found. - * - * The availability of a Vulkan loader and even an ICD does not by itself guarantee that - * surface creation or even instance creation is possible. Call @ref - * glfwGetRequiredInstanceExtensions to check whether the extensions necessary for Vulkan - * surface creation are available and @ref glfwGetPhysicalDevicePresentationSupport to - * check whether a queue family of a physical device supports image presentation. - * - * @return `GLFW_TRUE` if Vulkan is minimally available, or `GLFW_FALSE` - * otherwise. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref vulkan_support - * - * @since Added in version 3.2. - * - * @ingroup vulkan - */ -GLFWAPI int glfwVulkanSupported(void); - -/*! @brief Returns the Vulkan instance extensions required by GLFW. - * - * This function returns an array of names of Vulkan instance extensions required - * by GLFW for creating Vulkan surfaces for GLFW windows. If successful, the - * list will always contain `VK_KHR_surface`, so if you don't require any - * additional extensions you can pass this list directly to the - * `VkInstanceCreateInfo` struct. - * - * If Vulkan is not available on the machine, this function returns `NULL` and - * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported - * to check whether Vulkan is at least minimally available. - * - * If Vulkan is available but no set of extensions allowing window surface - * creation was found, this function returns `NULL`. You may still use Vulkan - * for off-screen rendering and compute work. - * - * @param[out] count Where to store the number of extensions in the returned - * array. This is set to zero if an error occurred. - * @return An array of ASCII encoded extension names, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_API_UNAVAILABLE. - * - * @remark Additional extensions may be required by future versions of GLFW. - * You should check if any extensions you wish to enable are already in the - * returned array, as it is an error to specify an extension more than once in - * the `VkInstanceCreateInfo` struct. - * - * @pointer_lifetime The returned array is allocated and freed by GLFW. You - * should not free it yourself. It is guaranteed to be valid only until the - * library is terminated. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref vulkan_ext - * @sa @ref glfwCreateWindowSurface - * - * @since Added in version 3.2. - * - * @ingroup vulkan - */ -GLFWAPI const char** glfwGetRequiredInstanceExtensions(uint32_t* count); - -#if defined(VK_VERSION_1_0) - -/*! @brief Returns the address of the specified Vulkan instance function. - * - * This function returns the address of the specified Vulkan core or extension - * function for the specified instance. If instance is set to `NULL` it can - * return any function exported from the Vulkan loader, including at least the - * following functions: - * - * - `vkEnumerateInstanceExtensionProperties` - * - `vkEnumerateInstanceLayerProperties` - * - `vkCreateInstance` - * - `vkGetInstanceProcAddr` - * - * If Vulkan is not available on the machine, this function returns `NULL` and - * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported - * to check whether Vulkan is at least minimally available. - * - * This function is equivalent to calling `vkGetInstanceProcAddr` with - * a platform-specific query of the Vulkan loader as a fallback. - * - * @param[in] instance The Vulkan instance to query, or `NULL` to retrieve - * functions related to instance creation. - * @param[in] procname The ASCII encoded name of the function. - * @return The address of the function, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_API_UNAVAILABLE. - * - * @pointer_lifetime The returned function pointer is valid until the library - * is terminated. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref vulkan_proc - * - * @since Added in version 3.2. - * - * @ingroup vulkan - */ -GLFWAPI GLFWvkproc glfwGetInstanceProcAddress(VkInstance instance, const char* procname); - -/*! @brief Returns whether the specified queue family can present images. - * - * This function returns whether the specified queue family of the specified - * physical device supports presentation to the platform GLFW was built for. - * - * If Vulkan or the required window surface creation instance extensions are - * not available on the machine, or if the specified instance was not created - * with the required extensions, this function returns `GLFW_FALSE` and - * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported - * to check whether Vulkan is at least minimally available and @ref - * glfwGetRequiredInstanceExtensions to check what instance extensions are - * required. - * - * @param[in] instance The instance that the physical device belongs to. - * @param[in] device The physical device that the queue family belongs to. - * @param[in] queuefamily The index of the queue family to query. - * @return `GLFW_TRUE` if the queue family supports presentation, or - * `GLFW_FALSE` otherwise. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_API_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR. - * - * @remark @macos This function currently always returns `GLFW_TRUE`, as the - * `VK_MVK_macos_surface` and `VK_EXT_metal_surface` extensions do not provide - * a `vkGetPhysicalDevice*PresentationSupport` type function. - * - * @thread_safety This function may be called from any thread. For - * synchronization details of Vulkan objects, see the Vulkan specification. - * - * @sa @ref vulkan_present - * - * @since Added in version 3.2. - * - * @ingroup vulkan - */ -GLFWAPI int glfwGetPhysicalDevicePresentationSupport(VkInstance instance, VkPhysicalDevice device, uint32_t queuefamily); - -/*! @brief Creates a Vulkan surface for the specified window. - * - * This function creates a Vulkan surface for the specified window. - * - * If the Vulkan loader or at least one minimally functional ICD were not found, - * this function returns `VK_ERROR_INITIALIZATION_FAILED` and generates a @ref - * GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported to check whether - * Vulkan is at least minimally available. - * - * If the required window surface creation instance extensions are not - * available or if the specified instance was not created with these extensions - * enabled, this function returns `VK_ERROR_EXTENSION_NOT_PRESENT` and - * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref - * glfwGetRequiredInstanceExtensions to check what instance extensions are - * required. - * - * The window surface cannot be shared with another API so the window must - * have been created with the [client api hint](@ref GLFW_CLIENT_API_attrib) - * set to `GLFW_NO_API` otherwise it generates a @ref GLFW_INVALID_VALUE error - * and returns `VK_ERROR_NATIVE_WINDOW_IN_USE_KHR`. - * - * The window surface must be destroyed before the specified Vulkan instance. - * It is the responsibility of the caller to destroy the window surface. GLFW - * does not destroy it for you. Call `vkDestroySurfaceKHR` to destroy the - * surface. - * - * @param[in] instance The Vulkan instance to create the surface in. - * @param[in] window The window to create the surface for. - * @param[in] allocator The allocator to use, or `NULL` to use the default - * allocator. - * @param[out] surface Where to store the handle of the surface. This is set - * to `VK_NULL_HANDLE` if an error occurred. - * @return `VK_SUCCESS` if successful, or a Vulkan error code if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_API_UNAVAILABLE, @ref GLFW_PLATFORM_ERROR and @ref GLFW_INVALID_VALUE - * - * @remark If an error occurs before the creation call is made, GLFW returns - * the Vulkan error code most appropriate for the error. Appropriate use of - * @ref glfwVulkanSupported and @ref glfwGetRequiredInstanceExtensions should - * eliminate almost all occurrences of these errors. - * - * @remark @macos GLFW prefers the `VK_EXT_metal_surface` extension, with the - * `VK_MVK_macos_surface` extension as a fallback. The name of the selected - * extension, if any, is included in the array returned by @ref - * glfwGetRequiredInstanceExtensions. - * - * @remark @macos This function creates and sets a `CAMetalLayer` instance for - * the window content view, which is required for MoltenVK to function. - * - * @thread_safety This function may be called from any thread. For - * synchronization details of Vulkan objects, see the Vulkan specification. - * - * @sa @ref vulkan_surface - * @sa @ref glfwGetRequiredInstanceExtensions - * - * @since Added in version 3.2. - * - * @ingroup vulkan - */ -GLFWAPI VkResult glfwCreateWindowSurface(VkInstance instance, GLFWwindow* window, const VkAllocationCallbacks* allocator, VkSurfaceKHR* surface); - -#endif /*VK_VERSION_1_0*/ - - -/************************************************************************* - * Global definition cleanup - *************************************************************************/ - -/* ------------------- BEGIN SYSTEM/COMPILER SPECIFIC -------------------- */ - -#ifdef GLFW_WINGDIAPI_DEFINED - #undef WINGDIAPI - #undef GLFW_WINGDIAPI_DEFINED -#endif - -#ifdef GLFW_CALLBACK_DEFINED - #undef CALLBACK - #undef GLFW_CALLBACK_DEFINED -#endif - -/* Some OpenGL related headers need GLAPIENTRY, but it is unconditionally - * defined by some gl.h variants (OpenBSD) so define it after if needed. - */ -#ifndef GLAPIENTRY - #define GLAPIENTRY APIENTRY - #define GLFW_GLAPIENTRY_DEFINED -#endif - -/* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */ - - -#ifdef __cplusplus -} -#endif - -#endif /* _glfw3_h_ */ - diff --git a/third_party/GLFW/glfw3.lib b/third_party/GLFW/glfw3.lib deleted file mode 100644 index 2a52eb4ebbf7d3c34f4f20022914ae9bb3ef1ccf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 634898 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≷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