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

WcL{1T9b!PrTTJ6a~l9U4R&GZ&J$>VjN-^c-x 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 literal 0 HcmV?d00001 diff --git a/glfw/lib-mingw-w64/libglfw3.a b/glfw/lib-mingw-w64/libglfw3.a new file mode 100644 index 0000000000000000000000000000000000000000..b477ac1c56699a77cb5e7b0bcea3575611cb6d37 GIT binary patch literal 289408 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

{W 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 literal 0 HcmV?d00001