From 57615775eaf386419b3446a238cff01616df0f42 Mon Sep 17 00:00:00 2001 From: Bartosz Taudul Date: Wed, 24 Jul 2019 22:24:17 +0200 Subject: [PATCH] Migrate to VS2019, vcpkg. --- capture/build/win32/capture.vcxproj | 10 +- profiler/build/win32/Tracy.vcxproj | 29 +- profiler/build/win32/Tracy.vcxproj.filters | 3 - profiler/build/win32/packages.config | 5 - profiler/libs/glfw/COPYING.txt | 22 - profiler/libs/glfw/include/GLFW/glfw3.h | 4248 ----------------- profiler/libs/glfw/include/GLFW/glfw3native.h | 456 -- profiler/libs/glfw/lib-vc2015/glfw3.lib | Bin 323518 -> 0 bytes update/build/win32/update.vcxproj | 10 +- 9 files changed, 18 insertions(+), 4765 deletions(-) delete mode 100644 profiler/build/win32/packages.config delete mode 100644 profiler/libs/glfw/COPYING.txt delete mode 100644 profiler/libs/glfw/include/GLFW/glfw3.h delete mode 100644 profiler/libs/glfw/include/GLFW/glfw3native.h delete mode 100644 profiler/libs/glfw/lib-vc2015/glfw3.lib diff --git a/capture/build/win32/capture.vcxproj b/capture/build/win32/capture.vcxproj index bcf4ac8b..2430db08 100644 --- a/capture/build/win32/capture.vcxproj +++ b/capture/build/win32/capture.vcxproj @@ -22,32 +22,32 @@ 15.0 {447D58BF-94CD-4469-BB90-549C05D03E00} capture - 10.0.16299.0 + 10.0 Application true - v141 + v142 MultiByte Application false - v141 + v142 true MultiByte Application true - v141 + v142 MultiByte Application false - v141 + v142 true MultiByte diff --git a/profiler/build/win32/Tracy.vcxproj b/profiler/build/win32/Tracy.vcxproj index 7bc3ddc6..49004603 100644 --- a/profiler/build/win32/Tracy.vcxproj +++ b/profiler/build/win32/Tracy.vcxproj @@ -14,19 +14,20 @@ 15.0 {1C736F84-08DF-4A7A-A7FB-7BA3412B8C97} Tracy - 10.0.16299.0 + 10.0 + x64-windows-static Application true - v141 + v142 MultiByte Application false - v141 + v142 true MultiByte @@ -56,7 +57,7 @@ Disabled true TRACY_FILESELECTOR;TRACY_EXTENDED_FONT;TRACY_ROOT_WINDOW;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;WIN32_LEAN_AND_MEAN;NOMINMAX;_USE_MATH_DEFINES;%(PreprocessorDefinitions) - ..\..\libs\glfw\include;..\..\libs\gl3w;..\..\..\imgui;%(AdditionalIncludeDirectories) + ..\..\libs\gl3w;..\..\..\imgui;%(AdditionalIncludeDirectories) true false true @@ -66,7 +67,7 @@ Fast - ws2_32.lib;opengl32.lib;..\..\libs\glfw\lib-vc2015\glfw3.lib;%(AdditionalDependencies) + ws2_32.lib;opengl32.lib;%(AdditionalDependencies) Windows @@ -81,7 +82,7 @@ true true TRACY_FILESELECTOR;TRACY_EXTENDED_FONT;TRACY_ROOT_WINDOW;NDEBUG;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;WIN32_LEAN_AND_MEAN;NOMINMAX;_USE_MATH_DEFINES;%(PreprocessorDefinitions) - ..\..\libs\glfw\include;..\..\libs\gl3w;..\..\..\imgui;%(AdditionalIncludeDirectories) + ..\..\libs\gl3w;..\..\..\imgui;%(AdditionalIncludeDirectories) true true AdvancedVectorExtensions2 @@ -92,7 +93,7 @@ true true - ws2_32.lib;opengl32.lib;..\..\libs\glfw\lib-vc2015\glfw3.lib;%(AdditionalDependencies) + ws2_32.lib;opengl32.lib;%(AdditionalDependencies) Windows @@ -192,22 +193,8 @@ - - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - \ No newline at end of file diff --git a/profiler/build/win32/Tracy.vcxproj.filters b/profiler/build/win32/Tracy.vcxproj.filters index 8b89f6f9..c199fbb3 100644 --- a/profiler/build/win32/Tracy.vcxproj.filters +++ b/profiler/build/win32/Tracy.vcxproj.filters @@ -279,9 +279,6 @@ - - - diff --git a/profiler/build/win32/packages.config b/profiler/build/win32/packages.config deleted file mode 100644 index 51ea465b..00000000 --- a/profiler/build/win32/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/profiler/libs/glfw/COPYING.txt b/profiler/libs/glfw/COPYING.txt deleted file mode 100644 index ad16462a..00000000 --- a/profiler/libs/glfw/COPYING.txt +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2002-2006 Marcus Geelnard -Copyright (c) 2006-2016 Camilla Berglund - -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. - diff --git a/profiler/libs/glfw/include/GLFW/glfw3.h b/profiler/libs/glfw/include/GLFW/glfw3.h deleted file mode 100644 index 95caa955..00000000 --- a/profiler/libs/glfw/include/GLFW/glfw3.h +++ /dev/null @@ -1,4248 +0,0 @@ -/************************************************************************* - * GLFW 3.2 - www.glfw.org - * A library for OpenGL, window and input - *------------------------------------------------------------------------ - * Copyright (c) 2002-2006 Marcus Geelnard - * Copyright (c) 2006-2016 Camilla Berglund - * - * 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 - * - * 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 - * - * 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 - * - * 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 - * - * 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 - * - * 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 - * - * 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 */ - -/* It is customary to use APIENTRY for OpenGL function pointer declarations on - * all platforms. Additionally, the Windows OpenGL header needs APIENTRY. - */ -#ifndef APIENTRY - #ifdef _WIN32 - #define APIENTRY __stdcall - #else - #define APIENTRY - #endif -#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 because most Windows GLU headers need wchar_t and - * the OS X 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 - -/* Include the chosen client API headers. - */ -#if defined(__APPLE__) - #if defined(GLFW_INCLUDE_GLCOREARB) - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - #elif !defined(GLFW_INCLUDE_NONE) - #if !defined(GLFW_INCLUDE_GLEXT) - #define GL_GLEXT_LEGACY - #endif - #include - #endif - #if defined(GLFW_INCLUDE_GLU) - #include - #endif -#else - #if defined(GLFW_INCLUDE_GLCOREARB) - #include - #elif 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_VULKAN) - #include - #elif !defined(GLFW_INCLUDE_NONE) - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - #endif - #if defined(GLFW_INCLUDE_GLU) - #include - #endif -#endif - -#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 2 -/*! @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 1 -/*! @} */ - -/*! @name Boolean values - * @{ */ -/*! @brief One. - * - * One. Seriously. You don't _need_ to use this symbol in your code. It's - * just semantic sugar for the number 1. You can use `1` or `true` or `_True` - * or `GL_TRUE` or whatever you want. - */ -#define GLFW_TRUE 1 -/*! @brief Zero. - * - * Zero. Seriously. You don't _need_ to use this symbol in your code. It's - * just just semantic sugar for the number 0. You can use `0` or `false` or - * `_False` or `GL_FALSE` or whatever you want. - */ -#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 keys Keyboard keys - * - * 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 - * - * 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. - */ -#define GLFW_MOD_SHIFT 0x0001 -/*! @brief 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. - */ -#define GLFW_MOD_ALT 0x0004 -/*! @brief If this bit is set one or more Super keys were held down. - */ -#define GLFW_MOD_SUPER 0x0008 - -/*! @} */ - -/*! @defgroup buttons Mouse buttons - * - * 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 - * - * 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 errors Error codes - * - * See [error handling](@ref error_handling) for how these are used. - * - * @ingroup init - * @{ */ -/*! @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 [GLFW_RED_BITS](@ref window_hints_fb) 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. OS X 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 -/*! @} */ - -#define GLFW_FOCUSED 0x00020001 -#define GLFW_ICONIFIED 0x00020002 -#define GLFW_RESIZABLE 0x00020003 -#define GLFW_VISIBLE 0x00020004 -#define GLFW_DECORATED 0x00020005 -#define GLFW_AUTO_ICONIFY 0x00020006 -#define GLFW_FLOATING 0x00020007 -#define GLFW_MAXIMIZED 0x00020008 - -#define GLFW_RED_BITS 0x00021001 -#define GLFW_GREEN_BITS 0x00021002 -#define GLFW_BLUE_BITS 0x00021003 -#define GLFW_ALPHA_BITS 0x00021004 -#define GLFW_DEPTH_BITS 0x00021005 -#define GLFW_STENCIL_BITS 0x00021006 -#define GLFW_ACCUM_RED_BITS 0x00021007 -#define GLFW_ACCUM_GREEN_BITS 0x00021008 -#define GLFW_ACCUM_BLUE_BITS 0x00021009 -#define GLFW_ACCUM_ALPHA_BITS 0x0002100A -#define GLFW_AUX_BUFFERS 0x0002100B -#define GLFW_STEREO 0x0002100C -#define GLFW_SAMPLES 0x0002100D -#define GLFW_SRGB_CAPABLE 0x0002100E -#define GLFW_REFRESH_RATE 0x0002100F -#define GLFW_DOUBLEBUFFER 0x00021010 - -#define GLFW_CLIENT_API 0x00022001 -#define GLFW_CONTEXT_VERSION_MAJOR 0x00022002 -#define GLFW_CONTEXT_VERSION_MINOR 0x00022003 -#define GLFW_CONTEXT_REVISION 0x00022004 -#define GLFW_CONTEXT_ROBUSTNESS 0x00022005 -#define GLFW_OPENGL_FORWARD_COMPAT 0x00022006 -#define GLFW_OPENGL_DEBUG_CONTEXT 0x00022007 -#define GLFW_OPENGL_PROFILE 0x00022008 -#define GLFW_CONTEXT_RELEASE_BEHAVIOR 0x00022009 -#define GLFW_CONTEXT_NO_ERROR 0x0002200A -#define GLFW_CONTEXT_CREATION_API 0x0002200B - -#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_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 - -/*! @defgroup shapes Standard 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 - -#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 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 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 cursor - */ -typedef struct GLFWcursor GLFWcursor; - -/*! @brief The function signature for error callbacks. - * - * This is the function signature for error callback functions. - * - * @param[in] error An [error code](@ref errors). - * @param[in] description A UTF-8 encoded string describing the error. - * - * @sa @ref error_handling - * @sa glfwSetErrorCallback - * - * @since Added in version 3.0. - * - * @ingroup init - */ -typedef void (* GLFWerrorfun)(int,const char*); - -/*! @brief The function signature for window position callbacks. - * - * This is the function signature for window position callback functions. - * - * @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 client area of the window. - * @param[in] ypos The new y-coordinate, in screen coordinates, of the - * upper-left corner of the client area of the window. - * - * @sa @ref window_pos - * @sa glfwSetWindowPosCallback - * - * @since Added in version 3.0. - * - * @ingroup window - */ -typedef void (* GLFWwindowposfun)(GLFWwindow*,int,int); - -/*! @brief The function signature for window resize callbacks. - * - * This is the function signature for window size callback functions. - * - * @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 glfwSetWindowSizeCallback - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -typedef void (* GLFWwindowsizefun)(GLFWwindow*,int,int); - -/*! @brief The function signature for window close callbacks. - * - * This is the function signature for window close callback functions. - * - * @param[in] window The window that the user attempted to close. - * - * @sa @ref window_close - * @sa glfwSetWindowCloseCallback - * - * @since Added in version 2.5. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -typedef void (* GLFWwindowclosefun)(GLFWwindow*); - -/*! @brief The function signature for window content refresh callbacks. - * - * This is the function signature for window refresh callback functions. - * - * @param[in] window The window whose content needs to be refreshed. - * - * @sa @ref window_refresh - * @sa glfwSetWindowRefreshCallback - * - * @since Added in version 2.5. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -typedef void (* GLFWwindowrefreshfun)(GLFWwindow*); - -/*! @brief The function signature for window focus/defocus callbacks. - * - * This is the function signature for window focus callback functions. - * - * @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 glfwSetWindowFocusCallback - * - * @since Added in version 3.0. - * - * @ingroup window - */ -typedef void (* GLFWwindowfocusfun)(GLFWwindow*,int); - -/*! @brief The function signature for window iconify/restore callbacks. - * - * This is the function signature for window iconify/restore callback - * functions. - * - * @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 glfwSetWindowIconifyCallback - * - * @since Added in version 3.0. - * - * @ingroup window - */ -typedef void (* GLFWwindowiconifyfun)(GLFWwindow*,int); - -/*! @brief The function signature for framebuffer resize callbacks. - * - * This is the function signature for framebuffer resize callback - * functions. - * - * @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 glfwSetFramebufferSizeCallback - * - * @since Added in version 3.0. - * - * @ingroup window - */ -typedef void (* GLFWframebuffersizefun)(GLFWwindow*,int,int); - -/*! @brief The function signature for mouse button callbacks. - * - * This is the function signature for mouse button callback functions. - * - * @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`. - * @param[in] mods Bit field describing which [modifier keys](@ref mods) were - * held down. - * - * @sa @ref input_mouse_button - * @sa 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 signature for cursor position callbacks. - * - * This is the function signature for cursor position callback functions. - * - * @param[in] window The window that received the event. - * @param[in] xpos The new cursor x-coordinate, relative to the left edge of - * the client area. - * @param[in] ypos The new cursor y-coordinate, relative to the top edge of the - * client area. - * - * @sa @ref cursor_pos - * @sa glfwSetCursorPosCallback - * - * @since Added in version 3.0. Replaces `GLFWmouseposfun`. - * - * @ingroup input - */ -typedef void (* GLFWcursorposfun)(GLFWwindow*,double,double); - -/*! @brief The function signature for cursor enter/leave callbacks. - * - * This is the function signature for cursor enter/leave callback functions. - * - * @param[in] window The window that received the event. - * @param[in] entered `GLFW_TRUE` if the cursor entered the window's client - * area, or `GLFW_FALSE` if it left it. - * - * @sa @ref cursor_enter - * @sa glfwSetCursorEnterCallback - * - * @since Added in version 3.0. - * - * @ingroup input - */ -typedef void (* GLFWcursorenterfun)(GLFWwindow*,int); - -/*! @brief The function signature for scroll callbacks. - * - * This is the function signature for scroll callback functions. - * - * @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 glfwSetScrollCallback - * - * @since Added in version 3.0. Replaces `GLFWmousewheelfun`. - * - * @ingroup input - */ -typedef void (* GLFWscrollfun)(GLFWwindow*,double,double); - -/*! @brief The function signature for keyboard key callbacks. - * - * This is the function signature for keyboard key callback functions. - * - * @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`. - * @param[in] mods Bit field describing which [modifier keys](@ref mods) were - * held down. - * - * @sa @ref input_key - * @sa 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 signature for Unicode character callbacks. - * - * This is the function signature for Unicode character callback functions. - * - * @param[in] window The window that received the event. - * @param[in] codepoint The Unicode code point of the character. - * - * @sa @ref input_char - * @sa glfwSetCharCallback - * - * @since Added in version 2.4. - * @glfw3 Added window handle parameter. - * - * @ingroup input - */ -typedef void (* GLFWcharfun)(GLFWwindow*,unsigned int); - -/*! @brief The function signature for Unicode character with modifiers - * callbacks. - * - * This is the function signature for Unicode character with modifiers callback - * functions. It is called for each input character, regardless of what - * modifier keys are held down. - * - * @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 glfwSetCharModsCallback - * - * @since Added in version 3.1. - * - * @ingroup input - */ -typedef void (* GLFWcharmodsfun)(GLFWwindow*,unsigned int,int); - -/*! @brief The function signature for file drop callbacks. - * - * This is the function signature for file drop callbacks. - * - * @param[in] window The window that received the event. - * @param[in] count The number of dropped files. - * @param[in] paths The UTF-8 encoded file and/or directory path names. - * - * @sa @ref path_drop - * @sa glfwSetDropCallback - * - * @since Added in version 3.1. - * - * @ingroup input - */ -typedef void (* GLFWdropfun)(GLFWwindow*,int,const char**); - -/*! @brief The function signature for monitor configuration callbacks. - * - * This is the function signature for monitor configuration callback functions. - * - * @param[in] monitor The monitor that was connected or disconnected. - * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. - * - * @sa @ref monitor_event - * @sa glfwSetMonitorCallback - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -typedef void (* GLFWmonitorfun)(GLFWmonitor*,int); - -/*! @brief The function signature for joystick configuration callbacks. - * - * This is the function signature for joystick configuration callback - * functions. - * - * @param[in] joy The joystick that was connected or disconnected. - * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. - * - * @sa @ref joystick_event - * @sa 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 glfwGetVideoMode 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 glfwGetGammaRamp 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. - * - * @sa @ref cursor_custom - * @sa @ref window_icon - * - * @since Added in version 2.1. - * @glfw3 Removed format and bytes-per-pixel members. - */ -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; - - -/************************************************************************* - * 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 @osx 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 a - * [compile-time option](@ref compile_options_osx). - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref intro_init - * @sa 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 glfwInit - * - * @since Added in version 1.0. - * - * @ingroup init - */ -GLFWAPI void glfwTerminate(void); - -/*! @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 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 glfwGetVersion - * - * @since Added in version 3.0. - * - * @ingroup init - */ -GLFWAPI const char* glfwGetVersionString(void); - -/*! @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 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] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set. - * - * @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 - * - * @since Added in version 3.0. - * - * @ingroup init - */ -GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun cbfun); - -/*! @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 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 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 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 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 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] cbfun 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). - * - * @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 cbfun); - -/*! @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 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 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 a 256-element gamma ramp from the specified exponent - * and then calls @ref glfwSetGammaRamp with it. The value must be a finite - * number greater than zero. - * - * @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. - * - * @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. - * - * @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. - * - * @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 Gamma ramp sizes other than 256 are not supported by all platforms - * or graphics hardware. - * - * @remark @win32 The gamma ramp size must be 256. - * - * @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 glfwWindowHint - * - * @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 @ref - * glfwWindowHint or @ref glfwDefaultWindowHints, or until the library is - * terminated. - * - * 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. - * - * @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 glfwDefaultWindowHints - * - * @since Added in version 3.0. Replaces `glfwOpenWindowHint`. - * - * @ingroup window - */ -GLFWAPI void glfwWindowHint(int hint, int 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. If the window has an - * OpenGL or OpenGL ES context, it will be unaffected. - * - * 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 window_hints_wnd) 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_WINLOGO` 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 @osx 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 @osx The first time a window is created the menu bar is populated - * with common commands like Hide, Quit and About. The About entry opens - * a minimal about dialog with information from the application's bundle. The - * menu bar can be disabled with a - * [compile-time option](@ref compile_options_osx). - * - * @remark @osx On OS X 10.10 and later the window frame will not be rendered - * at full resolution on Retina displays unless 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 @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. - * - * @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 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 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 @osx 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 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 @osx 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. - * - * @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 client area of the specified window. - * - * This function retrieves the position, in screen coordinates, of the - * upper-left corner of the client 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 client area, or `NULL`. - * @param[out] ypos Where to store the y-coordinate of the upper-left corner of - * the client 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_pos - * @sa glfwSetWindowPos - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos); - -/*! @brief Sets the position of the client area of the specified window. - * - * This function sets the position, in screen coordinates, of the upper-left - * corner of the client 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 client area. - * @param[in] ypos The y-coordinate of the upper-left corner of the client area. - * - * @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_pos - * @sa 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 client area of the specified window. - * - * This function retrieves the size, in screen coordinates, of the client 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 - * client area, or `NULL`. - * @param[out] height Where to store the height, in screen coordinates, of the - * client 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 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 client 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 client - * area, or `GLFW_DONT_CARE`. - * @param[in] minheight The minimum height, in screen coordinates, of the - * client area, or `GLFW_DONT_CARE`. - * @param[in] maxwidth The maximum width, in screen coordinates, of the client - * area, or `GLFW_DONT_CARE`. - * @param[in] maxheight The maximum height, in screen coordinates, of the - * client 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. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_sizelimits - * @sa 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 client 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. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_sizelimits - * @sa glfwSetWindowSizeLimits - * - * @since Added in version 3.2. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowAspectRatio(GLFWwindow* window, int numer, int denom); - -/*! @brief Sets the size of the client area of the specified window. - * - * This function sets the size, in screen coordinates, of the client 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 - * client area. - * @param[in] height The desired height, in screen coordinates, of the window - * client area. - * - * @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 glfwGetWindowSize - * @sa 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 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 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. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_iconify - * @sa glfwRestoreWindow - * @sa 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 glfwIconifyWindow - * @sa 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 glfwIconifyWindow - * @sa 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. - * - * @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 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 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 window_hints_wnd) 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. - * - * @param[in] window The window to give input focus. - * - * @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_focus - * - * @since Added in version 3.2. - * - * @ingroup window - */ -GLFWAPI void glfwFocusWindow(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 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 client 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 - * client area. - * @param[in] ypos The desired y-coordinate of the upper-left corner of the - * client area. - * @param[in] width The desired with, in screen coordinates, of the client area - * or video mode. - * @param[in] height The desired height, in screen coordinates, of the client - * 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. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_monitor - * @sa @ref window_full_screen - * @sa glfwGetWindowMonitor - * @sa 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 - * - * @since Added in version 3.0. Replaces `glfwGetWindowParam` and - * `glfwGetGLVersion`. - * - * @ingroup window - */ -GLFWAPI int glfwGetWindowAttrib(GLFWwindow* window, int attrib); - -/*! @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 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 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 screen - * position of the upper-left corner of the client area of the window. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun 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). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @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 cbfun); - -/*! @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 client area of the window. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun 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). - * - * @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 cbfun); - -/*! @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] cbfun 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). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @remark @osx 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 cbfun); - -/*! @brief Sets the refresh callback for the specified window. - * - * This function sets the refresh callback of the specified window, which is - * called when the client 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 or Aqua, 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] cbfun 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). - * - * @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 cbfun); - -/*! @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] cbfun 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). - * - * @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 cbfun); - -/*! @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] cbfun 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). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @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 cbfun); - -/*! @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] cbfun 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). - * - * @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 cbfun); - -/*! @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. - * - * On some platforms, certain events are sent directly to the application - * without going through the event queue, causing callbacks to be called - * outside of a call to one of the event processing functions. - * - * 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 glfwWaitEvents - * @sa 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. - * - * On some platforms, certain callbacks may be called outside of a call to one - * of the event processing functions. - * - * If no windows exist, this function returns immediately. For synchronization - * of threads in applications that do not create windows, use your threading - * library of choice. - * - * 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 glfwPollEvents - * @sa 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. - * - * On some platforms, certain callbacks may be called outside of a call to one - * of the event processing functions. - * - * If no windows exist, this function returns immediately. For synchronization - * of threads in applications that do not create windows, use your threading - * library of choice. - * - * Event processing is not required for joystick input to work. - * - * @param[in] timeout The maximum amount of time, in seconds, to wait. - * - * @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 glfwPollEvents - * @sa 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. - * - * If no windows exist, this function returns immediately. For synchronization - * of threads in applications that do not create windows, use your threading - * library of choice. - * - * @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 glfwWaitEvents - * @sa 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 `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or - * `GLFW_STICKY_MOUSE_BUTTONS`. - * - * @param[in] window The window to query. - * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or - * `GLFW_STICKY_MOUSE_BUTTONS`. - * - * @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 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 `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or - * `GLFW_STICKY_MOUSE_BUTTONS`. - * - * 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 client - * 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. - * - * @param[in] window The window whose input mode to set. - * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or - * `GLFW_STICKY_MOUSE_BUTTONS`. - * @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 glfwGetInputMode - * - * @since Added in version 3.0. Replaces `glfwEnable` and `glfwDisable`. - * - * @ingroup input - */ -GLFWAPI void glfwSetInputMode(GLFWwindow* window, int mode, int value); - -/*! @brief Returns the localized name of the specified printable key. - * - * This function returns the localized name of the specified printable key. - * This is intended for displaying key bindings to the user. - * - * If the key is `GLFW_KEY_UNKNOWN`, the scancode is used instead, otherwise - * the scancode is ignored. If a non-printable key or (if the key is - * `GLFW_KEY_UNKNOWN`) a scancode that maps to a non-printable key is - * specified, this function returns `NULL`. - * - * This behavior allows you to pass in the arguments passed to 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` - * - * @param[in] key The key to query, or `GLFW_KEY_UNKNOWN`. - * @param[in] scancode The scancode of the key to query. - * @return The localized name of the key, or `NULL`. - * - * @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 - * glfwGetKeyName, or 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 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 `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 `GLFW_STICKY_MOUSE_BUTTONS` input mode is enabled, this function - * `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 client area of - * the window. - * - * This function returns the position of the cursor, in screen coordinates, - * relative to the upper-left corner of the client 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 client area, or `NULL`. - * @param[out] ypos Where to store the cursor y-coordinate, relative to the to - * top edge of the client 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 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 client area of the - * window. - * - * This function sets the position, in screen coordinates, of the cursor - * relative to the upper-left corner of the client 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 - * client area. - * @param[in] ypos The desired y-coordinate, relative to the top edge of the - * client area. - * - * @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 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. 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. - * - * @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 glfwDestroyCursor - * @sa 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. - * - * @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 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. - * - * @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 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 - * client 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] cbfun 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). - * - * @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 cbfun); - -/*! @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 OS X or Alt key - * on Windows. There is a - * [character with modifiers callback](@ref glfwSetCharModsCallback) that - * receives these events. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun 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). - * - * @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 cbfun); - -/*! @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] cbfun 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. - * - * @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 cbfun); - -/*! @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] cbfun 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). - * - * @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 cbfun); - -/*! @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 - * client area of the window. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun 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). - * - * @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 cbfun); - -/*! @brief Sets the cursor enter/exit callback. - * - * This function sets the cursor boundary crossing callback of the specified - * window, which is called when the cursor enters or leaves the client area of - * the window. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun 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). - * - * @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 cbfun); - -/*! @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] cbfun 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). - * - * @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 cbfun); - -/*! @brief Sets the file drop callback. - * - * This function sets the file drop callback of the specified window, which is - * called when one or more dragged files 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] cbfun 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). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @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 cbfun); - -/*! @brief Returns whether the specified joystick is present. - * - * This function returns whether the specified joystick is present. - * - * @param[in] joy 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 joy); - -/*! @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. - * - * Querying a joystick slot with no device present is not an error, but will - * cause this function to return `NULL`. Call @ref glfwJoystickPresent to - * check device presence. - * - * @param[in] joy 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, 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_axis - * - * @since Added in version 3.0. Replaces `glfwGetJoystickPos`. - * - * @ingroup input - */ -GLFWAPI const float* glfwGetJoystickAxes(int joy, 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`. - * - * Querying a joystick slot with no device present is not an error, but will - * cause this function to return `NULL`. Call @ref glfwJoystickPresent to - * check device presence. - * - * @param[in] joy 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, 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_button - * - * @since Added in version 2.2. - * @glfw3 Changed to return a dynamic array. - * - * @ingroup input - */ -GLFWAPI const unsigned char* glfwGetJoystickButtons(int joy, 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. - * - * Querying a joystick slot with no device present is not an error, but will - * cause this function to return `NULL`. Call @ref glfwJoystickPresent to - * check device presence. - * - * @param[in] joy 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, 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_name - * - * @since Added in version 3.0. - * - * @ingroup input - */ -GLFWAPI const char* glfwGetJoystickName(int joy); - -/*! @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. - * - * @param[in] cbfun 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). - * - * @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 cbfun); - -/*! @brief Sets the clipboard to the specified string. - * - * This function sets the system clipboard to the specified, UTF-8 encoded - * string. - * - * @param[in] window The window that will own the clipboard contents. - * @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 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 The window that will request the clipboard contents. - * @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 glfwSetClipboardString - * - * @since Added in version 3.0. - * - * @ingroup input - */ -GLFWAPI const char* glfwGetClipboardString(GLFWwindow* window); - -/*! @brief Returns the value of the GLFW timer. - * - * This function returns the value of the GLFW timer. Unless the timer has - * been set using @ref glfwSetTime, the timer measures time elapsed since GLFW - * was initialized. - * - * 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 value, 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 timer offset 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 timer. - * - * This function sets the value of the GLFW timer. It then continues to count - * up from that value. The value must be a positive finite number less than - * or equal to 18446744073.0, which is approximately 584.5 years. - * - * @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 the timer 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 timer offset 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 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 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 can only be made current on - * a single thread at a time and each thread can have only a single current - * context at a time. - * - * 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 window_hints_ctx) window 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 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 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 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_. - * - * Contexts that support either of the `WGL_EXT_swap_control_tear` and - * `GLX_EXT_swap_control_tear` extensions also accept negative swap intervals, - * which allow the driver to swap even if a frame arrives a little bit late. - * You can check for the presence of these extensions using @ref - * glfwExtensionSupported. For more information about swap tearing, see the - * extension specifications. - * - * 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 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 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 glfwExtensionSupported - * - * @since Added in version 1.0. - * - * @ingroup context - */ -GLFWAPI GLFWglproc glfwGetProcAddress(const char* procname); - -/*! @brief Returns whether the Vulkan loader has been found. - * - * This function returns whether the Vulkan loader has been found. This check - * is performed by @ref glfwInit. - * - * The availability of a Vulkan loader does not by itself guarantee that window - * surface creation or even device creation is possible. Call @ref - * glfwGetRequiredInstanceExtensions to check whether the extensions necessary - * for Vulkan surface creation are available and @ref - * glfwGetPhysicalDevicePresentationSupport to check whether a queue family of - * a physical device supports image presentation. - * - * @return `GLFW_TRUE` if Vulkan is 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 contains `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 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. - * - * @remarks Additional extensions may be required by future versions of GLFW. - * You should check if any extensions you wish to enable are already in the - * returned array, as it is an error to specify an extension more than once in - * the `VkInstanceCreateInfo` struct. - * - * @pointer_lifetime The returned array is allocated and freed by GLFW. You - * should not free it yourself. It is guaranteed to be valid only until the - * library is terminated. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref vulkan_ext - * @sa 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 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 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. - * - * @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 was not found at initialization, this function returns - * `VK_ERROR_INITIALIZATION_FAILED` and generates a @ref GLFW_API_UNAVAILABLE - * error. Call @ref glfwVulkanSupported to check whether the Vulkan loader was - * found. - * - * 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 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 and @ref GLFW_PLATFORM_ERROR. - * - * @remarks 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. - * - * @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 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 - -/* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */ - - -#ifdef __cplusplus -} -#endif - -#endif /* _glfw3_h_ */ - diff --git a/profiler/libs/glfw/include/GLFW/glfw3native.h b/profiler/libs/glfw/include/GLFW/glfw3native.h deleted file mode 100644 index 30e1a570..00000000 --- a/profiler/libs/glfw/include/GLFW/glfw3native.h +++ /dev/null @@ -1,456 +0,0 @@ -/************************************************************************* - * GLFW 3.2 - www.glfw.org - * A library for OpenGL, window and input - *------------------------------------------------------------------------ - * Copyright (c) 2002-2006 Marcus Geelnard - * Copyright (c) 2006-2016 Camilla Berglund - * - * 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 - * - * **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 exactly one - * 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` - * * `GLFW_EXPOSE_NATIVE_MIR` - * - * The available context API macros are: - * * `GLFW_EXPOSE_NATIVE_WGL` - * * `GLFW_EXPOSE_NATIVE_NSGL` - * * `GLFW_EXPOSE_NATIVE_GLX` - * * `GLFW_EXPOSE_NATIVE_EGL` - * - * 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) - // 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 - #undef APIENTRY - #include -#elif defined(GLFW_EXPOSE_NATIVE_COCOA) - #include - #if defined(__OBJC__) - #import - #else - typedef void* id; - #endif -#elif defined(GLFW_EXPOSE_NATIVE_X11) - #include - #include -#elif defined(GLFW_EXPOSE_NATIVE_WAYLAND) - #include -#elif defined(GLFW_EXPOSE_NATIVE_MIR) - #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 - - -/************************************************************************* - * 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); -#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_MIR) -/*! @brief Returns the `MirConnection*` used by GLFW. - * - * @return The `MirConnection*` 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 MirConnection* glfwGetMirDisplay(void); - -/*! @brief Returns the Mir output ID of the specified monitor. - * - * @return The Mir output ID of the specified monitor, or zero 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 int glfwGetMirMonitor(GLFWmonitor* monitor); - -/*! @brief Returns the `MirSurface*` of the specified window. - * - * @return The `MirSurface*` 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 MirSurface* glfwGetMirWindow(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 - -#ifdef __cplusplus -} -#endif - -#endif /* _glfw3_native_h_ */ - diff --git a/profiler/libs/glfw/lib-vc2015/glfw3.lib b/profiler/libs/glfw/lib-vc2015/glfw3.lib deleted file mode 100644 index a00c640a958d847d93b3079a52dafbe56844c314..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 323518 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�>lnWR=ZJ#r1|f6Y)9}A94hD!_o7J!+@FC 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 Ss-v#9E-~(xpv%T+L;oM%%Mj`S diff --git a/update/build/win32/update.vcxproj b/update/build/win32/update.vcxproj index 9818e440..da7abe49 100644 --- a/update/build/win32/update.vcxproj +++ b/update/build/win32/update.vcxproj @@ -22,32 +22,32 @@ 15.0 {447D58BF-94CD-4469-BB90-549C05D03E00} update - 10.0.16299.0 + 10.0 Application true - v141 + v142 MultiByte Application false - v141 + v142 true MultiByte Application true - v141 + v142 MultiByte Application false - v141 + v142 true MultiByte