From 27076c66001abafd46935a285a367559f4818802 Mon Sep 17 00:00:00 2001 From: GuilhermeWerner Date: Fri, 8 Jan 2021 16:26:30 -0300 Subject: [PATCH] Setting up OpenGL and Create a Window --- OpenGL/OpenGL.vcxproj | 12 + OpenGL/Source/Application.cpp | 43 +- Vendor/GLFW/include/GLFW/glfw3.h | 5874 ++++++++++++++++++++++++ Vendor/GLFW/include/GLFW/glfw3native.h | 525 +++ Vendor/GLFW/library/glfw3.lib | Bin 0 -> 512314 bytes 5 files changed, 6451 insertions(+), 3 deletions(-) create mode 100644 Vendor/GLFW/include/GLFW/glfw3.h create mode 100644 Vendor/GLFW/include/GLFW/glfw3native.h create mode 100644 Vendor/GLFW/library/glfw3.lib diff --git a/OpenGL/OpenGL.vcxproj b/OpenGL/OpenGL.vcxproj index ac542e3..66c38ab 100644 --- a/OpenGL/OpenGL.vcxproj +++ b/OpenGL/OpenGL.vcxproj @@ -88,10 +88,13 @@ true WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true + $(SolutionDir)Vendor\GLFW\include Console true + $(SolutionDir)Vendor\GLFW\library + glfw3.lib;opengl32.lib;%(AdditionalDependencies) @@ -102,12 +105,15 @@ true WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true + $(SolutionDir)Vendor\GLFW\include Console true true true + $(SolutionDir)Vendor\GLFW\library + glfw3.lib;opengl32.lib;%(AdditionalDependencies) @@ -116,10 +122,13 @@ true _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true + $(SolutionDir)Vendor\GLFW\include Console true + $(SolutionDir)Vendor\GLFW\library + glfw3.lib;opengl32.lib;%(AdditionalDependencies) @@ -130,12 +139,15 @@ true NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true + $(SolutionDir)Vendor\GLFW\include Console true true true + $(SolutionDir)Vendor\GLFW\library + glfw3.lib;opengl32.lib;%(AdditionalDependencies) diff --git a/OpenGL/Source/Application.cpp b/OpenGL/Source/Application.cpp index 3d2d011..ba97873 100644 --- a/OpenGL/Source/Application.cpp +++ b/OpenGL/Source/Application.cpp @@ -1,7 +1,44 @@ -#include +#include int main() { - std::cout << "OpenGL" << std::endl; - std::cin.get(); + GLFWwindow *window; + + /* Initialize the library */ + if (!glfwInit()) + return -1; + + /* Create a windowed mode window and its OpenGL context */ + window = glfwCreateWindow(1280, 720, "Hello World", NULL, NULL); + if (!window) + { + glfwTerminate(); + return -1; + } + + /* Make the window's context current */ + glfwMakeContextCurrent(window); + + /* Loop until the user closes the window */ + while (!glfwWindowShouldClose(window)) + { + /* Render here */ + glClear(GL_COLOR_BUFFER_BIT); + + glBegin(GL_TRIANGLES); + glVertex2f(-0.5f, -0.5f); + glVertex2f(0.0f, 0.5f); + glVertex2f(0.5f, -0.5f); + glEnd(); + + /* Swap front and back buffers */ + glfwSwapBuffers(window); + + /* Poll for and process events */ + glfwPollEvents(); + } + + glfwTerminate(); + + return 0; } diff --git a/Vendor/GLFW/include/GLFW/glfw3.h b/Vendor/GLFW/include/GLFW/glfw3.h new file mode 100644 index 0000000..66dff64 --- /dev/null +++ b/Vendor/GLFW/include/GLFW/glfw3.h @@ -0,0 +1,5874 @@ +/************************************************************************* + * 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 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 + + #endif /*__APPLE__*/ + +#elif !defined(GLFW_INCLUDE_NONE) + + #if defined(__APPLE__) + + #if !defined(GLFW_INCLUDE_GLEXT) + #define GL_GLEXT_LEGACY + #endif + #include + #if defined(GLFW_INCLUDE_GLU) + #include + #endif + + #else /*__APPLE__*/ + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + #if defined(GLFW_INCLUDE_GLU) + #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 GLFW as a Win32 DLL */ + #define GLFWAPI __declspec(dllimport) +#elif defined(__GNUC__) && defined(_GLFW_BUILD_DLL) + /* We are building GLFW as a shared / dynamic library */ + #define GLFWAPI __attribute__((visibility("default"))) +#else + /* We are building or calling GLFW as a static library */ + #define GLFWAPI +#endif + + +/************************************************************************* + * GLFW API tokens + *************************************************************************/ + +/*! @name GLFW version macros + * @{ */ +/*! @brief The major version number of the GLFW library. + * + * 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 library. + * + * 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 library. + * + * This is incremented when a bug fix release is made that does not contain any + * API changes. + * @ingroup init + */ +#define GLFW_VERSION_REVISION 2 +/*! @} */ + +/*! @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 hint and 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 OpenGL debug context hint and attribute. + * + * OpenGL debug 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,const char*); + +/*! @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*,int,int); + +/*! @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*,int,int); + +/*! @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*); + +/*! @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*); + +/*! @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*,int); + +/*! @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*,int); + +/*! @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] iconified `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*,int); + +/*! @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*,int,int); + +/*! @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*,float,float); + +/*! @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*,int,int,int); + +/*! @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*,double,double); + +/*! @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*,int); + +/*! @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*,double,double); + +/*! @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*,int,int,int,int); + +/*! @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*,unsigned int); + +/*! @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*,unsigned int,int); + +/*! @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*,int,const char*[]); + +/*! @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*,int); + +/*! @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,int); + +/*! @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. + * + * @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. + * + * @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 calculates the returned physical size 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) and then by resolution area (the + * product of width and height). + * + * @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 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, the original monitor + * resolution is restored until the window is restored. + * + * @param[in] window The window to iconify. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland There is no concept of iconification in wl_shell, this + * function will emit @ref GLFW_PLATFORM_ERROR when using this deprecated + * protocol. + * + * @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 a full screen window, the resolution chosen for + * the window is restored on the selected monitor. + * + * @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. + * + * @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). + * + * @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 wl_shell protocol has no concept of iconification, + * this callback will never be called when using this deprecated protocol. + * + * @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 higher-level 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 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. + * + * @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 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. + * For example, on Fermi systems Nvidia will install an ICD that provides no + * actual Vulkan support. 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. + * + * @remark @macos This function currently supports either the + * `VK_MVK_macos_surface` extension from MoltenVK or `VK_EXT_metal_surface` + * extension. + * + * @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` extension does 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 This function currently only supports the + * `VK_MVK_macos_surface` extension from MoltenVK. + * + * @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 +#endif + +/* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */ + + +#ifdef __cplusplus +} +#endif + +#endif /* _glfw3_h_ */ + diff --git a/Vendor/GLFW/include/GLFW/glfw3native.h b/Vendor/GLFW/include/GLFW/glfw3native.h new file mode 100644 index 0000000..267e75c --- /dev/null +++ b/Vendor/GLFW/include/GLFW/glfw3native.h @@ -0,0 +1,525 @@ +/************************************************************************* + * GLFW 3.3 - www.glfw.org + * A library for OpenGL, window and input + *------------------------------------------------------------------------ + * Copyright (c) 2002-2006 Marcus Geelnard + * Copyright (c) 2006-2018 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_native_h_ +#define _glfw3_native_h_ + +#ifdef __cplusplus +extern "C" { +#endif + + +/************************************************************************* + * Doxygen documentation + *************************************************************************/ + +/*! @file glfw3native.h + * @brief The header of the native access functions. + * + * This is the header file of the native access functions. See @ref native for + * more information. + */ +/*! @defgroup native Native access + * @brief Functions related to accessing native handles. + * + * **By using the native access functions you assert that you know what you're + * doing and how to fix problems caused by using them. If you don't, you + * shouldn't be using them.** + * + * Before the inclusion of @ref glfw3native.h, you may define zero or more + * window system API macro and zero or more context creation API macros. + * + * The chosen backends must match those the library was compiled for. Failure + * to do this will cause a link-time error. + * + * The available window API macros are: + * * `GLFW_EXPOSE_NATIVE_WIN32` + * * `GLFW_EXPOSE_NATIVE_COCOA` + * * `GLFW_EXPOSE_NATIVE_X11` + * * `GLFW_EXPOSE_NATIVE_WAYLAND` + * + * The available context API macros are: + * * `GLFW_EXPOSE_NATIVE_WGL` + * * `GLFW_EXPOSE_NATIVE_NSGL` + * * `GLFW_EXPOSE_NATIVE_GLX` + * * `GLFW_EXPOSE_NATIVE_EGL` + * * `GLFW_EXPOSE_NATIVE_OSMESA` + * + * These macros select which of the native access functions that are declared + * and which platform-specific headers to include. It is then up your (by + * definition platform-specific) code to handle which of these should be + * defined. + */ + + +/************************************************************************* + * System headers and types + *************************************************************************/ + +#if defined(GLFW_EXPOSE_NATIVE_WIN32) || defined(GLFW_EXPOSE_NATIVE_WGL) + // This is a workaround for the fact that glfw3.h needs to export APIENTRY (for + // example to allow applications to correctly declare a GL_ARB_debug_output + // callback) but windows.h assumes no one will define APIENTRY before it does + #if defined(GLFW_APIENTRY_DEFINED) + #undef APIENTRY + #undef GLFW_APIENTRY_DEFINED + #endif + #include +#elif defined(GLFW_EXPOSE_NATIVE_COCOA) || defined(GLFW_EXPOSE_NATIVE_NSGL) + #if defined(__OBJC__) + #import + #else + #include + typedef void* id; + #endif +#elif defined(GLFW_EXPOSE_NATIVE_X11) || defined(GLFW_EXPOSE_NATIVE_GLX) + #include + #include +#elif defined(GLFW_EXPOSE_NATIVE_WAYLAND) + #include +#endif + +#if defined(GLFW_EXPOSE_NATIVE_WGL) + /* WGL is declared by windows.h */ +#endif +#if defined(GLFW_EXPOSE_NATIVE_NSGL) + /* NSGL is declared by Cocoa.h */ +#endif +#if defined(GLFW_EXPOSE_NATIVE_GLX) + #include +#endif +#if defined(GLFW_EXPOSE_NATIVE_EGL) + #include +#endif +#if defined(GLFW_EXPOSE_NATIVE_OSMESA) + #include +#endif + + +/************************************************************************* + * Functions + *************************************************************************/ + +#if defined(GLFW_EXPOSE_NATIVE_WIN32) +/*! @brief Returns the adapter device name of the specified monitor. + * + * @return The UTF-8 encoded adapter device name (for example `\\.\DISPLAY1`) + * of the specified monitor, or `NULL` if an [error](@ref error_handling) + * occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.1. + * + * @ingroup native + */ +GLFWAPI const char* glfwGetWin32Adapter(GLFWmonitor* monitor); + +/*! @brief Returns the display device name of the specified monitor. + * + * @return The UTF-8 encoded display device name (for example + * `\\.\DISPLAY1\Monitor0`) of the specified monitor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.1. + * + * @ingroup native + */ +GLFWAPI const char* glfwGetWin32Monitor(GLFWmonitor* monitor); + +/*! @brief Returns the `HWND` of the specified window. + * + * @return The `HWND` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI HWND glfwGetWin32Window(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_WGL) +/*! @brief Returns the `HGLRC` of the specified window. + * + * @return The `HGLRC` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI HGLRC glfwGetWGLContext(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_COCOA) +/*! @brief Returns the `CGDirectDisplayID` of the specified monitor. + * + * @return The `CGDirectDisplayID` of the specified monitor, or + * `kCGNullDirectDisplay` if an [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.1. + * + * @ingroup native + */ +GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* monitor); + +/*! @brief Returns the `NSWindow` of the specified window. + * + * @return The `NSWindow` of the specified window, or `nil` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI id glfwGetCocoaWindow(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_NSGL) +/*! @brief Returns the `NSOpenGLContext` of the specified window. + * + * @return The `NSOpenGLContext` of the specified window, or `nil` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI id glfwGetNSGLContext(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_X11) +/*! @brief Returns the `Display` used by GLFW. + * + * @return The `Display` used by GLFW, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI Display* glfwGetX11Display(void); + +/*! @brief Returns the `RRCrtc` of the specified monitor. + * + * @return The `RRCrtc` of the specified monitor, or `None` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.1. + * + * @ingroup native + */ +GLFWAPI RRCrtc glfwGetX11Adapter(GLFWmonitor* monitor); + +/*! @brief Returns the `RROutput` of the specified monitor. + * + * @return The `RROutput` of the specified monitor, or `None` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.1. + * + * @ingroup native + */ +GLFWAPI RROutput glfwGetX11Monitor(GLFWmonitor* monitor); + +/*! @brief Returns the `Window` of the specified window. + * + * @return The `Window` of the specified window, or `None` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI Window glfwGetX11Window(GLFWwindow* window); + +/*! @brief Sets the current primary selection to the specified string. + * + * @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 glfwGetX11SelectionString + * @sa glfwSetClipboardString + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI void glfwSetX11SelectionString(const char* string); + +/*! @brief Returns the contents of the current primary selection as a string. + * + * If the selection is empty or if its contents cannot be converted, `NULL` + * is returned and a @ref GLFW_FORMAT_UNAVAILABLE error is generated. + * + * @return The contents of the selection as a UTF-8 encoded string, 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 string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the next call to @ref + * glfwGetX11SelectionString or @ref glfwSetX11SelectionString, or until the + * library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref clipboard + * @sa glfwSetX11SelectionString + * @sa glfwGetClipboardString + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI const char* glfwGetX11SelectionString(void); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_GLX) +/*! @brief Returns the `GLXContext` of the specified window. + * + * @return The `GLXContext` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window); + +/*! @brief Returns the `GLXWindow` of the specified window. + * + * @return The `GLXWindow` of the specified window, or `None` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI GLXWindow glfwGetGLXWindow(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_WAYLAND) +/*! @brief Returns the `struct wl_display*` used by GLFW. + * + * @return The `struct wl_display*` used by GLFW, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI struct wl_display* glfwGetWaylandDisplay(void); + +/*! @brief Returns the `struct wl_output*` of the specified monitor. + * + * @return The `struct wl_output*` of the specified monitor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI struct wl_output* glfwGetWaylandMonitor(GLFWmonitor* monitor); + +/*! @brief Returns the main `struct wl_surface*` of the specified window. + * + * @return The main `struct wl_surface*` of the specified window, or `NULL` if + * an [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI struct wl_surface* glfwGetWaylandWindow(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_EGL) +/*! @brief Returns the `EGLDisplay` used by GLFW. + * + * @return The `EGLDisplay` used by GLFW, or `EGL_NO_DISPLAY` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI EGLDisplay glfwGetEGLDisplay(void); + +/*! @brief Returns the `EGLContext` of the specified window. + * + * @return The `EGLContext` of the specified window, or `EGL_NO_CONTEXT` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* window); + +/*! @brief Returns the `EGLSurface` of the specified window. + * + * @return The `EGLSurface` of the specified window, or `EGL_NO_SURFACE` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_OSMESA) +/*! @brief Retrieves the color buffer associated with the specified window. + * + * @param[in] window The window whose color buffer to retrieve. + * @param[out] width Where to store the width of the color buffer, or `NULL`. + * @param[out] height Where to store the height of the color buffer, or `NULL`. + * @param[out] format Where to store the OSMesa pixel format of the color + * buffer, or `NULL`. + * @param[out] buffer Where to store the address of the color buffer, or + * `NULL`. + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI int glfwGetOSMesaColorBuffer(GLFWwindow* window, int* width, int* height, int* format, void** buffer); + +/*! @brief Retrieves the depth buffer associated with the specified window. + * + * @param[in] window The window whose depth buffer to retrieve. + * @param[out] width Where to store the width of the depth buffer, or `NULL`. + * @param[out] height Where to store the height of the depth buffer, or `NULL`. + * @param[out] bytesPerValue Where to store the number of bytes per depth + * buffer element, or `NULL`. + * @param[out] buffer Where to store the address of the depth buffer, or + * `NULL`. + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI int glfwGetOSMesaDepthBuffer(GLFWwindow* window, int* width, int* height, int* bytesPerValue, void** buffer); + +/*! @brief Returns the `OSMesaContext` of the specified window. + * + * @return The `OSMesaContext` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI OSMesaContext glfwGetOSMesaContext(GLFWwindow* window); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _glfw3_native_h_ */ + diff --git a/Vendor/GLFW/library/glfw3.lib b/Vendor/GLFW/library/glfw3.lib new file mode 100644 index 0000000000000000000000000000000000000000..fe08cd72d1464e8c988d8b8380ccad450c4e5af8 GIT binary patch literal 512314 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�&OPtPXh0gDAeE(l{UZ1|>gtslN{wi6f* zrm)s}t{i%y=h|$o@bS6FZ@`d-uRvpSe885h>xr2R0~qnrMN8tIn5W&7BN;*w5Blh6 zfFCE#6Ln_G$hTqJMs%Z^ANvvUJz9BSl-7;}f~1dUDfMeaMRA%WGh6R>j741|a&1Fn zXlhA8@nXw#S{xrjA}s>8!WL#kfgu*o1*Zgp$KDCA5zLTk9HFHroLhD)){p`ts+Dsj zD9HxMq+t3poCzbUF-zG~kb>Ib8A_cAn5xXuvhj?jLuoLA;oKvpxL{E`ciFIQqy97; zuq3a0>4hH+@l3#A2+txarM*Z4VEUYc^^VguIGTlBv^-&!|5Gej^5%V_j%i-r1yywh0+5j{;M+8NonKP+3Qm)Yx%fJ_x1JvW(Ja zwrLZSr$;u>U|A)E!*iPsS#-FQ$Av=L670WTJ`BRp^dvpGnsnM=h%GVDP{`6#cDh7i zZ0OBbzis&In?>9-5?9d)stE^zjDn*OfPZ@D_1>26r7iK3nB4&|Sz)0m=D%^RuKD;dyr z5e3^6L|6brrtF9NQRj9+*YEVH#1TPRHWxW6f$1_OxRidsf2>_p9hAevaSRUTlVRAc z8zyD~x0!D$b1=lI3m#9wHI_f^9-e4gLY|`q&Tewonx+}Y%Km!Vxk-plg6##ngJTqf z$ELK=s9e)Xr`Kl7C7TL^#!BYPX_E+Ous{`*Idme^qVc)W<43}%S`5yV^m3xvo{K&- zm{r?c)2K2?Z4-`NxfRVgQ1^~>q7bH}%t{}ITpD!93lY}S7NyYb2?UW3)8Ko?o#)95 zBbqx|rdsC1kQ9USqLhYrG=R~x9(~-&B@N{8U~|c0Hi+bBHa#A;Z74G_x|C!b3Q1>X zVa)gt5v7*25e=}|FpD9b!(+zBH-h(QP|q1svH^Q$aL>%ubzl8*{lT9}(rEH^xG^<& zOut6`A)PY;ljPKLV`_|jUF4p@<3&iA?wD*W!|q^FML)rZmpIm$z$2}5csSQUy$mY+xbAfCWz*Kv*BwlP zvWkZ~@(wi{cB31H+I>90aNZMkb5q+0H+!;XNCWECBpJ1lspc@bt#+7P+X$yF$bu1i zC*cm%VLl08>H4GLe3*u)=m?vUW$O_QhA_mYk}ZxMm=nAc{pr&nn-h2t)_LQ6E{1Ni zP8Ar9X)fk+@^NNv%31Bs%v-_Yk13Tk$<$83kYj7Jbv0>;G>FFs*uAMiPo+k$Z7w;h zKT{pu5Ti>fK@c8j={BSRl3oOzgIQvZs3^P5KHfCn(0X>F#|HqRwhu#{ToO8Yr?G}G zu0I!zu8{riX}hEJ-~4<=Uir^d(w@)H=4Yg%mK4F=uSnOvv$=A;EZC|JX!qE~&E4t~ zWgrwNA2#>)1EmtLpGn{?FC`&!2i1M*s(jkJgQ}nMl++Z__vJ5FzKi_8>RtVGzqa6r zu_T}5l=Nt^#n0d0hPP{}Cf+62Kc&p(5`A=`id$cwtLpXUmwk#!8kW>VKnY9Bi}-in zUhKA)6ie>cT}IrHYo>@;5qWCyHkf=Wp5x7IGve#aQ`hUu=l2(sC?n6gLn(HhiiDiR zEOc*^N;?#pQMI96u><@Jao!N&hcvZT@+(zm`TR)P^T#RlSxcGS9M&PPsD)`B*7s75 z*cz)#x!eBe6)qCEB$vF96ZqnH zU+Nw{2dr-`VRh6)FwN~ch_is)?NUbD64v$-<#Ab66#XQ+$yV{AaFD97JZ`gtLtU%u zDkY231U|=Qx(0&-Lkvcgho-vr6xbRbSLGqrA67qYyy{$%vM(Se4-ci+%6n40)4A2X zDk65t->Nv<-Gjr26^pQpI4Aa@rmB+Vk*=7Vlus~&D))MT)K{iLGY-;z~C|r z$SEZ+zJyMVsSk*UlVW-t7dQBNqu$49;qd>XUvavcZK)IvqO_{Gi_9x*fBiY(m0UsD zj+2DIB>d(R;Jp@fudt{oT$T{4z;P9#O|`EMUe_~2YC4HiZ+m~s1h`(`cy+IEuGXv^ zWk4j-0Wj&_rjhqD(Q+@lnZlge4lDXGVxW|s!_;X=w3 zQq%?a%Xars%5s4V7G6G66=4Ty zx{`a^r|0ld=Yx1>lH!#X@NV^^aQO31yF>*Ql-2G)3rJ4EGRZjRw&<~ry-yj%mJ@me zwX%$`ioNTXPbVl+k_%D@%D?R-CsB!5vO-Ri>-#x`rsBs>_WjruD?+YG!sg>Y3z5nG zGj*C3h|~Tvm3rpOYyIQZ>i*_pt5pKC)c3T3-V@zou8UA50ql9RdEZ^kA1QUPx$aoD zcgqwI)!eMB+nSObnrivIl|TA|UftcrXH`pOeQmV@N*BoBb?EHnQH`*Qp*C&OAo|&N zaCe|N$6b&y5N3aK@u>R!=AZqe{@3j21n1S+>EWz@eXsi{K}d({?|=DczkT!O%|HA% zU%mOa|LLnY|NOsy_2&1<*Kg+k_3Jmk`)_>zkFVeSmw)oBH-G>7S8wkB;L(y zH&6fcn>YXAFTZ*75B~EvZ~ooC|Mi>0Z{EE53-8~by!qPu^cQdb)P9odzvWy1{!{MA zy|3T=>dl|<*Pp4Mzj^befAaL#JpT=FUwZa$_WiG+#;^JQ)tj&A(bs>=d-FGg)_)2$ z<@^6DY6`dg31jpd#^|?-=f2{vUxVY%!6G9ky!$nu{+{~%6@Ljw%Xt0;JpBz<|ANoI z<_(%}f5j6r=F-YPI|zdR{8rFDPOwfax_OP&&1e8cyj^A>5X z?vb=#dZ+OVMtMTFK|@I&e4LWd50}`f2?Z`CI1Js zzYNoVLbyQ2?aO>A{g&|(N@>p1ZxXB`C!}98-a=F1L)|vbFMs;iXqR9SXc;4s!u|G+ zKYar>;pT66QpQne@b`d}@89xM_*OpLBPBO<$y~U%mOe{3YY6{|SEz$D4oh z2Kig&ME~D!)jPjYoGIKX|Nf5pB!5Y(%4ScYaA5zRz#0tw zJMu~3hA=W~qz%8O^?L3Jw+a`Vv5-;xhJMK#WS+|`k#Fg*^k2qV`YW?jzg_da{M2it zv`SM(X0bf|TlHJ7rNZA@cIdJAbM>sDs{Spw+&`JI@=s)z%q#tjjJP}_vPv-a$3TCQ zXXI(YFaLDQ`?$0ulQ)^`?(eC0PF)io7fjM$^G`U=l#2ZSwa(-L{zeX?;YZKY3#;ND zlr3jH1FAO?B51Gv4Xa5>a*qc8ow6D|o*(F{d2ZYLN2ysEFF2mElq7(dZ4R$*oz3Ml z#p@zfAV|M4yn`;mS38A)}P z81I8Q`@6fleh1Hpxlb_ERP*~MIzG7hx$2wv5z?YSA&szo}b}_ry z>$jGNs1!>6Agt5Y;`Bs;xlzGPEL-G=Oj9ae{Z18EJ3oqc68^f}cy>dc!Z3_8BAc^E zjUG1a)phAouko)%&Mw0F#a_U1wbvqNiV&|w&N_~0=YOmsX9$OiI17TZkuqIL&q1s{ z<;k$~R>VIwZqBdnuMiIH>e@|c&VI!tlqAisNVON=Rgt~}b2CXHjb!LbQ2TGHs3jLK zILu?Ek(frVwq6NmnnkW(l2H;RLfa$k%}>VY;=Ss%iks#sg5+MSxa|dy;kAmJ2wMp8 zTE$Hf;n6r)6*o(W*D7vm@qDe~)^P;U zOs`ekM6Z0U;$}JGwThdP5gZPwAc6jo51yx4nRD1r+k(Fj^so z!-%lQ-S+1$e9Bq!eqs1?M2c=|+IS(U6B$c>S(G&AxRNE7NUDTt7mOF@<+m$~Ik&~h z$mU(Oeq5>8FCFyNd#I5rf0S0Ci&#EicvT)|BuH>nc=x=!SzWEY7s(lv*NS&!aeS?K zC&CmuyjHwZgdk7KYsEVlg3L;<74H-sUMt>p6XUhwogxJ5`D?{HSu;XXd%jk@gAlJ3 z@AOUtLcCVIQ!?VU;$6oPq&a=9cqhX0wc?%Sh}VjDN=77T*sm4um>RDY@4Bf${^Zw+ zcOoobE8cY+A!$WkE8f8o#L~Q0ypyRx+P&9`cS4BQig%riAY=Dy#XA_{wc=gJ5GA!6 zUMt=OcO4;!qXUQ+W8^l?g0`Oj&?Wx6+TLz=j}N`TkZ4{}Yj{aD)-J+?02=Zn>AXkY%U)~t z>ACY-v+ukk#B0sIju0Wa>|Sg3iPUQ4XpXlF|-+Qgu2OV$?R}EPYp@%HQ zl3Vxg`Sxk^xVn3|^;UnfcQ1mdB&DxCF2C4at*$vQ|L$pX^`l#i@v#OJZYZh(7B@0Th+ zFZojr_AefX;jFmQpp_Jr=t6A!85VuiSynCxTcNbUn+p{POQHs&?ri&{VK!O37- zlAmW}=O@X}Jl(AxK5VYY=6Oek0jm0~NC@m@Hb|(LLVEcY$@uo^_WSj2bMrGlAIZX- z-`}{@wluDmTr!lTnJ>sjyZ%WP36z3+kDK@RtHDd_Hd?khHS~;LC#glpxr^yB2T2-A zR9n7#*nC>wUg&awK8>jBK*^@c(CDR5YV^&NG^3pVo_}}$O+{D#=Wsbv|>fBKR4 z<@b+Il2F2olj{;`Vo4uO)iW=z^!wG_9cfd^nE5=;Pm|F#lIMrez|+tlHcCV9r^+Tb z4dtMu@Skn3%B{RM$)x>eTRmzjaC-8MY|&X+5`MeZ=ksOJmPJ4r6!JIak0BY#w~tiu z+}_9ctIOV;Bb{$UL5hNu&bH}y+h>)g`uXWel4`5W$nNc=HKr8RP zN1foexBceXs-k2xNvdER%`3s}^DbCZPWM{(+x3+i2~AKIDMi}!VUXdw(Fgpesbm&b zP3E0L`N&(hA7v@{E5q@h2HduU`Z4tzD6nez(|~Q+?{A*Sz%4L0J}OEmQh5=M(6UL< z^>g!mIj>2tL)v!4gPI}r_C8d}`WfAKS0q%vfA7D)iPK;~rS-W?t!I)IOD=gN_D&_j z|5wlOp|@C4ayUYw71Uy}eNcJF%<4MMv(EwhziydgGUG?cxC({GVlk9@u^KW!3`Qislu zo=Cd?akmk9Er0IT?`hV~s{$d1!JD=%=!VD^=C>ry=TB{mqD#B=)AR1$XBS}FqM+t9 zWi1A3m=X$)CJDEr7CF$vw59wA9Qk2&|9-9KDu=HgDK3(1Zeh{*Q}22Bq*##SQAs;# z*mw1^ZholGkG}tow1WH|$iY9LrZw8sAFrSVN^7*tC>Kz7;;0ps5CKhrXw8$GpL#5S z6Qv;YyDajM>tJ7q;18_UCCHu+yE)QvVwLoQCFQ^D^2hzB^{1zoD{Y|I#Z}7S7%lLN z5CvtFBl3N@DPv}(S;;%8Hxhn$0;nJxG*n8OR`=jMX|3O*Kco^!Kpo5^OUbv{e4cz- z203)?Jd7ynSW|u0kmLRO>0)(zd+~tz_+oW^jVwh!@Im4#%qWEDi4f6`ucg?5)DKYd zYC=*`)o{^J?U#zjW`n9n)hM)rQfi&}xX@Rq8%}b_&vJ#v+J~d;LqguT&%#{~b`veS zW0PfhVI_pmgO{w3w%!H&DJz{L3`gC?V`!{wHdv9tkj8KxmsA19Wk)f4p^E?GnW zCY77v2w{=L)CE-fzb>aEMP}?q=weLQU>@XI+Xjg%Q6{5xet7sOWuN@NT^T5Cah7DU zMG~-fRr3W4qP7X>x*hkd7q?qPIxDi-dN|4k)J03FH&XreDdmY)LKi^Mbq%ISgfHUOZl+@HX(eHO-j3s;a3@UkQncrL^ zaJ6)FP31Inf}p9Wg89NMHWhh#Fm03utk+J2e(coE)#C%oJ6)ElL3&PY&JTRps9}fA z`rED9ej_(jy4s)+ipJXA_94?IUp5i@x(U#J|DI&M@j^37VWsF6#LrTNiJGX$8u@_r=F@b3JYvV(_?8GtcuUvto+8- zK^r2+C#b7+P1GQCW;>^QpgH?kid#-ls3-1@sLwMX5mnf06v+uOLXES}^)#A?K~iT+ zRPdA2=pvABZ?{+7 zH2tum+5RMn*;_SvSV&{1P^#)qKW(np$ROEk`HlUWAU<}j@V=$I|9Mp-JxH@Jh}XN-BVF}*4%L{AOw=Yo zj;Gd@)JjzRt?Oo8IeR+=?@%HrLARI$R62~+C+VeY>>pYw56gP8U=b_gm@6B)K1>?i9TMhAFt300auoNc+f#oa5ak?a;__sTA}{Toa_Tqhb|@4 zYgaYXRx2|zdVBeMr5h+t@FCNxm4!gb)#1!y4==S3X>1gBv&9E3U{@;Ny`XO^FC#&SrXzJxWaF9;^EZ|G-+3QCp`$ns_O{VGksmly$^{wtkR}+TH5m!M9Gb8YcyY z5NPU*pS}X?nDrWurfcROSi4eO;X#;T4V{|ChDD8dj^FtRmy3)URnpRXhDnC*ZYvVQ ztvt%5MVI|xGJ052r<-81FUZx-MBrnrDjY8jc9qEq)tic_-#ti-cqv>yrRxl4Q%_6E z=k=l}mo>icFO7#d1|3T50l4Dorg&j#Wr?ExCDTHy+CE^KQ=}E6({wK#1MF59-#vjt zdfNpH7CQFSSSso~;$XQ_ML3bmKF%yE*h~WH^P1=kN`N34T|A!;_6HU|rDCd7FC``Z zOMSfCiagdmy!VzJAls-dGlIz{v{ov4GN)Fu2j4u2tIU_GxQ?16PEx8o4)p-FWwzx= zwKm{)v&u?@F%_sMaGE({ln`H^FGxvV#Bp3q?nOVR2mo1eW+22)XDV2W34+~D_e*v= zqbsh>l$H%!%#hgJCfclb`64I9)gj7Z5Au&%l$Kn?_&f8wd13kSm{68kzoA)KE~uIu zI;9s&lyZ8GWvmZZEUAH7U^>ooH44a;>t;DGi#m>%=*!b6J8iP_U3%(ACD9b9z9}};vHJSi zIYyE0Wu8&4yVR?!I7dYM@7P@*eUvTM(-!^w@s6E^s9LVM{|mK=lXStZl9=h~ei}im zEt@{ZKd7iNrxx<8NUI?0HX^s%_ZxhSdIfy=@bjboWQN2?SY&aClgos&h+5~CR!{%X zb~_)kje`s?zrSblC3Sy7J3tE1EXpRU2;S(1(#FRa#k|`BDMPLUY$a7-P)P{Y1P{11 z$h@To*}&*wxzMpNZAXzvSb10V8# zsd6`kzn5jPD4M0OHVx}r%leGubBY=^TOz)qGNgR>U_0vV)E%W0v9Ho)5WPM0FA-xd-`6_?CFQ zwn8IKRLqpfk6+3}?7C55f<$Z*Q|2sZ>QP1;*H+@?(3^{*wA|-6)JcLiiPYxVK}z|J z7}oQ#6vluW_XOg#b^+Cxa2Z*M)XzGRdg5biBs||yP8%8-CSkBzORtmLy-p7cd>Jj1Q zgs=RPIsWA8^08jh)|^nsP%Ed*^IfP`gulJUuU!*4CJJH~BB}!+94|na?eoqHpXBj2B|WU1dbfOJRESQ@GMIOp z$4BKrutbgVR)mXknX+t7%WB6;V!CjE6gY|rKxuML(Hi5hvlFVAlI{I1bh%!moA_|) zqKGr8JTHNZ^wNU69jcwC4h}1IP~qVy6x-B{!B1U4#ih$qRy@0 zZHOn)m1(s=)knkA+Ln^;GG?84#6sce22RDp+FLKfMV^v`7e3W3Z8x8=DSWo22$2e3 zcM}l{xVl%;v|A@VTgb=F(}(S|FSTM~SL2`w7in(c^rn(1UomUws_$YZ5>Q7O%vpqx zmO1-&;yE~3c71*(GY875pj(DcreZgUK3ti$ZL(-AI@3&wLIU)#1?LzYF_EbESx_(= zyY5LGGA3GGs9sARHi;jVhW-SFfiYz6p5pH|F z=eXVW{XKq7*#JAIyjW#COGwNX7UNQzrdDA13aDo}V<&~%Ds>n+l31`~$Nr)vlyRC# zFeo@LMKB?1p!C&;l{XI)yzvO~C1Dwc!41l87WeGVmlh){RgA1jGuce&8P$c$PSVxE z;RGp*GNRb1Obgp0QL&se9=re52hqEn_K{?B;yzo=uR$;Uxf;eX{+Ig5e;VsMD3K(OW#=Pm8N*o)tda?P}Bb$UZN5~7b#B^{qdO$<4 zC*hc#(4ePyGt}flr_z&4^eaVcAFwTu-Qr)BvtpAD?AngiP| zw-(|wNtbaEFLC!8WG83(^)rV|{<6plqR5sZr{swHF)#;5vweZupRF!6wEF2_8stP7 zFB%5hz+CNV46}nH1>3M1KUWYa4+e5tg)qvk!)D6K(6mFqcz~6z6eeVa_hQ{usK=2L0hQ2+KxRI_~2-DzDD3^HcOn)w~HSf%hG>;1qUycSi z+u4y5jb6_WuMdxp&kj$HXUEsaM<;vyKHPKM(}O`O1u4p&!86gHKAvJ;wsD%|-uO(+ zg+5Hh*0zm`gpfdk=ZoXR{J{;(8V&Ds<1shIou;BcBp+#Jc6vLgWDL=I2h6v^XreO zNt@yA6cs$=43*in4xsTOaug@e=Pp3XZ+KQTp&0Ar=u3cX#H{Q!oC8W3alR~vM0APD zO@NHs6P8qejoCaD)Lk%?JU!5J_}F6$pPR}UY7kUIxPgUX5R_P%?K@WQ!N{4nWfK!% zZ(;0=>ZFVe7hkUJ$(-FPr^`wQ!+rJi{^{AIl*GCk;2uhtQWnq6jh2#!vjfE|w6Hg$ zfT`1zQ!)gX8XE9`mR_^9!Z!ia)I>0pOE)`iu8r(7B4U7tS=dC&G{&B0o*YTm(*X=w zzS2A)BF&A@ux*NJKHWIn!Wtb_vXAYWa(c73mghPW2onB#w8nBDw^1X$7z2a6(~@YW ze~s`E2i_3d>C4qV)%K1@SWw5S08QCq8Bsu^aa_RMOT%R#-VD>S5zLTkC5~P)N7SAI zFr>h!H|3mlr71bfX7LPX!iZ|ft{@Q8vr{yNvUmcfDl_&$-iQumxI^qycz_Fkz5ZIp?oj z+w^?fgJ;y&hz9MPn%EhkV;;;<&l>O>E`=Dyvu)>3o4Yk9B){dCjurD-9lSa1i*1fiv`vsi#Nnz^H1AaKq6gl#3uZgJGhM1C?nP8{ zQa9#!B}ZHxTThTpNa0?I-MMA&h2_tT=>E~3ropV!PBig+5RRN?8K*fN%y?e+Mu(=g zO_=2+dnkivID3$&eVCB6jO;}-PBR*q>(fqfoLnijWCSDjHq8C0ubp0Z>Zwy?`gm~T zH;cGwTJUu1#?c9}nP+G-Hz$Y3D8l=&EMm{mfWm1pXFd@L7Up{0(d$UB4XQUjOvC6_ zq$du?-8ns0>e8q?I4?57qoWXk*fs5oXn<*xV&RKw19Q0lLen^(Ks0qyu#2#yHr@FQ zOdE3;G=X)7ZQIw%B3{3<7>T)%#N-!-3Gz{ z7!L2J%Y+1mrazXg_hu)Wqt#D4q*yRYJOxSGYHe*ecR51TEb#-N6m7jgcBeJrP2)5P z3S=v@^V{`~pl3psJOmshYuVIP^Plu7%d=U3`q%hYInRxEFVKk;M zur)&|Ndj8TqK4FFmR_x|x{cw0)EP;cGYCc0gn?n-sigFJ)*&8917hy6M>k9Aky)72 znI6iMwP|c0PeWRW0)fmjqUB|0$F%fl(9k(~6_$ynM~<}$dHs|B0KQ71ZZpxsySSO2 zD$SC}k%=X?D8XS(CT`eypjxu~ZLkJ7b@?nrZT8T_b;=OGT&Xp~|@lFU_N zR4qB==MLdCY(f@nNQlz=q!yRi#b86ic0XAx;*1$fZ>F{^oW4vrei{>OVX_XS5`f}Z zj3=_DOvxtTVij&~SMU9HEEgOq53%T&b`Uy#?b$al!EmglE^vCPM$9h4YWPGMwwT%o z=G0rKA*XY?tY%~-nSeoZID7@??8(l6Uf75QP)sd4xY8p#te%EB2jZ+VxqnCrkzLhs z5#W{39E9N=bEx0h2KNpJK2zI{!K8-y0>nO+@vIl}Zy0|{7BvCFrmPn^`v~*g{;^(` z_m7ce?#p$C8agr2!AqR01_p_GC6C@5YgN4ib1)Bajdchm<_?;RS!3r z*ujd_;E78rIz&lD10!09e4RQ|iF|bZVe{UIUhk>(MzrpA8iN4vb1?A^ls+f0AzIK9Hw_p{MpbjM6Up}vQ zKM!^v7;)n|Y;X^l%t4(Q+jb63Z4o5_`(3lXj08KUObL!zwye1Je8-P#JTBq~cZvv) z)h&4y%UoJB*=MP?NzQ;~;RehM@_xq`!$EF|v<{+ViJE2^V}klJX0A^-QE|PKImiui z_g>hqXU1?aBru|sR~#Y74bz%Q$lw|t?BfBZTFNAJ0>X&=Q@-S3zWSU&C`6L6TI0)@ zw81(|u5IK3DhS>Q3E;DBJJk=`{^*ZBOcPL&3kQRR8PQ+}lVMLq95=C}!9;(gPY#ci zW+0g^8E-5eLpQ8|3PXq2!4UV&4t^=dO4A>^vose3i;pLtS6P_gcXYgCEP4mVoHd4N zFvl*E%4?eu`m@feHHLxPiM}A-)-+{E14dT3)%AyLCIwFIj2U8J46SD;n%@8rTKF)e zT*#A@y~|55x@i_>c7_dO$)T`(e*TZiDkDEi`H{$vAIz&~#Id!wus8=8s0Smtoy(7R z@}rd>3T`2P{R;<2Z6=a3g$<`_RqAy)yR+9zJciait`FZLVSkYnRlXokNcPPo@?q3?&99%@4ih=lil|2 z2e9j<3$O0Me(xD~Po5MA|Cwlgvm$L^cO=WSGFm@z(!dam*530GUg$&m&#=wBntUwT zt=HoLk*ntQU2El1e>ku-b{7=A?w=$ZkVNy?9`b~CXun-Q(hE(3?tQW^bp)1A2H~Us z3c1lExLgne=Wh6v#^k--jYfV?CL*%G7)H{c6(7aIQWi)aQ@c~R{r>-qH$~1L7PyzT;ce2%!e|fq7+5gxdHr1i-5-ldkp#LoH zH}X4O{peqPceUHz-uhQGWO&Pjd#lqUOx%@Fn~p8UccaxEVrzUo*o=ox| z7>EJy*7U6Q9#Hc1EeX5^Ednny6DdiSF1r$Wa1+vW{D$r!$HLRML*E!EPOA)PmZC6oOo-75}|Jn z-q%US>3gh}gU3s<2TaXTBS$CS(<1(3Nl-f^nA{kwWrhrN?UVn34epQSBNw~QtHeBSWv-6l^dk{bs&XQINJRUNgp*89M2^4o0%4?=?)BGFj}jX9 zG^bn4lZ4WcsD_)rlH;T=VV;-@_PuhiWc44hrG4Vt&C~eRAGRMg@&QikAsbx(?p{)E zOih~a9ykjv3bdR!Pru8f0pt&yZ+!Rjx;+p`$5M3e_I4Kbs@q0FH_Y>gd#5+P<=bALU0ojVWj|y5+F$Qou1~Q=^X0BA9Rzg{8yT@-p_U-ctTt>!n%ZqDKS~R z#1eWlG75>wVn1OrcO?;9W0^^wt%G4Qj|CZ%ui~G_6wi9s@W?#HKXV2DEav!6Hn^6^ zJOi6A$tCc0DLkhbVJt&}&346Lhl}uh6it|@Q2?984F4>q_-7G-808TT!;(ir62e5U zG6_qQNf4pM58BtAB;RS`sFVcSP?U&;#Y9YkCSnyckycjVaiZoaww)s#z=jKna3L`X z`vBlr;;3?5)NGNbqZ36z zm`oDQ2j&J*VUs}6pialqJFC^Ts*+tUZ5XDJY`Ec-%IC{OqSfH?1lI;z0*IPB7zCEs zEFtB56_$aM5EuH2a*A8hw^x%-~ovroPrdk>roOizoxgnam?OLny+;t#pHH13!$9 z=w!q8?i(pors9}t3G2z0QYzdhk zMnwI`C$PvxwRg@#$Fch1H(?Ml!_b;|#=)g-M9nPQ7)WzF!}yt4=!VmDxdTVQW|z=Z zu#SlVab2iI@O+voAjZ~)M;BF1p-vbZ0Sbc33Bl5QdckJLoxWxT_9# zg9`*tgehz$l$?`O!ru8!8E zmGjQC8VrUnIOCTxZgir7ZA}o5qsNXC)T~bA#mG68wKFC|O$?WIztbZ~{l~`gw8Kx3V zTbuT1X~WwsWZTEX+nqFEm9#V)Uaswsl=5biiJhmuZ1JXLo(SgS%*~iFR_nO2$s$wC z>Xd65q*#9*IP=+fMX6V~8HrCUlzJDIiASXf#NPJmllboxr;MC~&pOQ=I7PK-29aV> zpZLE`iAx_z9nOLC7pOM&c8c;FaN|32&guBG#(8E19Phm2QZ%s9KD)wIEr|eSVftFi;PT{p!Y%UT?$M`N+6iF+}i-V z3BVi?xM)0w^Owc18@Z&Jw$jB8+$4c*D_w|xafI&80B&Bed$pLMF44j=805kr_iS+q zwvjBFb4L6+$7hi&$5dn_e8yX>Q zVuZLU5#Y{+zZDVUZjAsp3huoY0d630MfIuC(;N`$zQaJbTnOX|jq zmc9%@0r3Ul6x5q&4$gDp@cgvgso4EHen5SF<(!c?V=^EjcHWffj>%Jlum#xCh>wU( z8DNcq_y5MV9#_3$V%g9!euiVoT(sshDyrv~%_y6P$$YdWb4q4F6$@$3uA4#qiy5T6 zy9N(QBa=psnlYO;k<3_#Lt}|4=Pn*MW=36YDZ`zruQFaaznd~ZQ93Bym7dB!7AW#R zuM)d;>Z;4V)*+LJT4|Rcw#Q)E&q`lp!v}q86=j!XuCE%Yyq^A`>@7h27QeawYDm#4Ht?O8vlg0K}9#iSe{s$pAnQgiXli~V^glHOq) z|F=age*2KdX0OG+#)F1qt%6eTYrG&32sAdwu878~@@K^P8Y{r?XTnN@SE56lLO6lNF)s*y>tFnc`5_)OPfII-Zm9 z{1UPP9Jm7DBv5{Pbi;8|y`^DEjN%>Ey5d&yZ44}YD{dw4{Pq|y$-A+fNkMIREvjKj zoZ=NJ(Bb4MFr|q_LAVW96c1=}oan%FQN)Xh{i{)#kR7E~gED9yw zY)08|rWaoki;9OnZ?Sc|e++CC_4H-qA?ybbCS zhWkk3zLU7WKvCwfD4h^w$_^GK9u#E+i_#Yqh1Q}_Bq{4ylu@84Usx1mauF63j)uc= zYr*9uqapP;l3ZzZ9U)e$>nQ&_PJiC+EMbjhV0xiHl`NBvZK6L<;Nx}V0$$g-e&>dx zZV-nkvY~~^=#HPl&5{Lf>}C>yWO8X89o~>il8SdgLn;X<-d-s5J&IXc%rr)VM>JY3GixdQs5*e}<_S<^ zsNd(7gZn2K9nz88H3>dl`~L?;cH)!vl_NVwXU2B9+}pa7YJ%*QA<1+ zJk`zvMSWt6lGNOSe>PB{e+nlVsxp}Gf%@n`4=NEwEz#g{ab8(8u=1|d_oz}TOlnqV z4J2jaCf5;9lj|t1*dKpEisD*}4JY^_}xxZAwa_YZKEvjq&AEnl%h(l0nO``1Bcr13s&9I~Q z+T@D%Oh14JkrNxX#UL}D?$3*!a6RS1`p*7oCnnrR+0Z*mWKkq*?9-5~isF?azz_q@ z$1<~z3Hq4K`TTy$~LE%eroP zt<_s?osScQRxzn#EftF)@^t%19Ml#}aQ#7}T&rJ6oa&yO-{O#S*HcMwQ?21c&`g~ph4id$(bEN!i| zVq0VF5-U@=StpzwkB&QOva-6SSS#yT9MumFmRYM8Sh(zoZ3NW|MZ7t*tBo2S-bqn#6bgV&T{{Fe_is| z`+pfwdfn2B?@T=|_~DYL(%ikCv8UE7Y=7zbO;1gq68wC@{4t-M_4|FFRcv|VvX|FA z{$P)~m=}NgZcXywHFxamHR-_Hzb4K}E&B1V2VTANyPJl8dH!qp_LYV14JjRa{y6ob zjw@cfzyEma6_?Ha!gv4hjf3-^eE!SN-+SlIj*qNw_+ZwDcg0?@`RtCy6*dqX}>-E{uO(_|E}fnih?Cg{W3p&r%(R}QEr&A(fb`) zIp-e>qD(ZNFe^6tmek0EgquvtGS1OYU{aYhn~H?A_NSk`L~R62vt}tM{e+~MVQA{| zbWlCEE?&snM?Hqd#AXvsTT**HZS6(BhhnI8Fq?YQ9oNAhhM^BcVHDw^IXhHDgo(pl ztx?*uNjbe=9T2%y@`p@Qzn6Xt^^4|UjebRk_=QRon69{! z50`HH==o5;XcEk9qOKyvaNmfcJ3}$l+cBFciWH_NW;~M-ilI4I&7GAKo_;PALm@Gn zsFO)C+}>yV7oix;X9A<9U#HdckxVRobd$oA!p6AAhQysFHcsUZ_1%o_bYt#-tx%p& z4ZSHvA+%~Zr?2{mf6k%)f@(M?M}5RU=adLelwuW}TES^AIjaQ6EIIcJjv_fNA)GxS zoP&bX6;eDunN6J4NpgA#P6x?3PjF%-hX%f6x=GG-!HJff8o}ud4v*=zg40EE9uS-u z$$3d|c)Y}sOYRx&?G*jwZg+6ZCTjf2d~@!MX=<7(3Jt2s5XLBljt8VD?~y4kybRq+ z9zI2h6$D|7Qa!*io2YbiUo&j8TgE zxn>jH$z1WnWFS?ks|7)}Mya0Q@EVDv9^Stk^Q@}WlY$_OQ3_*NNKweiJlk)&N0Zts zqzGe_q8OP?Y6*z#@xZ;BRC`fT5ymLRYD?)?$$dF*YEr|56k&`~eVAWr2p!9nwVKov zAw?LY)L90pdmo;MqNt|E6+((IMky-6W)l*QnOFa)ct?|ZP)HHRDAf-fP3o!m)TcD5 z&xI6Wj8ax6H41k!ov+=BQMww!o}#+3!p11o9~`r3Ans&7e>3_DP0Ayr2xF8Q0FK#2 zd@{d0KWB_4wMs}4#wc|*IA+rj5`j5bz3L53YO9bUj8Tfhrb&$`TZSU2#_M+>MHtQ- zMa_&ba7Q;KJ_ua6V^VF^e-|W*i!0~X6c?9b6GL^W`c#f{y(&#d=0vaBM%#-S+}M}3 zjZ^u#=)wxHouO%VJLI^o++iR(th{bAbkPkq>d6xL8nkl<{*n(W0Q)Jl<1%cMj@bH1 zg9*{g7yGJI59S(rb-}m%mTJo(N8y$@19qp@~8L>YpJqV3)B5&9&ua z(N}v5)NgefpkfTC!J$^GAP1^ip@EAhp>bTN0r6dMd}hN9O^F<*8|rBww=FX>*NzW> ztFGZ~>fWOsnC|i9Lg}&^ApmtlLOn1mKRc7uuL^$w)D06Q5W2$u<|nD3uJ7-C1xij4yQvI$KU$m{onp*4w38D7WBx z448@M&=dT}6)s)Uz<&#vj$(9RX#+wWmfjj4jRaz%NG{89)0gmE( z+Hl--CR{$HBpDw8E)TfU5L{@!>I~d7A-K@^Mg#Y91UMSrwnTu70`8v?;4lVJK92xL z^~t{@#04V2QPb9C1a3ML?tPHIy&}M&2~-A0fa?t0=m>B$EtVDmj+$Lhgt*xe;OPB& zBf!!0pFcv}KO(?Ud-P}oIP&+!2ym1x+athH(fwxxxU+$aIu|#c3721}xgQ(>j?y_R z0-P1NSrOo9vT9ibIO+!776FbXQ#M3^qj-E60gmdme?@?!^y@wnH=PNW&J>U22yo=y z)Ch1CzJ(Fsx&n7^1USm4Pey>F`e1VeIP$kO0vzSjkHX<}6F7hyvbcpg3J0-qW~{I{K^E7k7Kf~eC?!Tu_^Asp^NdBVA@vy++H}8TU}`%LL4`}V zTV=QrY~|2dsV1^kqouQ610+Jx#L_}Yk3%>-fen;X!J)_#$G?Fx-1Gp;w}BqJ;I;1> z%8!lB_2J&VZbxXi%;RTeBB?pWKHA$qrTrst4$01faW{P1#NQBk?!#m23T8v$0I3Fv zhuRa^_yEu{WcygiGTRQBZj)2Ekoh*+Als1o1l&<#8{fg57nxSqH=wcql9iEG*J1v2 zg#R7of5+KhBNcd}>bo^u9&N(@tERkfVx3$435TMam}Szjq)&NCZan6lcw?2B6}jnr z4-Sem<$YU9`@0Z``fh^lyC#>%s;i&X0S^D@HI2vWTN+*^e#DiD*o)hGjczOMHCA!~ zru7=R755ss755ss75AD1fy2IQmJGDfrxWDbp@3iq8z>Jh3)_YFHKSr=5I@58d z5q`XKIqo!<6R%u@`+i&&}ys{JbgSafpKXK=>^isI& zAE3A_&318$b|Z3Gs&NQwQF?>ovgd;0vMHdr#CAz7M9ewwkfi=CDU(^X?Es4V(FN3x z%#SlbaX*HF;(pjbarYV}<(Jf*l3ELjyZ11tpO|~kg5vJAfa30b2#UM+9jIRz?gvnm zBQ44aP?RDT#f-t%UyO2qTEnPpP?&as?FFE?D0Wt)L2Hn2WlLnJ^_`&sINiM{GUbn9u$qVEy^#TxGQ{P-db?gJ>)4RMrFsfDE?$x3M;nOwH5qrxe-JQHi(rV!5N5KeOlhZd$SaQ239sJ=A1^GyinKnUk>2^m9=qatv~t&;bKq^P-H%WOZCygico0@MS{_FKvOm!v2| zJmAn&@qAfd*G24!yc&NHcst2einJu+P+}0|o!JwXDw$w&(Tgv~OqSk6Xv!w#U zc}_{?fO>)1PLe#@_QP>Spk8FQrILpok#wvS8RGm_c}YCE&tB6+V#>Mcp_l+<2H9hB6sl8Tb;bT>)SX&fHX z;gT9BDVL;Z8xO}7OKP5^mPl%)r0$W_Ba(Uw6mP|!2lXzC8};gW&VBfUD{?y+XBg(1&YV564cvFq7D>KgT)fJQc~AR z>Q+hJ2a1+fEXqTYw+R$?nN?__&Wf})Ye7B{2@)eIts3hsc~sGGuSZB82-cOQf7Q^d zWG6Nn4m;`GMHRIoV&FuLq2F~BO@KIaVI2EYe;UUiS)Ze@DhkK0P&@ngz!hK75l^80 z=oGy}RZegMyOTcfxef#8n|3@YkTUIP?DcOWO8%nghURFTtc>lqj6&vj9r2Ie)Z{wg zsYpxE4Vb9GUcU6e_29)eUIoD>*EgPuq+rM~*EdnID~icsb1EB|PNcC-eV-=RK2L=$ z6u!@ND7DG8H>};>s6+iz*;wD&fkq}854+0S?BxQ4AxU*3sBW>{xTSb8+}x}3jo z9<=C)-*tF0-h2$}3HXoGTu;Cojl($pLYuD}∋_y94!yS!PLUZVbfU$_~aNFU7%a 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�k?YB7@9tryYEDbxl|jnkV&=R&ho_*x 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 W4}~+bWcg%1O+ADx-vmx;v;GTqLH+6g literal 0 HcmV?d00001