From 36183660e6048f0b4791b7dd087401e6a8ea65de Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Sun, 5 Jul 2020 16:44:23 +0200 Subject: [PATCH] remove oldgg, gl, glfw, freetype from vlib now that we have the new sokol based `gg` --- examples/hot_reload/graph.v | 2 - thirdparty/glfw/GLFW/glfw3.h | 5637 ---------------------------- thirdparty/glfw/GLFW/glfw3native.h | 525 --- thirdparty/glfw/glfw3.dll | Bin 249856 -> 0 bytes thirdparty/glfw/msvc/glfw3.lib | Bin 646460 -> 0 bytes vlib/freetype/freetype.v | 454 --- vlib/gl/1shader.v | 203 - vlib/gl/gl.v | 398 -- vlib/glfw/glfw.v | 373 -- vlib/oldgg/README.md | 3 - vlib/oldgg/gg.v | 553 --- vlib/oldgg/utils.v | 37 - vlib/v/gen/comptime.v | 14 +- vlib/vweb/vweb.v | 97 +- 14 files changed, 84 insertions(+), 8212 deletions(-) delete mode 100644 thirdparty/glfw/GLFW/glfw3.h delete mode 100644 thirdparty/glfw/GLFW/glfw3native.h delete mode 100644 thirdparty/glfw/glfw3.dll delete mode 100644 thirdparty/glfw/msvc/glfw3.lib delete mode 100644 vlib/freetype/freetype.v delete mode 100644 vlib/gl/1shader.v delete mode 100644 vlib/gl/gl.v delete mode 100644 vlib/glfw/glfw.v delete mode 100644 vlib/oldgg/README.md delete mode 100644 vlib/oldgg/gg.v delete mode 100644 vlib/oldgg/utils.v diff --git a/examples/hot_reload/graph.v b/examples/hot_reload/graph.v index 74c984cb17..aa80ea0e85 100644 --- a/examples/hot_reload/graph.v +++ b/examples/hot_reload/graph.v @@ -3,7 +3,6 @@ module main import gx import gg import time -import glfw import math const ( @@ -17,7 +16,6 @@ struct Context { } fn main() { - glfw.init_glfw() gconfig := gg.Cfg { width: size height: size diff --git a/thirdparty/glfw/GLFW/glfw3.h b/thirdparty/glfw/GLFW/glfw3.h deleted file mode 100644 index 0521d19801..0000000000 --- a/thirdparty/glfw/GLFW/glfw3.h +++ /dev/null @@ -1,5637 +0,0 @@ -/************************************************************************* - * GLFW 3.3 - www.glfw.org - * A library for OpenGL, window and input - *------------------------------------------------------------------------ - * Copyright (c) 2002-2006 Marcus Geelnard - * Copyright (c) 2006-2019 Camilla Löwy - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would - * be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and must not - * be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - * - *************************************************************************/ - -#ifndef _glfw3_h_ -#define _glfw3_h_ - -#ifdef __cplusplus -extern "C" { -#endif - - -/************************************************************************* - * Doxygen documentation - *************************************************************************/ - -/*! @file glfw3.h - * @brief The header of the GLFW 3 API. - * - * This is the header file of the GLFW 3 API. It defines all its types and - * declares all its functions. - * - * For more information about how to use this file, see @ref build_include. - */ -/*! @defgroup context Context reference - * @brief Functions and types related to OpenGL and OpenGL ES contexts. - * - * This is the reference documentation for OpenGL and OpenGL ES context related - * functions. For more task-oriented information, see the @ref context_guide. - */ -/*! @defgroup vulkan Vulkan 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 */ - -/* It is customary to use APIENTRY for OpenGL function pointer declarations on - * all platforms. Additionally, the Windows OpenGL header needs APIENTRY. - */ -#ifndef APIENTRY - #ifdef _WIN32 - #define APIENTRY __stdcall - #else - #define APIENTRY - #endif - #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 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 - -/* Include the chosen OpenGL or OpenGL ES headers. - */ -#if defined(GLFW_INCLUDE_ES1) - - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - -#elif defined(GLFW_INCLUDE_ES2) - - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - -#elif defined(GLFW_INCLUDE_ES3) - - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - -#elif defined(GLFW_INCLUDE_ES31) - - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - -#elif defined(GLFW_INCLUDE_ES32) - - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - -#elif defined(GLFW_INCLUDE_GLCOREARB) - - #if defined(__APPLE__) - - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif /*GLFW_INCLUDE_GLEXT*/ - - #else /*__APPLE__*/ - - #include - - #endif /*__APPLE__*/ - -#elif !defined(GLFW_INCLUDE_NONE) - - #if defined(__APPLE__) - - #if !defined(GLFW_INCLUDE_GLEXT) - #define GL_GLEXT_LEGACY - #endif - #include - #if defined(GLFW_INCLUDE_GLU) - #include - #endif - - #else /*__APPLE__*/ - - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - #if defined(GLFW_INCLUDE_GLU) - #include - #endif - - #endif /*__APPLE__*/ - -#endif /* OpenGL and OpenGL ES headers */ - -#if defined(GLFW_INCLUDE_VULKAN) - #include -#endif /* Vulkan header */ - -#if defined(GLFW_DLL) && defined(_GLFW_BUILD_DLL) - /* GLFW_DLL must be defined by applications that are linking against the DLL - * version of the GLFW library. _GLFW_BUILD_DLL is defined by the GLFW - * configuration header when compiling the DLL version of the library. - */ - #error "You must not have both GLFW_DLL and _GLFW_BUILD_DLL defined" -#endif - -/* GLFWAPI is used to declare public API functions for export - * from the DLL / shared library / dynamic library. - */ -#if defined(_WIN32) && defined(_GLFW_BUILD_DLL) - /* We are building GLFW as a Win32 DLL */ - #define GLFWAPI __declspec(dllexport) -#elif defined(_WIN32) && defined(GLFW_DLL) - /* We are calling GLFW as a Win32 DLL */ - #define GLFWAPI __declspec(dllimport) -#elif defined(__GNUC__) && defined(_GLFW_BUILD_DLL) - /* We are building GLFW as a shared / dynamic library */ - #define GLFWAPI __attribute__((visibility("default"))) -#else - /* We are building or calling GLFW as a static library */ - #define GLFWAPI -#endif - - -/************************************************************************* - * GLFW API tokens - *************************************************************************/ - -/*! @name GLFW version macros - * @{ */ -/*! @brief The major version number of the GLFW library. - * - * This is incremented when the API is changed in non-compatible ways. - * @ingroup init - */ -#define GLFW_VERSION_MAJOR 3 -/*! @brief The minor version number of the GLFW library. - * - * This is incremented when features are added to the API but it remains - * backward-compatible. - * @ingroup init - */ -#define GLFW_VERSION_MINOR 3 -/*! @brief The revision number of the GLFW library. - * - * This is incremented when a bug fix release is made that does not contain any - * API changes. - * @ingroup init - */ -#define GLFW_VERSION_REVISION 0 -/*! @} */ - -/*! @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_CLIENT_API_hint) and - * [attribute](@ref GLFW_CLIENT_API_attrib). - */ -#define GLFW_CONTEXT_VERSION_MAJOR 0x00022002 -/*! @brief Context client API minor version hint and attribute. - * - * Context client API minor version [hint](@ref GLFW_CLIENT_API_hint) and - * [attribute](@ref GLFW_CLIENT_API_attrib). - */ -#define GLFW_CONTEXT_VERSION_MINOR 0x00022003 -/*! @brief Context client API revision number hint and attribute. - * - * Context client API revision number [hint](@ref GLFW_CLIENT_API_hint) and - * [attribute](@ref GLFW_CLIENT_API_attrib). - */ -#define GLFW_CONTEXT_REVISION 0x00022004 -/*! @brief Context robustness hint and attribute. - * - * Context client API revision number [hint](@ref GLFW_CLIENT_API_hint) and - * [attribute](@ref GLFW_CLIENT_API_attrib). - */ -#define GLFW_CONTEXT_ROBUSTNESS 0x00022005 -/*! @brief OpenGL forward-compatibility hint and attribute. - * - * OpenGL forward-compatibility [hint](@ref GLFW_CLIENT_API_hint) and - * [attribute](@ref GLFW_CLIENT_API_attrib). - */ -#define GLFW_OPENGL_FORWARD_COMPAT 0x00022006 -/*! @brief OpenGL debug context hint and attribute. - * - * OpenGL debug context [hint](@ref GLFW_CLIENT_API_hint) and - * [attribute](@ref GLFW_CLIENT_API_attrib). - */ -#define GLFW_OPENGL_DEBUG_CONTEXT 0x00022007 -/*! @brief OpenGL profile hint and attribute. - * - * OpenGL profile [hint](@ref GLFW_CLIENT_API_hint) and - * [attribute](@ref GLFW_CLIENT_API_attrib). - */ -#define GLFW_OPENGL_PROFILE 0x00022008 -/*! @brief Context flush-on-release hint and attribute. - * - * Context flush-on-release [hint](@ref GLFW_CLIENT_API_hint) and - * [attribute](@ref GLFW_CLIENT_API_attrib). - */ -#define GLFW_CONTEXT_RELEASE_BEHAVIOR 0x00022009 -/*! @brief Context error suppression hint and attribute. - * - * Context error suppression [hint](@ref GLFW_CLIENT_API_hint) and - * [attribute](@ref GLFW_CLIENT_API_attrib). - */ -#define GLFW_CONTEXT_NO_ERROR 0x0002200A -/*! @brief Context creation API hint and attribute. - * - * Context creation API [hint](@ref GLFW_CLIENT_API_hint) and - * [attribute](@ref GLFW_CLIENT_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 signature for error callbacks. - * - * This is the function signature for error callback functions. - * - * @param[in] error An [error code](@ref errors). - * @param[in] description A UTF-8 encoded string describing the error. - * - * @sa @ref error_handling - * @sa @ref glfwSetErrorCallback - * - * @since Added in version 3.0. - * - * @ingroup init - */ -typedef void (* GLFWerrorfun)(int,const char*); - -/*! @brief The function signature for window position callbacks. - * - * This is the function signature for window position callback functions. - * - * @param[in] window The window that was moved. - * @param[in] xpos The new x-coordinate, in screen coordinates, of the - * upper-left corner of the content area of the window. - * @param[in] ypos The new y-coordinate, in screen coordinates, of the - * upper-left corner of the content area of the window. - * - * @sa @ref window_pos - * @sa @ref glfwSetWindowPosCallback - * - * @since Added in version 3.0. - * - * @ingroup window - */ -typedef void (* GLFWwindowposfun)(GLFWwindow*,int,int); - -/*! @brief The function signature for window resize callbacks. - * - * This is the function signature for window size callback functions. - * - * @param[in] window The window that was resized. - * @param[in] width The new width, in screen coordinates, of the window. - * @param[in] height The new height, in screen coordinates, of the window. - * - * @sa @ref window_size - * @sa @ref glfwSetWindowSizeCallback - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -typedef void (* GLFWwindowsizefun)(GLFWwindow*,int,int); - -/*! @brief The function signature for window close callbacks. - * - * This is the function signature for window close callback functions. - * - * @param[in] window The window that the user attempted to close. - * - * @sa @ref window_close - * @sa @ref glfwSetWindowCloseCallback - * - * @since Added in version 2.5. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -typedef void (* GLFWwindowclosefun)(GLFWwindow*); - -/*! @brief The function signature for window content refresh callbacks. - * - * This is the function signature for window refresh callback functions. - * - * @param[in] window The window whose content needs to be refreshed. - * - * @sa @ref window_refresh - * @sa @ref glfwSetWindowRefreshCallback - * - * @since Added in version 2.5. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -typedef void (* GLFWwindowrefreshfun)(GLFWwindow*); - -/*! @brief The function signature for window focus/defocus callbacks. - * - * This is the function signature for window focus callback functions. - * - * @param[in] window The window that gained or lost input focus. - * @param[in] focused `GLFW_TRUE` if the window was given input focus, or - * `GLFW_FALSE` if it lost it. - * - * @sa @ref window_focus - * @sa @ref glfwSetWindowFocusCallback - * - * @since Added in version 3.0. - * - * @ingroup window - */ -typedef void (* GLFWwindowfocusfun)(GLFWwindow*,int); - -/*! @brief The function signature for window iconify/restore callbacks. - * - * This is the function signature for window iconify/restore callback - * functions. - * - * @param[in] window The window that was iconified or restored. - * @param[in] iconified `GLFW_TRUE` if the window was iconified, or - * `GLFW_FALSE` if it was restored. - * - * @sa @ref window_iconify - * @sa @ref glfwSetWindowIconifyCallback - * - * @since Added in version 3.0. - * - * @ingroup window - */ -typedef void (* GLFWwindowiconifyfun)(GLFWwindow*,int); - -/*! @brief The function signature for window maximize/restore callbacks. - * - * This is the function signature for window maximize/restore callback - * functions. - * - * @param[in] window The window that was maximized or restored. - * @param[in] iconified `GLFW_TRUE` if the window was maximized, or - * `GLFW_FALSE` if it was restored. - * - * @sa @ref window_maximize - * @sa glfwSetWindowMaximizeCallback - * - * @since Added in version 3.3. - * - * @ingroup window - */ -typedef void (* GLFWwindowmaximizefun)(GLFWwindow*,int); - -/*! @brief The function signature for framebuffer resize callbacks. - * - * This is the function signature for framebuffer resize callback - * functions. - * - * @param[in] window The window whose framebuffer was resized. - * @param[in] width The new width, in pixels, of the framebuffer. - * @param[in] height The new height, in pixels, of the framebuffer. - * - * @sa @ref window_fbsize - * @sa @ref glfwSetFramebufferSizeCallback - * - * @since Added in version 3.0. - * - * @ingroup window - */ -typedef void (* GLFWframebuffersizefun)(GLFWwindow*,int,int); - -/*! @brief The function signature for window content scale callbacks. - * - * This is the function signature for window content scale callback - * functions. - * - * @param[in] window The window whose content scale changed. - * @param[in] xscale The new x-axis content scale of the window. - * @param[in] yscale The new y-axis content scale of the window. - * - * @sa @ref window_scale - * @sa @ref glfwSetWindowContentScaleCallback - * - * @since Added in version 3.3. - * - * @ingroup window - */ -typedef void (* GLFWwindowcontentscalefun)(GLFWwindow*,float,float); - -/*! @brief The function signature for mouse button callbacks. - * - * This is the function signature for mouse button callback functions. - * - * @param[in] window The window that received the event. - * @param[in] button The [mouse button](@ref buttons) that was pressed or - * released. - * @param[in] action One of `GLFW_PRESS` or `GLFW_RELEASE`. - * @param[in] mods Bit field describing which [modifier keys](@ref mods) were - * held down. - * - * @sa @ref input_mouse_button - * @sa @ref glfwSetMouseButtonCallback - * - * @since Added in version 1.0. - * @glfw3 Added window handle and modifier mask parameters. - * - * @ingroup input - */ -typedef void (* GLFWmousebuttonfun)(GLFWwindow*,int,int,int); - -/*! @brief The function signature for cursor position callbacks. - * - * This is the function signature for cursor position callback functions. - * - * @param[in] window The window that received the event. - * @param[in] xpos The new cursor x-coordinate, relative to the left edge of - * the content area. - * @param[in] ypos The new cursor y-coordinate, relative to the top edge of the - * content area. - * - * @sa @ref cursor_pos - * @sa @ref glfwSetCursorPosCallback - * - * @since Added in version 3.0. Replaces `GLFWmouseposfun`. - * - * @ingroup input - */ -typedef void (* GLFWcursorposfun)(GLFWwindow*,double,double); - -/*! @brief The function signature for cursor enter/leave callbacks. - * - * This is the function signature for cursor enter/leave callback functions. - * - * @param[in] window The window that received the event. - * @param[in] entered `GLFW_TRUE` if the cursor entered the window's content - * area, or `GLFW_FALSE` if it left it. - * - * @sa @ref cursor_enter - * @sa @ref glfwSetCursorEnterCallback - * - * @since Added in version 3.0. - * - * @ingroup input - */ -typedef void (* GLFWcursorenterfun)(GLFWwindow*,int); - -/*! @brief The function signature for scroll callbacks. - * - * This is the function signature for scroll callback functions. - * - * @param[in] window The window that received the event. - * @param[in] xoffset The scroll offset along the x-axis. - * @param[in] yoffset The scroll offset along the y-axis. - * - * @sa @ref scrolling - * @sa @ref glfwSetScrollCallback - * - * @since Added in version 3.0. Replaces `GLFWmousewheelfun`. - * - * @ingroup input - */ -typedef void (* GLFWscrollfun)(GLFWwindow*,double,double); - -/*! @brief The function signature for keyboard key callbacks. - * - * This is the function signature for keyboard key callback functions. - * - * @param[in] window The window that received the event. - * @param[in] key The [keyboard key](@ref keys) that was pressed or released. - * @param[in] scancode The system-specific scancode of the key. - * @param[in] action `GLFW_PRESS`, `GLFW_RELEASE` or `GLFW_REPEAT`. - * @param[in] mods Bit field describing which [modifier keys](@ref mods) were - * held down. - * - * @sa @ref input_key - * @sa @ref glfwSetKeyCallback - * - * @since Added in version 1.0. - * @glfw3 Added window handle, scancode and modifier mask parameters. - * - * @ingroup input - */ -typedef void (* GLFWkeyfun)(GLFWwindow*,int,int,int,int); - -/*! @brief The function signature for Unicode character callbacks. - * - * This is the function signature for Unicode character callback functions. - * - * @param[in] window The window that received the event. - * @param[in] codepoint The Unicode code point of the character. - * - * @sa @ref input_char - * @sa @ref glfwSetCharCallback - * - * @since Added in version 2.4. - * @glfw3 Added window handle parameter. - * - * @ingroup input - */ -typedef void (* GLFWcharfun)(GLFWwindow*,unsigned int); - -/*! @brief The function signature for Unicode character with modifiers - * callbacks. - * - * This is the function signature for Unicode character with modifiers callback - * functions. It is called for each input character, regardless of what - * modifier keys are held down. - * - * @param[in] window The window that received the event. - * @param[in] codepoint The Unicode code point of the character. - * @param[in] mods Bit field describing which [modifier keys](@ref mods) were - * held down. - * - * @sa @ref input_char - * @sa @ref glfwSetCharModsCallback - * - * @deprecated Scheduled for removal in version 4.0. - * - * @since Added in version 3.1. - * - * @ingroup input - */ -typedef void (* GLFWcharmodsfun)(GLFWwindow*,unsigned int,int); - -/*! @brief The function signature for file drop callbacks. - * - * This is the function signature for file drop callbacks. - * - * @param[in] window The window that received the event. - * @param[in] count The number of dropped files. - * @param[in] paths The UTF-8 encoded file and/or directory path names. - * - * @sa @ref path_drop - * @sa @ref glfwSetDropCallback - * - * @since Added in version 3.1. - * - * @ingroup input - */ -typedef void (* GLFWdropfun)(GLFWwindow*,int,const char**); - -/*! @brief The function signature for monitor configuration callbacks. - * - * This is the function signature for monitor configuration callback functions. - * - * @param[in] monitor The monitor that was connected or disconnected. - * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. Remaining - * values reserved for future use. - * - * @sa @ref monitor_event - * @sa @ref glfwSetMonitorCallback - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -typedef void (* GLFWmonitorfun)(GLFWmonitor*,int); - -/*! @brief The function signature for joystick configuration callbacks. - * - * This is the function signature for joystick configuration callback - * functions. - * - * @param[in] jid The joystick that was connected or disconnected. - * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. Remaining - * values reserved for future use. - * - * @sa @ref joystick_event - * @sa @ref glfwSetJoystickCallback - * - * @since Added in version 3.2. - * - * @ingroup input - */ -typedef void (* GLFWjoystickfun)(int,int); - -/*! @brief Video mode type. - * - * This describes a single video mode. - * - * @sa @ref monitor_modes - * @sa @ref glfwGetVideoMode - * @sa @ref glfwGetVideoModes - * - * @since Added in version 1.0. - * @glfw3 Added refresh rate member. - * - * @ingroup monitor - */ -typedef struct GLFWvidmode -{ - /*! The width, in screen coordinates, of the video mode. - */ - int width; - /*! The height, in screen coordinates, of the video mode. - */ - int height; - /*! The bit depth of the red channel of the video mode. - */ - int redBits; - /*! The bit depth of the green channel of the video mode. - */ - int greenBits; - /*! The bit depth of the blue channel of the video mode. - */ - int blueBits; - /*! The refresh rate, in Hz, of the video mode. - */ - int refreshRate; -} GLFWvidmode; - -/*! @brief Gamma ramp. - * - * This describes the gamma ramp for a monitor. - * - * @sa @ref monitor_gamma - * @sa @ref glfwGetGammaRamp - * @sa @ref glfwSetGammaRamp - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -typedef struct GLFWgammaramp -{ - /*! An array of value describing the response of the red channel. - */ - unsigned short* red; - /*! An array of value describing the response of the green channel. - */ - unsigned short* green; - /*! An array of value describing the response of the blue channel. - */ - unsigned short* blue; - /*! The number of elements in each array. - */ - unsigned int size; -} GLFWgammaramp; - -/*! @brief Image data. - * - * This describes a single 2D image. See the documentation for each related - * function what the expected pixel format is. - * - * @sa @ref cursor_custom - * @sa @ref window_icon - * - * @since Added in version 2.1. - * @glfw3 Removed format and bytes-per-pixel members. - * - * @ingroup window - */ -typedef struct GLFWimage -{ - /*! The width, in pixels, of this image. - */ - int width; - /*! The height, in pixels, of this image. - */ - int height; - /*! The pixel data of this image, arranged left-to-right, top-to-bottom. - */ - unsigned char* pixels; -} GLFWimage; - -/*! @brief Gamepad input state - * - * This describes the input state of a gamepad. - * - * @sa @ref gamepad - * @sa @ref glfwGetGamepadState - * - * @since Added in version 3.3. - * - * @ingroup input - */ -typedef struct GLFWgamepadstate -{ - /*! The states of each [gamepad button](@ref gamepad_buttons), `GLFW_PRESS` - * or `GLFW_RELEASE`. - */ - unsigned char buttons[15]; - /*! The states of each [gamepad axis](@ref gamepad_axes), in the range -1.0 - * to 1.0 inclusive. - */ - float axes[6]; -} GLFWgamepadstate; - - -/************************************************************************* - * GLFW API functions - *************************************************************************/ - -/*! @brief Initializes the GLFW library. - * - * This function initializes the GLFW library. Before most GLFW functions can - * be used, GLFW must be initialized, and before an application terminates GLFW - * should be terminated in order to free any resources allocated during or - * after initialization. - * - * If this function fails, it calls @ref glfwTerminate before returning. If it - * succeeds, you should call @ref glfwTerminate before the application exits. - * - * Additional calls to this function after successful initialization but before - * termination will return `GLFW_TRUE` immediately. - * - * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_PLATFORM_ERROR. - * - * @remark @macos This function will change the current directory of the - * application to the `Contents/Resources` subdirectory of the application's - * bundle, if present. This can be disabled with the @ref - * GLFW_COCOA_CHDIR_RESOURCES init hint. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref intro_init - * @sa @ref glfwTerminate - * - * @since Added in version 1.0. - * - * @ingroup init - */ -GLFWAPI int glfwInit(void); - -/*! @brief Terminates the GLFW library. - * - * This function destroys all remaining windows and cursors, restores any - * modified gamma ramps and frees any other allocated resources. Once this - * function is called, you must again call @ref glfwInit successfully before - * you will be able to use most GLFW functions. - * - * If GLFW has been successfully initialized, this function should be called - * before the application exits. If initialization fails, there is no need to - * call this function, as it is called by @ref glfwInit before it returns - * failure. - * - * @errors Possible errors include @ref GLFW_PLATFORM_ERROR. - * - * @remark This function may be called before @ref glfwInit. - * - * @warning The contexts of any remaining windows must not be current on any - * other thread when this function is called. - * - * @reentrancy This function must not be called from a callback. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref intro_init - * @sa @ref glfwInit - * - * @since Added in version 1.0. - * - * @ingroup init - */ -GLFWAPI void glfwTerminate(void); - -/*! @brief Sets the specified init hint to the desired value. - * - * This function sets hints for the next initialization of GLFW. - * - * The values you set hints to are never reset by GLFW, but they only take - * effect during initialization. Once GLFW has been initialized, any values - * you set will be ignored until the library is terminated and initialized - * again. - * - * Some hints are platform specific. These may be set on any platform but they - * will only affect their specific platform. Other platforms will ignore them. - * Setting these hints requires no platform specific headers or functions. - * - * @param[in] hint The [init hint](@ref init_hints) to set. - * @param[in] value The new value of the init hint. - * - * @errors Possible errors include @ref GLFW_INVALID_ENUM and @ref - * GLFW_INVALID_VALUE. - * - * @remarks This function may be called before @ref glfwInit. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa init_hints - * @sa glfwInit - * - * @since Added in version 3.3. - * - * @ingroup init - */ -GLFWAPI void glfwInitHint(int hint, int value); - -/*! @brief Retrieves the version of the GLFW library. - * - * This function retrieves the major, minor and revision numbers of the GLFW - * library. It is intended for when you are using GLFW as a shared library and - * want to ensure that you are using the minimum required version. - * - * Any or all of the version arguments may be `NULL`. - * - * @param[out] major Where to store the major version number, or `NULL`. - * @param[out] minor Where to store the minor version number, or `NULL`. - * @param[out] rev Where to store the revision number, or `NULL`. - * - * @errors None. - * - * @remark This function may be called before @ref glfwInit. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref intro_version - * @sa @ref glfwGetVersionString - * - * @since Added in version 1.0. - * - * @ingroup init - */ -GLFWAPI void glfwGetVersion(int* major, int* minor, int* rev); - -/*! @brief Returns a string describing the compile-time configuration. - * - * This function returns the compile-time generated - * [version string](@ref intro_version_string) of the GLFW library binary. It - * describes the version, platform, compiler and any platform-specific - * compile-time options. It should not be confused with the OpenGL or OpenGL - * ES version string, queried with `glGetString`. - * - * __Do not use the version string__ to parse the GLFW library version. The - * @ref glfwGetVersion function provides the version of the running library - * binary in numerical format. - * - * @return The ASCII encoded GLFW version string. - * - * @errors None. - * - * @remark This function may be called before @ref glfwInit. - * - * @pointer_lifetime The returned string is static and compile-time generated. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref intro_version - * @sa @ref glfwGetVersion - * - * @since Added in version 3.0. - * - * @ingroup init - */ -GLFWAPI const char* glfwGetVersionString(void); - -/*! @brief Returns and clears the last error for the calling thread. - * - * This function returns and clears the [error code](@ref errors) of the last - * error that occurred on the calling thread, and optionally a UTF-8 encoded - * human-readable description of it. If no error has occurred since the last - * call, it returns @ref GLFW_NO_ERROR (zero) and the description pointer is - * set to `NULL`. - * - * @param[in] description Where to store the error description pointer, or `NULL`. - * @return The last error code for the calling thread, or @ref GLFW_NO_ERROR - * (zero). - * - * @errors None. - * - * @pointer_lifetime The returned string is allocated and freed by GLFW. You - * should not free it yourself. It is guaranteed to be valid only until the - * next error occurs or the library is terminated. - * - * @remark This function may be called before @ref glfwInit. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref error_handling - * @sa @ref glfwSetErrorCallback - * - * @since Added in version 3.3. - * - * @ingroup init - */ -GLFWAPI int glfwGetError(const char** description); - -/*! @brief Sets the error callback. - * - * This function sets the error callback, which is called with an error code - * and a human-readable description each time a GLFW error occurs. - * - * The error code is set before the callback is called. Calling @ref - * glfwGetError from the error callback will return the same value as the error - * code argument. - * - * The error callback is called on the thread where the error occurred. If you - * are using GLFW from multiple threads, your error callback needs to be - * written accordingly. - * - * Because the description string may have been generated specifically for that - * error, it is not guaranteed to be valid after the callback has returned. If - * you wish to use it after the callback returns, you need to make a copy. - * - * Once set, the error callback remains set even after the library has been - * terminated. - * - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set. - * - * @errors None. - * - * @remark This function may be called before @ref glfwInit. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref error_handling - * @sa @ref glfwGetError - * - * @since Added in version 3.0. - * - * @ingroup init - */ -GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun cbfun); - -/*! @brief Returns the currently connected monitors. - * - * This function returns an array of handles for all currently connected - * monitors. The primary monitor is always first in the returned array. If no - * monitors were found, this function returns `NULL`. - * - * @param[out] count Where to store the number of monitors in the returned - * array. This is set to zero if an error occurred. - * @return An array of monitor handles, or `NULL` if no monitors were found or - * if an [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @pointer_lifetime The returned array is allocated and freed by GLFW. You - * should not free it yourself. It is guaranteed to be valid only until the - * monitor configuration changes or the library is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_monitors - * @sa @ref monitor_event - * @sa @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 Retrives the work area of the monitor. - * - * This function returns the position, in screen coordinates, of the upper-left - * corner of the work area of the specified monitor along with the work area - * size in screen coordinates. The work area is defined as the area of the - * monitor not occluded by the operating system task bar where present. If no - * task bar exists then the work area is the monitor resolution in screen - * coordinates. - * - * Any or all of the position and size arguments may be `NULL`. If an error - * occurs, all non-`NULL` position and size arguments will be set to zero. - * - * @param[in] monitor The monitor to query. - * @param[out] xpos Where to store the monitor x-coordinate, or `NULL`. - * @param[out] ypos Where to store the monitor y-coordinate, or `NULL`. - * @param[out] width Where to store the monitor width, or `NULL`. - * @param[out] height Where to store the monitor height, or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_workarea - * - * @since Added in version 3.3. - * - * @ingroup monitor - */ -GLFWAPI void glfwGetMonitorWorkarea(GLFWmonitor* monitor, int* xpos, int* ypos, int* width, int* height); - -/*! @brief Returns the physical size of the monitor. - * - * This function returns the size, in millimetres, of the display area of the - * specified monitor. - * - * Some systems do not provide accurate monitor size information, either - * because the monitor - * [EDID](https://en.wikipedia.org/wiki/Extended_display_identification_data) - * data is incorrect or because the driver does not report it accurately. - * - * Any or all of the size arguments may be `NULL`. If an error occurs, all - * non-`NULL` size arguments will be set to zero. - * - * @param[in] monitor The monitor to query. - * @param[out] widthMM Where to store the width, in millimetres, of the - * monitor's display area, or `NULL`. - * @param[out] heightMM Where to store the height, in millimetres, of the - * monitor's display area, or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @remark @win32 calculates the returned physical size from the - * current resolution and system DPI instead of querying the monitor EDID data. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_properties - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -GLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* monitor, int* widthMM, int* heightMM); - -/*! @brief Retrieves the content scale for the specified monitor. - * - * This function retrieves the content scale for the specified monitor. The - * content scale is the ratio between the current DPI and the platform's - * default DPI. This is especially important for text and any UI elements. If - * the pixel dimensions of your UI scaled by this look appropriate on your - * machine then it should appear at a reasonable size on other machines - * regardless of their DPI and scaling settings. This relies on the system DPI - * and scaling settings being somewhat correct. - * - * The content scale may depend on both the monitor resolution and pixel - * density and on user settings. It may be very different from the raw DPI - * calculated from the physical size and current resolution. - * - * @param[in] monitor The monitor to query. - * @param[out] xscale Where to store the x-axis content scale, or `NULL`. - * @param[out] yscale Where to store the y-axis content scale, or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_scale - * @sa @ref glfwGetWindowContentScale - * - * @since Added in version 3.3. - * - * @ingroup monitor - */ -GLFWAPI void glfwGetMonitorContentScale(GLFWmonitor* monitor, float* xscale, float* yscale); - -/*! @brief Returns the name of the specified monitor. - * - * This function returns a human-readable name, encoded as UTF-8, of the - * specified monitor. The name typically reflects the make and model of the - * monitor and is not guaranteed to be unique among the connected monitors. - * - * @param[in] monitor The monitor to query. - * @return The UTF-8 encoded name of the monitor, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @pointer_lifetime The returned string is allocated and freed by GLFW. You - * should not free it yourself. It is valid until the specified monitor is - * disconnected or the library is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_properties - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -GLFWAPI const char* glfwGetMonitorName(GLFWmonitor* monitor); - -/*! @brief Sets the user pointer of the specified monitor. - * - * This function sets the user-defined pointer of the specified monitor. The - * current value is retained until the monitor is disconnected. The initial - * value is `NULL`. - * - * This function may be called from the monitor callback, even for a monitor - * that is being disconnected. - * - * @param[in] monitor The monitor whose pointer to set. - * @param[in] pointer The new value. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @sa @ref monitor_userptr - * @sa @ref glfwGetMonitorUserPointer - * - * @since Added in version 3.3. - * - * @ingroup monitor - */ -GLFWAPI void glfwSetMonitorUserPointer(GLFWmonitor* monitor, void* pointer); - -/*! @brief Returns the user pointer of the specified monitor. - * - * This function returns the current value of the user-defined pointer of the - * specified monitor. The initial value is `NULL`. - * - * This function may be called from the monitor callback, even for a monitor - * that is being disconnected. - * - * @param[in] monitor The monitor whose pointer to return. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @sa @ref monitor_userptr - * @sa @ref glfwSetMonitorUserPointer - * - * @since Added in version 3.3. - * - * @ingroup monitor - */ -GLFWAPI void* glfwGetMonitorUserPointer(GLFWmonitor* monitor); - -/*! @brief Sets the monitor configuration callback. - * - * This function sets the monitor configuration callback, or removes the - * currently set callback. This is called when a monitor is connected to or - * disconnected from the system. - * - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_event - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -GLFWAPI GLFWmonitorfun glfwSetMonitorCallback(GLFWmonitorfun cbfun); - -/*! @brief Returns the available video modes for the specified monitor. - * - * This function returns an array of all video modes supported by the specified - * monitor. The returned array is sorted in ascending order, first by color - * bit depth (the sum of all channel depths) and then by resolution area (the - * product of width and height). - * - * @param[in] monitor The monitor to query. - * @param[out] count Where to store the number of video modes in the returned - * array. This is set to zero if an error occurred. - * @return An array of video modes, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The returned array is allocated and freed by GLFW. You - * should not free it yourself. It is valid until the specified monitor is - * disconnected, this function is called again for that monitor or the library - * is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_modes - * @sa @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 priviledged 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 priviledged 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 priviledged 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 overriden by previously saved values. - * - * @remark @x11 Some window managers will not respect the placement of - * initially hidden windows. - * - * @remark @x11 Due to the asynchronous nature of X11, it may take a moment for - * a window to reach its requested state. This means you may not be able to - * query the final size, position or other attributes directly after window - * creation. - * - * @remark @x11 The class part of the `WM_CLASS` window property will by - * default be set to the window title passed to this function. The instance - * part will use the contents of the `RESOURCE_NAME` environment variable, if - * present and not empty, or fall back to the window title. Set the - * [GLFW_X11_CLASS_NAME](@ref GLFW_X11_CLASS_NAME_hint) and - * [GLFW_X11_INSTANCE_NAME](@ref GLFW_X11_INSTANCE_NAME_hint) window hints to - * override this. - * - * @remark @wayland Compositors should implement the xdg-decoration protocol - * for GLFW to decorate the window properly. If this protocol isn't - * supported, or if the compositor prefers client-side decorations, a very - * simple fallback frame will be drawn using the wp_viewporter protocol. A - * compositor can still emit close, maximize or fullscreen events, using for - * instance a keybind mechanism. If neither of these protocols is supported, - * the window won't be decorated. - * - * @remark @wayland A full screen window will not attempt to change the mode, - * no matter what the requested size or refresh rate. - * - * @remark @wayland Screensaver inhibition requires the idle-inhibit protocol - * to be implemented in the user's compositor. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_creation - * @sa @ref glfwDestroyWindow - * - * @since Added in version 3.0. Replaces `glfwOpenWindow`. - * - * @ingroup window - */ -GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share); - -/*! @brief Destroys the specified window and its context. - * - * This function destroys the specified window and its context. On calling - * this function, no further callbacks will be called for that window. - * - * If the context of the specified window is current on the main thread, it is - * detached before being destroyed. - * - * @param[in] window The window to destroy. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @note The context of the specified window must not be current on any other - * thread when this function is called. - * - * @reentrancy This function must not be called from a callback. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_creation - * @sa @ref glfwCreateWindow - * - * @since Added in version 3.0. Replaces `glfwCloseWindow`. - * - * @ingroup window - */ -GLFWAPI void glfwDestroyWindow(GLFWwindow* window); - -/*! @brief Checks the close flag of the specified window. - * - * This function returns the value of the close flag of the specified window. - * - * @param[in] window The window to query. - * @return The value of the close flag. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @sa @ref window_close - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI int glfwWindowShouldClose(GLFWwindow* window); - -/*! @brief Sets the close flag of the specified window. - * - * This function sets the value of the close flag of the specified window. - * This can be used to override the user's attempt to close the window, or - * to signal that it should be closed. - * - * @param[in] window The window whose flag to change. - * @param[in] value The new value. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @sa @ref window_close - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowShouldClose(GLFWwindow* window, int value); - -/*! @brief Sets the title of the specified window. - * - * This function sets the window title, encoded as UTF-8, of the specified - * window. - * - * @param[in] window The window whose title to change. - * @param[in] title The UTF-8 encoded window title. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark @macos The window title will not be updated until the next time you - * process events. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_title - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowTitle(GLFWwindow* window, const char* title); - -/*! @brief Sets the icon for the specified window. - * - * This function sets the icon of the specified window. If passed an array of - * candidate images, those of or closest to the sizes desired by the system are - * selected. If no images are specified, the window reverts to its default - * icon. - * - * The pixels are 32-bit, little-endian, non-premultiplied RGBA, i.e. eight - * bits per channel with the red channel first. They are arranged canonically - * as packed sequential rows, starting from the top-left corner. - * - * The desired image sizes varies depending on platform and system settings. - * The selected images will be rescaled as needed. Good sizes include 16x16, - * 32x32 and 48x48. - * - * @param[in] window The window whose icon to set. - * @param[in] count The number of images in the specified array, or zero to - * revert to the default window icon. - * @param[in] images The images to create the icon from. This is ignored if - * count is zero. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The specified image data is copied before this function - * returns. - * - * @remark @macos The GLFW window has no icon, as it is not a document - * window, so this function does nothing. The dock icon will be the same as - * the application bundle's icon. For more information on bundles, see the - * [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/) - * in the Mac Developer Library. - * - * @remark @wayland There is no existing protocol to change an icon, the - * window will thus inherit the one defined in the application's desktop file. - * This function always emits @ref GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_icon - * - * @since Added in version 3.2. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowIcon(GLFWwindow* window, int count, const GLFWimage* images); - -/*! @brief Retrieves the position of the content area of the specified window. - * - * This function retrieves the position, in screen coordinates, of the - * upper-left corner of the content area of the specified window. - * - * Any or all of the position arguments may be `NULL`. If an error occurs, all - * non-`NULL` position arguments will be set to zero. - * - * @param[in] window The window to query. - * @param[out] xpos Where to store the x-coordinate of the upper-left corner of - * the content area, or `NULL`. - * @param[out] ypos Where to store the y-coordinate of the upper-left corner of - * the content area, or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark @wayland There is no way for an application to retrieve the global - * position of its windows, this function will always emit @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_pos - * @sa @ref glfwSetWindowPos - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos); - -/*! @brief Sets the position of the content area of the specified window. - * - * This function sets the position, in screen coordinates, of the upper-left - * corner of the content area of the specified windowed mode window. If the - * window is a full screen window, this function does nothing. - * - * __Do not use this function__ to move an already visible window unless you - * have very good reasons for doing so, as it will confuse and annoy the user. - * - * The window manager may put limits on what positions are allowed. GLFW - * cannot and should not override these limits. - * - * @param[in] window The window to query. - * @param[in] xpos The x-coordinate of the upper-left corner of the content area. - * @param[in] ypos The y-coordinate of the upper-left corner of the content area. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark @wayland There is no way for an application to set the global - * position of its windows, this function will always emit @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_pos - * @sa @ref glfwGetWindowPos - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowPos(GLFWwindow* window, int xpos, int ypos); - -/*! @brief Retrieves the size of the content area of the specified window. - * - * This function retrieves the size, in screen coordinates, of the content area - * of the specified window. If you wish to retrieve the size of the - * framebuffer of the window in pixels, see @ref glfwGetFramebufferSize. - * - * Any or all of the size arguments may be `NULL`. If an error occurs, all - * non-`NULL` size arguments will be set to zero. - * - * @param[in] window The window whose size to retrieve. - * @param[out] width Where to store the width, in screen coordinates, of the - * content area, or `NULL`. - * @param[out] height Where to store the height, in screen coordinates, of the - * content area, or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_size - * @sa @ref glfwSetWindowSize - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwGetWindowSize(GLFWwindow* window, int* width, int* height); - -/*! @brief Sets the size limits of the specified window. - * - * This function sets the size limits of the content area of the specified - * window. If the window is full screen, the size limits only take effect - * once it is made windowed. If the window is not resizable, this function - * does nothing. - * - * The size limits are applied immediately to a windowed mode window and may - * cause it to be resized. - * - * The maximum dimensions must be greater than or equal to the minimum - * dimensions and all must be greater than or equal to zero. - * - * @param[in] window The window to set limits for. - * @param[in] minwidth The minimum width, in screen coordinates, of the content - * area, or `GLFW_DONT_CARE`. - * @param[in] minheight The minimum height, in screen coordinates, of the - * content area, or `GLFW_DONT_CARE`. - * @param[in] maxwidth The maximum width, in screen coordinates, of the content - * area, or `GLFW_DONT_CARE`. - * @param[in] maxheight The maximum height, in screen coordinates, of the - * content area, or `GLFW_DONT_CARE`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. - * - * @remark If you set size limits and an aspect ratio that conflict, the - * results are undefined. - * - * @remark @wayland The size limits will not be applied until the window is - * actually resized, either by the user or by the compositor. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_sizelimits - * @sa @ref glfwSetWindowAspectRatio - * - * @since Added in version 3.2. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowSizeLimits(GLFWwindow* window, int minwidth, int minheight, int maxwidth, int maxheight); - -/*! @brief Sets the aspect ratio of the specified window. - * - * This function sets the required aspect ratio of the content area of the - * specified window. If the window is full screen, the aspect ratio only takes - * effect once it is made windowed. If the window is not resizable, this - * function does nothing. - * - * The aspect ratio is specified as a numerator and a denominator and both - * values must be greater than zero. For example, the common 16:9 aspect ratio - * is specified as 16 and 9, respectively. - * - * If the numerator and denominator is set to `GLFW_DONT_CARE` then the aspect - * ratio limit is disabled. - * - * The aspect ratio is applied immediately to a windowed mode window and may - * cause it to be resized. - * - * @param[in] window The window to set limits for. - * @param[in] numer The numerator of the desired aspect ratio, or - * `GLFW_DONT_CARE`. - * @param[in] denom The denominator of the desired aspect ratio, or - * `GLFW_DONT_CARE`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. - * - * @remark If you set size limits and an aspect ratio that conflict, the - * results are undefined. - * - * @remark @wayland The aspect ratio will not be applied until the window is - * actually resized, either by the user or by the compositor. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_sizelimits - * @sa @ref glfwSetWindowSizeLimits - * - * @since Added in version 3.2. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowAspectRatio(GLFWwindow* window, int numer, int denom); - -/*! @brief Sets the size of the content area of the specified window. - * - * This function sets the size, in screen coordinates, of the content area of - * the specified window. - * - * For full screen windows, this function updates the resolution of its desired - * video mode and switches to the video mode closest to it, without affecting - * the window's context. As the context is unaffected, the bit depths of the - * framebuffer remain unchanged. - * - * If you wish to update the refresh rate of the desired video mode in addition - * to its resolution, see @ref glfwSetWindowMonitor. - * - * The window manager may put limits on what sizes are allowed. GLFW cannot - * and should not override these limits. - * - * @param[in] window The window to resize. - * @param[in] width The desired width, in screen coordinates, of the window - * content area. - * @param[in] height The desired height, in screen coordinates, of the window - * content area. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark @wayland A full screen window will not attempt to change the mode, - * no matter what the requested size. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_size - * @sa @ref glfwGetWindowSize - * @sa @ref glfwSetWindowMonitor - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowSize(GLFWwindow* window, int width, int height); - -/*! @brief Retrieves the size of the framebuffer of the specified window. - * - * This function retrieves the size, in pixels, of the framebuffer of the - * specified window. If you wish to retrieve the size of the window in screen - * coordinates, see @ref glfwGetWindowSize. - * - * Any or all of the size arguments may be `NULL`. If an error occurs, all - * non-`NULL` size arguments will be set to zero. - * - * @param[in] window The window whose framebuffer to query. - * @param[out] width Where to store the width, in pixels, of the framebuffer, - * or `NULL`. - * @param[out] height Where to store the height, in pixels, of the framebuffer, - * or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_fbsize - * @sa @ref glfwSetFramebufferSizeCallback - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwGetFramebufferSize(GLFWwindow* window, int* width, int* height); - -/*! @brief Retrieves the size of the frame of the window. - * - * This function retrieves the size, in screen coordinates, of each edge of the - * frame of the specified window. This size includes the title bar, if the - * window has one. The size of the frame may vary depending on the - * [window-related hints](@ref window_hints_wnd) used to create it. - * - * Because this function retrieves the size of each window frame edge and not - * the offset along a particular coordinate axis, the retrieved values will - * always be zero or positive. - * - * Any or all of the size arguments may be `NULL`. If an error occurs, all - * non-`NULL` size arguments will be set to zero. - * - * @param[in] window The window whose frame size to query. - * @param[out] left Where to store the size, in screen coordinates, of the left - * edge of the window frame, or `NULL`. - * @param[out] top Where to store the size, in screen coordinates, of the top - * edge of the window frame, or `NULL`. - * @param[out] right Where to store the size, in screen coordinates, of the - * right edge of the window frame, or `NULL`. - * @param[out] bottom Where to store the size, in screen coordinates, of the - * bottom edge of the window frame, or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_size - * - * @since Added in version 3.1. - * - * @ingroup window - */ -GLFWAPI void glfwGetWindowFrameSize(GLFWwindow* window, int* left, int* top, int* right, int* bottom); - -/*! @brief Retrieves the content scale for the specified window. - * - * This function retrieves the content scale for the specified window. The - * content scale is the ratio between the current DPI and the platform's - * default DPI. This is especially important for text and any UI elements. If - * the pixel dimensions of your UI scaled by this look appropriate on your - * machine then it should appear at a reasonable size on other machines - * regardless of their DPI and scaling settings. This relies on the system DPI - * and scaling settings being somewhat correct. - * - * On systems where each monitors can have its own content scale, the window - * content scale will depend on which monitor the system considers the window - * to be on. - * - * @param[in] window The window to query. - * @param[out] xscale Where to store the x-axis content scale, or `NULL`. - * @param[out] yscale Where to store the y-axis content scale, or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_scale - * @sa @ref glfwSetWindowContentScaleCallback - * @sa @ref glfwGetMonitorContentScale - * - * @since Added in version 3.3. - * - * @ingroup window - */ -GLFWAPI void glfwGetWindowContentScale(GLFWwindow* window, float* xscale, float* yscale); - -/*! @brief Returns the opacity of the whole window. - * - * This function returns the opacity of the window, including any decorations. - * - * The opacity (or alpha) value is a positive finite number between zero and - * one, where zero is fully transparent and one is fully opaque. If the system - * does not support whole window transparency, this function always returns one. - * - * The initial opacity value for newly created windows is one. - * - * @param[in] window The window to query. - * @return The opacity value of the specified window. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_transparency - * @sa @ref glfwSetWindowOpacity - * - * @since Added in version 3.3. - * - * @ingroup window - */ -GLFWAPI float glfwGetWindowOpacity(GLFWwindow* window); - -/*! @brief Sets the opacity of the whole window. - * - * This function sets the opacity of the window, including any decorations. - * - * The opacity (or alpha) value is a positive finite number between zero and - * one, where zero is fully transparent and one is fully opaque. - * - * The initial opacity value for newly created windows is one. - * - * A window created with framebuffer transparency may not use whole window - * transparency. The results of doing this are undefined. - * - * @param[in] window The window to set the opacity for. - * @param[in] opacity The desired opacity of the specified window. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_transparency - * @sa @ref glfwGetWindowOpacity - * - * @since Added in version 3.3. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowOpacity(GLFWwindow* window, float opacity); - -/*! @brief Iconifies the specified window. - * - * This function iconifies (minimizes) the specified window if it was - * previously restored. If the window is already iconified, this function does - * nothing. - * - * If the specified window is a full screen window, the original monitor - * resolution is restored until the window is restored. - * - * @param[in] window The window to iconify. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark @wayland There is no concept of iconification in wl_shell, this - * function will emit @ref GLFW_PLATFORM_ERROR when using this deprecated - * protocol. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_iconify - * @sa @ref glfwRestoreWindow - * @sa @ref glfwMaximizeWindow - * - * @since Added in version 2.1. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwIconifyWindow(GLFWwindow* window); - -/*! @brief Restores the specified window. - * - * This function restores the specified window if it was previously iconified - * (minimized) or maximized. If the window is already restored, this function - * does nothing. - * - * If the specified window is a full screen window, the resolution chosen for - * the window is restored on the selected monitor. - * - * @param[in] window The window to restore. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_iconify - * @sa @ref glfwIconifyWindow - * @sa @ref glfwMaximizeWindow - * - * @since Added in version 2.1. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwRestoreWindow(GLFWwindow* window); - -/*! @brief Maximizes the specified window. - * - * This function maximizes the specified window if it was previously not - * maximized. If the window is already maximized, this function does nothing. - * - * If the specified window is a full screen window, this function does nothing. - * - * @param[in] window The window to maximize. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_iconify - * @sa @ref glfwIconifyWindow - * @sa @ref glfwRestoreWindow - * - * @since Added in GLFW 3.2. - * - * @ingroup window - */ -GLFWAPI void glfwMaximizeWindow(GLFWwindow* window); - -/*! @brief Makes the specified window visible. - * - * This function makes the specified window visible if it was previously - * hidden. If the window is already visible or is in full screen mode, this - * function does nothing. - * - * By default, windowed mode windows are focused when shown - * Set the [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_hint) window hint - * to change this behavior for all newly created windows, or change the - * behavior for an existing window with @ref glfwSetWindowAttrib. - * - * @param[in] window The window to make visible. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_hide - * @sa @ref glfwHideWindow - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwShowWindow(GLFWwindow* window); - -/*! @brief Hides the specified window. - * - * This function hides the specified window if it was previously visible. If - * the window is already hidden or is in full screen mode, this function does - * nothing. - * - * @param[in] window The window to hide. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_hide - * @sa @ref glfwShowWindow - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwHideWindow(GLFWwindow* window); - -/*! @brief Brings the specified window to front and sets input focus. - * - * This function brings the specified window to front and sets input focus. - * The window should already be visible and not iconified. - * - * By default, both windowed and full screen mode windows are focused when - * initially created. Set the [GLFW_FOCUSED](@ref GLFW_FOCUSED_hint) to - * disable this behavior. - * - * Also by default, windowed mode windows are focused when shown - * with @ref glfwShowWindow. Set the - * [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_hint) to disable this behavior. - * - * __Do not use this function__ to steal focus from other applications unless - * you are certain that is what the user wants. Focus stealing can be - * extremely disruptive. - * - * For a less disruptive way of getting the user's attention, see - * [attention requests](@ref window_attention). - * - * @param[in] window The window to give input focus. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark @wayland It is not possible for an application to bring its windows - * to front, this function will always emit @ref GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_focus - * @sa @ref window_attention - * - * @since Added in version 3.2. - * - * @ingroup window - */ -GLFWAPI void glfwFocusWindow(GLFWwindow* window); - -/*! @brief Requests user attention to the specified window. - * - * This function requests user attention to the specified window. On - * platforms where this is not supported, attention is requested to the - * application as a whole. - * - * Once the user has given attention, usually by focusing the window or - * application, the system will end the request automatically. - * - * @param[in] window The window to request attention to. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark @macos Attention is requested to the application as a whole, not the - * specific window. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_attention - * - * @since Added in version 3.3. - * - * @ingroup window - */ -GLFWAPI void glfwRequestWindowAttention(GLFWwindow* window); - -/*! @brief Returns the monitor that the window uses for full screen mode. - * - * This function returns the handle of the monitor that the specified window is - * in full screen on. - * - * @param[in] window The window to query. - * @return The monitor, or `NULL` if the window is in windowed mode or an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_monitor - * @sa @ref glfwSetWindowMonitor - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* window); - -/*! @brief Sets the mode, monitor, video mode and placement of a window. - * - * This function sets the monitor that the window uses for full screen mode or, - * if the monitor is `NULL`, makes it windowed mode. - * - * When setting a monitor, this function updates the width, height and refresh - * rate of the desired video mode and switches to the video mode closest to it. - * The window position is ignored when setting a monitor. - * - * When the monitor is `NULL`, the position, width and height are used to - * place the window content area. The refresh rate is ignored when no monitor - * is specified. - * - * If you only wish to update the resolution of a full screen window or the - * size of a windowed mode window, see @ref glfwSetWindowSize. - * - * When a window transitions from full screen to windowed mode, this function - * restores any previous window settings such as whether it is decorated, - * floating, resizable, has size or aspect ratio limits, etc. - * - * @param[in] window The window whose monitor, size or video mode to set. - * @param[in] monitor The desired monitor, or `NULL` to set windowed mode. - * @param[in] xpos The desired x-coordinate of the upper-left corner of the - * content area. - * @param[in] ypos The desired y-coordinate of the upper-left corner of the - * content area. - * @param[in] width The desired with, in screen coordinates, of the content - * area or video mode. - * @param[in] height The desired height, in screen coordinates, of the content - * area or video mode. - * @param[in] refreshRate The desired refresh rate, in Hz, of the video mode, - * or `GLFW_DONT_CARE`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark The OpenGL or OpenGL ES context will not be destroyed or otherwise - * affected by any resizing or mode switching, although you may need to update - * your viewport if the framebuffer size has changed. - * - * @remark @wayland The desired window position is ignored, as there is no way - * for an application to set this property. - * - * @remark @wayland Setting the window to full screen will not attempt to - * change the mode, no matter what the requested size or refresh rate. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_monitor - * @sa @ref window_full_screen - * @sa @ref glfwGetWindowMonitor - * @sa @ref glfwSetWindowSize - * - * @since Added in version 3.2. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowMonitor(GLFWwindow* window, GLFWmonitor* monitor, int xpos, int ypos, int width, int height, int refreshRate); - -/*! @brief Returns an attribute of the specified window. - * - * This function returns the value of an attribute of the specified window or - * its OpenGL or OpenGL ES context. - * - * @param[in] window The window to query. - * @param[in] attrib The [window attribute](@ref window_attribs) whose value to - * return. - * @return The value of the attribute, or zero if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. - * - * @remark Framebuffer related hints are not window attributes. See @ref - * window_attribs_fb for more information. - * - * @remark Zero is a valid value for many window and context related - * attributes so you cannot use a return value of zero as an indication of - * errors. However, this function should not fail as long as it is passed - * valid arguments and the library has been [initialized](@ref intro_init). - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_attribs - * @sa @ref glfwSetWindowAttrib - * - * @since Added in version 3.0. Replaces `glfwGetWindowParam` and - * `glfwGetGLVersion`. - * - * @ingroup window - */ -GLFWAPI int glfwGetWindowAttrib(GLFWwindow* window, int attrib); - -/*! @brief Sets an attribute of the specified window. - * - * This function sets the value of an attribute of the specified window. - * - * The supported attributes are [GLFW_DECORATED](@ref GLFW_DECORATED_attrib), - * [GLFW_RESIZABLE](@ref GLFW_RESIZABLE_attrib), - * [GLFW_FLOATING](@ref GLFW_FLOATING_attrib), - * [GLFW_AUTO_ICONIFY](@ref GLFW_AUTO_ICONIFY_attrib) and - * [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_attrib). - * - * Some of these attributes are ignored for full screen windows. The new - * value will take effect if the window is later made windowed. - * - * Some of these attributes are ignored for windowed mode windows. The new - * value will take effect if the window is later made full screen. - * - * @param[in] window The window to set the attribute for. - * @param[in] attrib A supported window attribute. - * @param[in] value `GLFW_TRUE` or `GLFW_FALSE`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM, @ref GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. - * - * @remark Calling @ref glfwGetWindowAttrib will always return the latest - * value, even if that value is ignored by the current mode of the window. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_attribs - * @sa @ref glfwGetWindowAttrib - * - * @since Added in version 3.3. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowAttrib(GLFWwindow* window, int attrib, int value); - -/*! @brief Sets the user pointer of the specified window. - * - * This function sets the user-defined pointer of the specified window. The - * current value is retained until the window is destroyed. The initial value - * is `NULL`. - * - * @param[in] window The window whose pointer to set. - * @param[in] pointer The new value. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @sa @ref window_userptr - * @sa @ref glfwGetWindowUserPointer - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowUserPointer(GLFWwindow* window, void* pointer); - -/*! @brief Returns the user pointer of the specified window. - * - * This function returns the current value of the user-defined pointer of the - * specified window. The initial value is `NULL`. - * - * @param[in] window The window whose pointer to return. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @sa @ref window_userptr - * @sa @ref glfwSetWindowUserPointer - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow* window); - -/*! @brief Sets the position callback for the specified window. - * - * This function sets the position callback of the specified window, which is - * called when the window is moved. The callback is provided with the - * position, in screen coordinates, of the upper-left corner of the content - * area of the window. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @remark @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 cbfun); - -/*! @brief Sets the size callback for the specified window. - * - * This function sets the size callback of the specified window, which is - * called when the window is resized. The callback is provided with the size, - * in screen coordinates, of the content area of the window. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_size - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter and return value. - * - * @ingroup window - */ -GLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwindowsizefun cbfun); - -/*! @brief Sets the close callback for the specified window. - * - * This function sets the close callback of the specified window, which is - * called when the user attempts to close the window, for example by clicking - * the close widget in the title bar. - * - * The close flag is set before this callback is called, but you can modify it - * at any time with @ref glfwSetWindowShouldClose. - * - * The close callback is not triggered by @ref glfwDestroyWindow. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @remark @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 cbfun); - -/*! @brief Sets the refresh callback for the specified window. - * - * This function sets the refresh callback of the specified window, which is - * called when the 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] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_refresh - * - * @since Added in version 2.5. - * @glfw3 Added window handle parameter and return value. - * - * @ingroup window - */ -GLFWAPI GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* window, GLFWwindowrefreshfun cbfun); - -/*! @brief Sets the focus callback for the specified window. - * - * This function sets the focus callback of the specified window, which is - * called when the window gains or loses input focus. - * - * After the focus callback is called for a window that lost input focus, - * synthetic key and mouse button release events will be generated for all such - * that had been pressed. For more information, see @ref glfwSetKeyCallback - * and @ref glfwSetMouseButtonCallback. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_focus - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* window, GLFWwindowfocusfun cbfun); - -/*! @brief Sets the iconify callback for the specified window. - * - * This function sets the iconification callback of the specified window, which - * is called when the window is iconified or restored. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @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 cbfun); - -/*! @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] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_maximize - * - * @since Added in version 3.3. - * - * @ingroup window - */ -GLFWAPI GLFWwindowmaximizefun glfwSetWindowMaximizeCallback(GLFWwindow* window, GLFWwindowmaximizefun cbfun); - -/*! @brief Sets the framebuffer resize callback for the specified window. - * - * This function sets the framebuffer resize callback of the specified window, - * which is called when the framebuffer of the specified window is resized. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_fbsize - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* window, GLFWframebuffersizefun cbfun); - -/*! @brief 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] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_scale - * @sa @ref glfwGetWindowContentScale - * - * @since Added in version 3.3. - * - * @ingroup window - */ -GLFWAPI GLFWwindowcontentscalefun glfwSetWindowContentScaleCallback(GLFWwindow* window, GLFWwindowcontentscalefun cbfun); - -/*! @brief Processes all pending events. - * - * This function processes only those events that are already in the event - * queue and then returns immediately. Processing events will cause the window - * and input callbacks associated with those events to be called. - * - * On some platforms, a window move, resize or menu operation will cause event - * processing to block. This is due to how event processing is designed on - * those platforms. You can use the - * [window refresh callback](@ref window_refresh) to redraw the contents of - * your window when necessary during such operations. - * - * 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. - * - * @pointer_lifetime The returned string is allocated and freed by GLFW. You - * should not free it yourself. It is valid until the next call to @ref - * glfwGetKeyName, or until the library is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref input_key_name - * - * @since Added in version 3.2. - * - * @ingroup input - */ -GLFWAPI const char* glfwGetKeyName(int key, int scancode); - -/*! @brief Returns the 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] cbfun The new key callback, or `NULL` to remove the currently - * set callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref input_key - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter and return value. - * - * @ingroup input - */ -GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun cbfun); - -/*! @brief Sets the Unicode character callback. - * - * This function sets the character callback of the specified window, which is - * called when a Unicode character is input. - * - * The character callback is intended for Unicode text input. As it deals with - * characters, it is keyboard layout dependent, whereas the - * [key callback](@ref glfwSetKeyCallback) is not. Characters do not map 1:1 - * to physical keys, as a key may produce zero, one or more characters. If you - * want to know whether a specific physical key was pressed or released, see - * the key callback instead. - * - * The character callback behaves as system text input normally does and will - * not be called if modifier keys are held down that would prevent normal text - * input on that platform, for example a Super (Command) key on macOS or Alt key - * on Windows. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref input_char - * - * @since Added in version 2.4. - * @glfw3 Added window handle parameter and return value. - * - * @ingroup input - */ -GLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* window, GLFWcharfun cbfun); - -/*! @brief Sets the Unicode character with modifiers callback. - * - * This function sets the character with modifiers callback of the specified - * window, which is called when a Unicode character is input regardless of what - * modifier keys are used. - * - * The character with modifiers callback is intended for implementing custom - * Unicode character input. For regular Unicode text input, see the - * [character callback](@ref glfwSetCharCallback). Like the character - * callback, the character with modifiers callback deals with characters and is - * keyboard layout dependent. Characters do not map 1:1 to physical keys, as - * a key may produce zero, one or more characters. If you want to know whether - * a specific physical key was pressed or released, see the - * [key callback](@ref glfwSetKeyCallback) instead. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or an - * [error](@ref error_handling) occurred. - * - * @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 cbfun); - -/*! @brief Sets the mouse button callback. - * - * This function sets the mouse button callback of the specified window, which - * is called when a mouse button is pressed or released. - * - * When a window loses input focus, it will generate synthetic mouse button - * release events for all pressed mouse buttons. You can tell these events - * from user-generated events by the fact that the synthetic ones are generated - * after the focus loss event has been processed, i.e. after the - * [window focus callback](@ref glfwSetWindowFocusCallback) has been called. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref input_mouse_button - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter and return value. - * - * @ingroup input - */ -GLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* window, GLFWmousebuttonfun cbfun); - -/*! @brief Sets the cursor position callback. - * - * This function sets the cursor position callback of the specified window, - * which is called when the cursor is moved. The callback is provided with the - * position, in screen coordinates, relative to the upper-left corner of the - * content area of the window. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref cursor_pos - * - * @since Added in version 3.0. Replaces `glfwSetMousePosCallback`. - * - * @ingroup input - */ -GLFWAPI GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* window, GLFWcursorposfun cbfun); - -/*! @brief Sets the cursor enter/exit callback. - * - * This function sets the cursor boundary crossing callback of the specified - * window, which is called when the cursor enters or leaves the content area of - * the window. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref cursor_enter - * - * @since Added in version 3.0. - * - * @ingroup input - */ -GLFWAPI GLFWcursorenterfun glfwSetCursorEnterCallback(GLFWwindow* window, GLFWcursorenterfun cbfun); - -/*! @brief Sets the scroll callback. - * - * This function sets the scroll callback of the specified window, which is - * called when a scrolling device is used, such as a mouse wheel or scrolling - * area of a touchpad. - * - * The scroll callback receives all scrolling input, like that from a mouse - * wheel or a touchpad scrolling area. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new scroll callback, or `NULL` to remove the currently - * set callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref scrolling - * - * @since Added in version 3.0. Replaces `glfwSetMouseWheelCallback`. - * - * @ingroup input - */ -GLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow* window, GLFWscrollfun cbfun); - -/*! @brief Sets the file drop callback. - * - * This function sets the file drop callback of the specified window, which is - * called when one or more dragged files are dropped on the window. - * - * Because the path array and its strings may have been generated specifically - * for that event, they are not guaranteed to be valid after the callback has - * returned. If you wish to use them after the callback returns, you need to - * make a deep copy. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new file drop callback, or `NULL` to remove the - * currently set callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @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 cbfun); - -/*! @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 comaptible 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] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref joystick_event - * - * @since Added in version 3.2. - * - * @ingroup input - */ -GLFWAPI GLFWjoystickfun glfwSetJoystickCallback(GLFWjoystickfun cbfun); - -/*! @brief Adds the specified SDL_GameControllerDB gamepad mappings. - * - * This function parses the specified ASCII encoded string and updates the - * internal list with any gamepad mappings it finds. This string may - * contain either a single gamepad mapping or many mappings separated by - * newlines. The parser supports the full format of the `gamecontrollerdb.txt` - * source file including empty lines and comments. - * - * See @ref gamepad_mapping for a description of the format. - * - * If there is already a gamepad mapping for a given GUID in the internal list, - * it will be replaced by the one passed to this function. If the library is - * terminated and re-initialized the internal list will revert to the built-in - * default. - * - * @param[in] string The string containing the gamepad mappings. - * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_INVALID_VALUE. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref gamepad - * @sa @ref glfwJoystickIsGamepad - * @sa @ref glfwGetGamepadName - * - * @since Added in version 3.3. - * - * @ingroup input - */ -GLFWAPI int glfwUpdateGamepadMappings(const char* string); - -/*! @brief Returns the human-readable gamepad name for the specified joystick. - * - * This function returns the human-readable name of the gamepad from the - * gamepad mapping assigned to the specified joystick. - * - * If the specified joystick is not present or does not have a gamepad mapping - * this function will return `NULL` but will not generate an error. Call - * @ref glfwJoystickPresent to check whether it is present regardless of - * whether it has a mapping. - * - * @param[in] jid The [joystick](@ref joysticks) to query. - * @return The UTF-8 encoded name of the gamepad, or `NULL` if the - * joystick is not present, does not have a mapping or an - * [error](@ref error_handling) occurred. - * - * @pointer_lifetime The returned string is allocated and freed by GLFW. You - * should not free it yourself. It is valid until the specified joystick is - * disconnected, the gamepad mappings are updated or the library is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref gamepad - * @sa @ref glfwJoystickIsGamepad - * - * @since Added in version 3.3. - * - * @ingroup input - */ -GLFWAPI const char* glfwGetGamepadName(int jid); - -/*! @brief Retrieves the state of the specified joystick remapped as a gamepad. - * - * This function retrives the state of the specified joystick remapped to - * an Xbox-like gamepad. - * - * If the specified joystick is not present or does not have a gamepad mapping - * this function will return `GLFW_FALSE` but will not generate an error. Call - * @ref glfwJoystickPresent to check whether it is present regardless of - * whether it has a mapping. - * - * The Guide button may not be available for input as it is often hooked by the - * system or the Steam client. - * - * Not all devices have all the buttons or axes provided by @ref - * GLFWgamepadstate. Unavailable buttons and axes will always report - * `GLFW_RELEASE` and 0.0 respectively. - * - * @param[in] jid The [joystick](@ref joysticks) to query. - * @param[out] state The gamepad input state of the joystick. - * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if no joystick is - * connected, it has no gamepad mapping or an [error](@ref error_handling) - * occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_INVALID_ENUM. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref gamepad - * @sa @ref glfwUpdateGamepadMappings - * @sa @ref glfwJoystickIsGamepad - * - * @since Added in version 3.3. - * - * @ingroup input - */ -GLFWAPI int glfwGetGamepadState(int jid, GLFWgamepadstate* state); - -/*! @brief Sets the clipboard to the specified string. - * - * This function sets the system clipboard to the specified, UTF-8 encoded - * string. - * - * @param[in] window Deprecated. Any valid window or `NULL`. - * @param[in] string A UTF-8 encoded string. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The specified string is copied before this function - * returns. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref clipboard - * @sa @ref glfwGetClipboardString - * - * @since Added in version 3.0. - * - * @ingroup input - */ -GLFWAPI void glfwSetClipboardString(GLFWwindow* window, const char* string); - -/*! @brief Returns the contents of the clipboard as a string. - * - * This function returns the contents of the system clipboard, if it contains - * or is convertible to a UTF-8 encoded string. If the clipboard is empty or - * if its contents cannot be converted, `NULL` is returned and a @ref - * GLFW_FORMAT_UNAVAILABLE error is generated. - * - * @param[in] window Deprecated. Any valid window or `NULL`. - * @return The contents of the clipboard as a UTF-8 encoded string, or `NULL` - * if an [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The returned string is allocated and freed by GLFW. You - * should not free it yourself. It is valid until the next call to @ref - * glfwGetClipboardString or @ref glfwSetClipboardString, or until the library - * is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref clipboard - * @sa @ref glfwSetClipboardString - * - * @since Added in version 3.0. - * - * @ingroup input - */ -GLFWAPI const char* glfwGetClipboardString(GLFWwindow* window); - -/*! @brief Returns the value of the GLFW timer. - * - * This function returns the value of the GLFW timer. Unless the timer has - * been set using @ref glfwSetTime, the timer measures time elapsed since GLFW - * was initialized. - * - * The resolution of the timer is system dependent, but is usually on the order - * of a few micro- or nanoseconds. It uses the highest-resolution monotonic - * time source on each supported platform. - * - * @return The current value, in seconds, or zero if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. Reading and - * writing of the internal timer offset is not atomic, so it needs to be - * externally synchronized with calls to @ref glfwSetTime. - * - * @sa @ref time - * - * @since Added in version 1.0. - * - * @ingroup input - */ -GLFWAPI double glfwGetTime(void); - -/*! @brief Sets the GLFW timer. - * - * This function sets the value of the GLFW timer. It then continues to count - * up from that value. The value must be a positive finite number less than - * or equal to 18446744073.0, which is approximately 584.5 years. - * - * @param[in] time The new value, in seconds. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_INVALID_VALUE. - * - * @remark The upper limit of the timer is calculated as - * floor((264 - 1) / 109) and is due to implementations - * storing nanoseconds in 64 bits. The limit may be increased in the future. - * - * @thread_safety This function may be called from any thread. Reading and - * writing of the internal timer offset is not atomic, so it needs to be - * externally synchronized with calls to @ref glfwGetTime. - * - * @sa @ref time - * - * @since Added in version 2.2. - * - * @ingroup input - */ -GLFWAPI void glfwSetTime(double time); - -/*! @brief Returns the current value of the raw timer. - * - * This function returns the current value of the raw timer, measured in - * 1 / frequency seconds. To get the frequency, call @ref - * glfwGetTimerFrequency. - * - * @return The value of the timer, or zero if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref time - * @sa @ref glfwGetTimerFrequency - * - * @since Added in version 3.2. - * - * @ingroup input - */ -GLFWAPI uint64_t glfwGetTimerValue(void); - -/*! @brief Returns the frequency, in Hz, of the raw timer. - * - * This function returns the frequency, in Hz, of the raw timer. - * - * @return The frequency of the timer, in Hz, or zero if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref time - * @sa @ref glfwGetTimerValue - * - * @since Added in version 3.2. - * - * @ingroup input - */ -GLFWAPI uint64_t glfwGetTimerFrequency(void); - -/*! @brief Makes the context of the specified window current for the calling - * thread. - * - * This function makes the OpenGL or OpenGL ES context of the specified window - * current on the calling thread. A context must only be made current on - * a single thread at a time and each thread can have only a single current - * context at a time. - * - * When moving a context between threads, you must make it non-current on the - * old thread before making it current on the new one. - * - * By default, making a context non-current implicitly forces a pipeline flush. - * On machines that support `GL_KHR_context_flush_control`, you can control - * whether a context performs this flush by setting the - * [GLFW_CONTEXT_RELEASE_BEHAVIOR](@ref GLFW_CONTEXT_RELEASE_BEHAVIOR_hint) - * hint. - * - * The specified window must have an OpenGL or OpenGL ES context. Specifying - * a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT - * error. - * - * @param[in] window The window whose context to make current, or `NULL` to - * detach the current context. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref context_current - * @sa @ref glfwGetCurrentContext - * - * @since Added in version 3.0. - * - * @ingroup context - */ -GLFWAPI void glfwMakeContextCurrent(GLFWwindow* window); - -/*! @brief Returns the window whose context is current on the calling thread. - * - * This function returns the window whose OpenGL or OpenGL ES context is - * current on the calling thread. - * - * @return The window whose context is current, or `NULL` if no window's - * context is current. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref context_current - * @sa @ref glfwMakeContextCurrent - * - * @since Added in version 3.0. - * - * @ingroup context - */ -GLFWAPI GLFWwindow* glfwGetCurrentContext(void); - -/*! @brief Swaps the front and back buffers of the specified window. - * - * This function swaps the front and back buffers of the specified window when - * rendering with OpenGL or OpenGL ES. If the swap interval is greater than - * zero, the GPU driver waits the specified number of screen updates before - * swapping the buffers. - * - * The specified window must have an OpenGL or OpenGL ES context. Specifying - * a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT - * error. - * - * This function does not apply to Vulkan. If you are rendering with Vulkan, - * see `vkQueuePresentKHR` instead. - * - * @param[in] window The window whose buffers to swap. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR. - * - * @remark __EGL:__ The context of the specified window must be current on the - * calling thread. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref buffer_swap - * @sa @ref glfwSwapInterval - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwSwapBuffers(GLFWwindow* window); - -/*! @brief Sets the swap interval for the current context. - * - * This function sets the swap interval for the current OpenGL or OpenGL ES - * context, i.e. the number of screen updates to wait from the time @ref - * glfwSwapBuffers was called before swapping the buffers and returning. This - * is sometimes called _vertical synchronization_, _vertical retrace - * synchronization_ or just _vsync_. - * - * A context that supports either of the `WGL_EXT_swap_control_tear` and - * `GLX_EXT_swap_control_tear` extensions also accepts _negative_ swap - * intervals, which allows the driver to swap immediately even if a frame - * arrives a little bit late. You can check for these extensions with @ref - * glfwExtensionSupported. - * - * A context must be current on the calling thread. Calling this function - * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. - * - * This function does not apply to Vulkan. If you are rendering with Vulkan, - * see the present mode of your swapchain instead. - * - * @param[in] interval The minimum number of screen updates to wait for - * until the buffers are swapped by @ref glfwSwapBuffers. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_NO_CURRENT_CONTEXT and @ref GLFW_PLATFORM_ERROR. - * - * @remark This function is not called during context creation, leaving the - * swap interval set to whatever is the default on that platform. This is done - * because some swap interval extensions used by GLFW do not allow the swap - * interval to be reset to zero once it has been set to a non-zero value. - * - * @remark Some GPU drivers do not honor the requested swap interval, either - * because of a user setting that overrides the application's request or due to - * bugs in the driver. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref buffer_swap - * @sa @ref glfwSwapBuffers - * - * @since Added in version 1.0. - * - * @ingroup context - */ -GLFWAPI void glfwSwapInterval(int interval); - -/*! @brief Returns whether the specified extension is available. - * - * This function returns whether the specified - * [API extension](@ref context_glext) is supported by the current OpenGL or - * OpenGL ES context. It searches both for client API extension and context - * creation API extensions. - * - * A context must be current on the calling thread. Calling this function - * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. - * - * As this functions retrieves and searches one or more extension strings each - * call, it is recommended that you cache its results if it is going to be used - * frequently. The extension strings will not change during the lifetime of - * a context, so there is no danger in doing this. - * - * This function does not apply to Vulkan. If you are using Vulkan, see @ref - * glfwGetRequiredInstanceExtensions, `vkEnumerateInstanceExtensionProperties` - * and `vkEnumerateDeviceExtensionProperties` instead. - * - * @param[in] extension The ASCII encoded name of the extension. - * @return `GLFW_TRUE` if the extension is available, or `GLFW_FALSE` - * otherwise. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_NO_CURRENT_CONTEXT, @ref GLFW_INVALID_VALUE and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref context_glext - * @sa @ref glfwGetProcAddress - * - * @since Added in version 1.0. - * - * @ingroup context - */ -GLFWAPI int glfwExtensionSupported(const char* extension); - -/*! @brief Returns the address of the specified function for the current - * context. - * - * This function returns the address of the specified OpenGL or OpenGL ES - * [core or extension function](@ref context_glext), if it is supported - * by the current context. - * - * A context must be current on the calling thread. Calling this function - * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. - * - * This function does not apply to Vulkan. If you are rendering with Vulkan, - * see @ref glfwGetInstanceProcAddress, `vkGetInstanceProcAddr` and - * `vkGetDeviceProcAddr` instead. - * - * @param[in] procname The ASCII encoded name of the function. - * @return The address of the function, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_NO_CURRENT_CONTEXT and @ref GLFW_PLATFORM_ERROR. - * - * @remark The address of a given function is not guaranteed to be the same - * between contexts. - * - * @remark This function may return a non-`NULL` address despite the - * associated version or extension not being available. Always check the - * context version or extension string first. - * - * @pointer_lifetime The returned function pointer is valid until the context - * is destroyed or the library is terminated. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref context_glext - * @sa @ref glfwExtensionSupported - * - * @since Added in version 1.0. - * - * @ingroup context - */ -GLFWAPI GLFWglproc glfwGetProcAddress(const char* procname); - -/*! @brief Returns whether the Vulkan loader and an ICD have been found. - * - * This function returns whether the Vulkan loader and any minimally functional - * ICD have been found. - * - * The availability of a Vulkan loader and even an ICD does not by itself - * guarantee that surface creation or even instance creation is possible. - * For example, on Fermi systems Nvidia will install an ICD that provides no - * actual Vulkan support. Call @ref glfwGetRequiredInstanceExtensions to check - * whether the extensions necessary for Vulkan surface creation are available - * and @ref glfwGetPhysicalDevicePresentationSupport to check whether a queue - * family of a physical device supports image presentation. - * - * @return `GLFW_TRUE` if Vulkan is minimally available, or `GLFW_FALSE` - * otherwise. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref vulkan_support - * - * @since Added in version 3.2. - * - * @ingroup vulkan - */ -GLFWAPI int glfwVulkanSupported(void); - -/*! @brief Returns the Vulkan instance extensions required by GLFW. - * - * This function returns an array of names of Vulkan instance extensions required - * by GLFW for creating Vulkan surfaces for GLFW windows. If successful, the - * list will always contains `VK_KHR_surface`, so if you don't require any - * additional extensions you can pass this list directly to the - * `VkInstanceCreateInfo` struct. - * - * If Vulkan is not available on the machine, this function returns `NULL` and - * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported - * to check whether Vulkan is at least minimally available. - * - * If Vulkan is available but no set of extensions allowing window surface - * creation was found, this function returns `NULL`. You may still use Vulkan - * for off-screen rendering and compute work. - * - * @param[out] count Where to store the number of extensions in the returned - * array. This is set to zero if an error occurred. - * @return An array of ASCII encoded extension names, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_API_UNAVAILABLE. - * - * @remark Additional extensions may be required by future versions of GLFW. - * You should check if any extensions you wish to enable are already in the - * returned array, as it is an error to specify an extension more than once in - * the `VkInstanceCreateInfo` struct. - * - * @remark @macos This function currently only supports the - * `VK_MVK_macos_surface` extension from MoltenVK. - * - * @pointer_lifetime The returned array is allocated and freed by GLFW. You - * should not free it yourself. It is guaranteed to be valid only until the - * library is terminated. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref vulkan_ext - * @sa @ref glfwCreateWindowSurface - * - * @since Added in version 3.2. - * - * @ingroup vulkan - */ -GLFWAPI const char** glfwGetRequiredInstanceExtensions(uint32_t* count); - -#if defined(VK_VERSION_1_0) - -/*! @brief Returns the address of the specified Vulkan instance function. - * - * This function returns the address of the specified Vulkan core or extension - * function for the specified instance. If instance is set to `NULL` it can - * return any function exported from the Vulkan loader, including at least the - * following functions: - * - * - `vkEnumerateInstanceExtensionProperties` - * - `vkEnumerateInstanceLayerProperties` - * - `vkCreateInstance` - * - `vkGetInstanceProcAddr` - * - * If Vulkan is not available on the machine, this function returns `NULL` and - * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported - * to check whether Vulkan is at least minimally available. - * - * This function is equivalent to calling `vkGetInstanceProcAddr` with - * a platform-specific query of the Vulkan loader as a fallback. - * - * @param[in] instance The Vulkan instance to query, or `NULL` to retrieve - * functions related to instance creation. - * @param[in] procname The ASCII encoded name of the function. - * @return The address of the function, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_API_UNAVAILABLE. - * - * @pointer_lifetime The returned function pointer is valid until the library - * is terminated. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref vulkan_proc - * - * @since Added in version 3.2. - * - * @ingroup vulkan - */ -GLFWAPI GLFWvkproc glfwGetInstanceProcAddress(VkInstance instance, const char* procname); - -/*! @brief Returns whether the specified queue family can present images. - * - * This function returns whether the specified queue family of the specified - * physical device supports presentation to the platform GLFW was built for. - * - * If Vulkan or the required window surface creation instance extensions are - * not available on the machine, or if the specified instance was not created - * with the required extensions, this function returns `GLFW_FALSE` and - * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported - * to check whether Vulkan is at least minimally available and @ref - * glfwGetRequiredInstanceExtensions to check what instance extensions are - * required. - * - * @param[in] instance The instance that the physical device belongs to. - * @param[in] device The physical device that the queue family belongs to. - * @param[in] queuefamily The index of the queue family to query. - * @return `GLFW_TRUE` if the queue family supports presentation, or - * `GLFW_FALSE` otherwise. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_API_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR. - * - * @remark @macos This function currently always returns `GLFW_TRUE`, as the - * `VK_MVK_macos_surface` extension does not provide - * a `vkGetPhysicalDevice*PresentationSupport` type function. - * - * @thread_safety This function may be called from any thread. For - * synchronization details of Vulkan objects, see the Vulkan specification. - * - * @sa @ref vulkan_present - * - * @since Added in version 3.2. - * - * @ingroup vulkan - */ -GLFWAPI int glfwGetPhysicalDevicePresentationSupport(VkInstance instance, VkPhysicalDevice device, uint32_t queuefamily); - -/*! @brief Creates a Vulkan surface for the specified window. - * - * This function creates a Vulkan surface for the specified window. - * - * If the Vulkan loader or at least one minimally functional ICD were not found, - * this function returns `VK_ERROR_INITIALIZATION_FAILED` and generates a @ref - * GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported to check whether - * Vulkan is at least minimally available. - * - * If the required window surface creation instance extensions are not - * available or if the specified instance was not created with these extensions - * enabled, this function returns `VK_ERROR_EXTENSION_NOT_PRESENT` and - * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref - * glfwGetRequiredInstanceExtensions to check what instance extensions are - * required. - * - * The window surface cannot be shared with another API so the window must - * have been created with the [client api hint](@ref GLFW_CLIENT_API_attrib) - * set to `GLFW_NO_API` otherwise it generates a @ref GLFW_INVALID_VALUE error - * and returns `VK_ERROR_NATIVE_WINDOW_IN_USE_KHR`. - * - * The window surface must be destroyed before the specified Vulkan instance. - * It is the responsibility of the caller to destroy the window surface. GLFW - * does not destroy it for you. Call `vkDestroySurfaceKHR` to destroy the - * surface. - * - * @param[in] instance The Vulkan instance to create the surface in. - * @param[in] window The window to create the surface for. - * @param[in] allocator The allocator to use, or `NULL` to use the default - * allocator. - * @param[out] surface Where to store the handle of the surface. This is set - * to `VK_NULL_HANDLE` if an error occurred. - * @return `VK_SUCCESS` if successful, or a Vulkan error code if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_API_UNAVAILABLE, @ref GLFW_PLATFORM_ERROR and @ref GLFW_INVALID_VALUE - * - * @remark If an error occurs before the creation call is made, GLFW returns - * the Vulkan error code most appropriate for the error. Appropriate use of - * @ref glfwVulkanSupported and @ref glfwGetRequiredInstanceExtensions should - * eliminate almost all occurrences of these errors. - * - * @remark @macos This function currently only supports the - * `VK_MVK_macos_surface` extension from MoltenVK. - * - * @remark @macos This function creates and sets a `CAMetalLayer` instance for - * the window content view, which is required for MoltenVK to function. - * - * @thread_safety This function may be called from any thread. For - * synchronization details of Vulkan objects, see the Vulkan specification. - * - * @sa @ref vulkan_surface - * @sa @ref glfwGetRequiredInstanceExtensions - * - * @since Added in version 3.2. - * - * @ingroup vulkan - */ -GLFWAPI VkResult glfwCreateWindowSurface(VkInstance instance, GLFWwindow* window, const VkAllocationCallbacks* allocator, VkSurfaceKHR* surface); - -#endif /*VK_VERSION_1_0*/ - - -/************************************************************************* - * Global definition cleanup - *************************************************************************/ - -/* ------------------- BEGIN SYSTEM/COMPILER SPECIFIC -------------------- */ - -#ifdef GLFW_WINGDIAPI_DEFINED - #undef WINGDIAPI - #undef GLFW_WINGDIAPI_DEFINED -#endif - -#ifdef GLFW_CALLBACK_DEFINED - #undef CALLBACK - #undef GLFW_CALLBACK_DEFINED -#endif - -/* Some OpenGL related headers need GLAPIENTRY, but it is unconditionally - * defined by some gl.h variants (OpenBSD) so define it after if needed. - */ -#ifndef GLAPIENTRY - #define GLAPIENTRY APIENTRY -#endif - -/* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */ - - -#ifdef __cplusplus -} -#endif - -#endif /* _glfw3_h_ */ - diff --git a/thirdparty/glfw/GLFW/glfw3native.h b/thirdparty/glfw/GLFW/glfw3native.h deleted file mode 100644 index 267e75ca9e..0000000000 --- a/thirdparty/glfw/GLFW/glfw3native.h +++ /dev/null @@ -1,525 +0,0 @@ -/************************************************************************* - * GLFW 3.3 - www.glfw.org - * A library for OpenGL, window and input - *------------------------------------------------------------------------ - * Copyright (c) 2002-2006 Marcus Geelnard - * Copyright (c) 2006-2018 Camilla Löwy - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would - * be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and must not - * be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - * - *************************************************************************/ - -#ifndef _glfw3_native_h_ -#define _glfw3_native_h_ - -#ifdef __cplusplus -extern "C" { -#endif - - -/************************************************************************* - * Doxygen documentation - *************************************************************************/ - -/*! @file glfw3native.h - * @brief The header of the native access functions. - * - * This is the header file of the native access functions. See @ref native for - * more information. - */ -/*! @defgroup native Native access - * @brief Functions related to accessing native handles. - * - * **By using the native access functions you assert that you know what you're - * doing and how to fix problems caused by using them. If you don't, you - * shouldn't be using them.** - * - * Before the inclusion of @ref glfw3native.h, you may define zero or more - * window system API macro and zero or more context creation API macros. - * - * The chosen backends must match those the library was compiled for. Failure - * to do this will cause a link-time error. - * - * The available window API macros are: - * * `GLFW_EXPOSE_NATIVE_WIN32` - * * `GLFW_EXPOSE_NATIVE_COCOA` - * * `GLFW_EXPOSE_NATIVE_X11` - * * `GLFW_EXPOSE_NATIVE_WAYLAND` - * - * The available context API macros are: - * * `GLFW_EXPOSE_NATIVE_WGL` - * * `GLFW_EXPOSE_NATIVE_NSGL` - * * `GLFW_EXPOSE_NATIVE_GLX` - * * `GLFW_EXPOSE_NATIVE_EGL` - * * `GLFW_EXPOSE_NATIVE_OSMESA` - * - * These macros select which of the native access functions that are declared - * and which platform-specific headers to include. It is then up your (by - * definition platform-specific) code to handle which of these should be - * defined. - */ - - -/************************************************************************* - * System headers and types - *************************************************************************/ - -#if defined(GLFW_EXPOSE_NATIVE_WIN32) || defined(GLFW_EXPOSE_NATIVE_WGL) - // This is a workaround for the fact that glfw3.h needs to export APIENTRY (for - // example to allow applications to correctly declare a GL_ARB_debug_output - // callback) but windows.h assumes no one will define APIENTRY before it does - #if defined(GLFW_APIENTRY_DEFINED) - #undef APIENTRY - #undef GLFW_APIENTRY_DEFINED - #endif - #include -#elif defined(GLFW_EXPOSE_NATIVE_COCOA) || defined(GLFW_EXPOSE_NATIVE_NSGL) - #if defined(__OBJC__) - #import - #else - #include - typedef void* id; - #endif -#elif defined(GLFW_EXPOSE_NATIVE_X11) || defined(GLFW_EXPOSE_NATIVE_GLX) - #include - #include -#elif defined(GLFW_EXPOSE_NATIVE_WAYLAND) - #include -#endif - -#if defined(GLFW_EXPOSE_NATIVE_WGL) - /* WGL is declared by windows.h */ -#endif -#if defined(GLFW_EXPOSE_NATIVE_NSGL) - /* NSGL is declared by Cocoa.h */ -#endif -#if defined(GLFW_EXPOSE_NATIVE_GLX) - #include -#endif -#if defined(GLFW_EXPOSE_NATIVE_EGL) - #include -#endif -#if defined(GLFW_EXPOSE_NATIVE_OSMESA) - #include -#endif - - -/************************************************************************* - * Functions - *************************************************************************/ - -#if defined(GLFW_EXPOSE_NATIVE_WIN32) -/*! @brief Returns the adapter device name of the specified monitor. - * - * @return The UTF-8 encoded adapter device name (for example `\\.\DISPLAY1`) - * of the specified monitor, or `NULL` if an [error](@ref error_handling) - * occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.1. - * - * @ingroup native - */ -GLFWAPI const char* glfwGetWin32Adapter(GLFWmonitor* monitor); - -/*! @brief Returns the display device name of the specified monitor. - * - * @return The UTF-8 encoded display device name (for example - * `\\.\DISPLAY1\Monitor0`) of the specified monitor, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.1. - * - * @ingroup native - */ -GLFWAPI const char* glfwGetWin32Monitor(GLFWmonitor* monitor); - -/*! @brief Returns the `HWND` of the specified window. - * - * @return The `HWND` of the specified window, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.0. - * - * @ingroup native - */ -GLFWAPI HWND glfwGetWin32Window(GLFWwindow* window); -#endif - -#if defined(GLFW_EXPOSE_NATIVE_WGL) -/*! @brief Returns the `HGLRC` of the specified window. - * - * @return The `HGLRC` of the specified window, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.0. - * - * @ingroup native - */ -GLFWAPI HGLRC glfwGetWGLContext(GLFWwindow* window); -#endif - -#if defined(GLFW_EXPOSE_NATIVE_COCOA) -/*! @brief Returns the `CGDirectDisplayID` of the specified monitor. - * - * @return The `CGDirectDisplayID` of the specified monitor, or - * `kCGNullDirectDisplay` if an [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.1. - * - * @ingroup native - */ -GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* monitor); - -/*! @brief Returns the `NSWindow` of the specified window. - * - * @return The `NSWindow` of the specified window, or `nil` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.0. - * - * @ingroup native - */ -GLFWAPI id glfwGetCocoaWindow(GLFWwindow* window); -#endif - -#if defined(GLFW_EXPOSE_NATIVE_NSGL) -/*! @brief Returns the `NSOpenGLContext` of the specified window. - * - * @return The `NSOpenGLContext` of the specified window, or `nil` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.0. - * - * @ingroup native - */ -GLFWAPI id glfwGetNSGLContext(GLFWwindow* window); -#endif - -#if defined(GLFW_EXPOSE_NATIVE_X11) -/*! @brief Returns the `Display` used by GLFW. - * - * @return The `Display` used by GLFW, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.0. - * - * @ingroup native - */ -GLFWAPI Display* glfwGetX11Display(void); - -/*! @brief Returns the `RRCrtc` of the specified monitor. - * - * @return The `RRCrtc` of the specified monitor, or `None` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.1. - * - * @ingroup native - */ -GLFWAPI RRCrtc glfwGetX11Adapter(GLFWmonitor* monitor); - -/*! @brief Returns the `RROutput` of the specified monitor. - * - * @return The `RROutput` of the specified monitor, or `None` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.1. - * - * @ingroup native - */ -GLFWAPI RROutput glfwGetX11Monitor(GLFWmonitor* monitor); - -/*! @brief Returns the `Window` of the specified window. - * - * @return The `Window` of the specified window, or `None` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.0. - * - * @ingroup native - */ -GLFWAPI Window glfwGetX11Window(GLFWwindow* window); - -/*! @brief Sets the current primary selection to the specified string. - * - * @param[in] string A UTF-8 encoded string. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The specified string is copied before this function - * returns. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref clipboard - * @sa glfwGetX11SelectionString - * @sa glfwSetClipboardString - * - * @since Added in version 3.3. - * - * @ingroup native - */ -GLFWAPI void glfwSetX11SelectionString(const char* string); - -/*! @brief Returns the contents of the current primary selection as a string. - * - * If the selection is empty or if its contents cannot be converted, `NULL` - * is returned and a @ref GLFW_FORMAT_UNAVAILABLE error is generated. - * - * @return The contents of the selection as a UTF-8 encoded string, or `NULL` - * if an [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The returned string is allocated and freed by GLFW. You - * should not free it yourself. It is valid until the next call to @ref - * glfwGetX11SelectionString or @ref glfwSetX11SelectionString, or until the - * library is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref clipboard - * @sa glfwSetX11SelectionString - * @sa glfwGetClipboardString - * - * @since Added in version 3.3. - * - * @ingroup native - */ -GLFWAPI const char* glfwGetX11SelectionString(void); -#endif - -#if defined(GLFW_EXPOSE_NATIVE_GLX) -/*! @brief Returns the `GLXContext` of the specified window. - * - * @return The `GLXContext` of the specified window, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.0. - * - * @ingroup native - */ -GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window); - -/*! @brief Returns the `GLXWindow` of the specified window. - * - * @return The `GLXWindow` of the specified window, or `None` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.2. - * - * @ingroup native - */ -GLFWAPI GLXWindow glfwGetGLXWindow(GLFWwindow* window); -#endif - -#if defined(GLFW_EXPOSE_NATIVE_WAYLAND) -/*! @brief Returns the `struct wl_display*` used by GLFW. - * - * @return The `struct wl_display*` used by GLFW, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.2. - * - * @ingroup native - */ -GLFWAPI struct wl_display* glfwGetWaylandDisplay(void); - -/*! @brief Returns the `struct wl_output*` of the specified monitor. - * - * @return The `struct wl_output*` of the specified monitor, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.2. - * - * @ingroup native - */ -GLFWAPI struct wl_output* glfwGetWaylandMonitor(GLFWmonitor* monitor); - -/*! @brief Returns the main `struct wl_surface*` of the specified window. - * - * @return The main `struct wl_surface*` of the specified window, or `NULL` if - * an [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.2. - * - * @ingroup native - */ -GLFWAPI struct wl_surface* glfwGetWaylandWindow(GLFWwindow* window); -#endif - -#if defined(GLFW_EXPOSE_NATIVE_EGL) -/*! @brief Returns the `EGLDisplay` used by GLFW. - * - * @return The `EGLDisplay` used by GLFW, or `EGL_NO_DISPLAY` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.0. - * - * @ingroup native - */ -GLFWAPI EGLDisplay glfwGetEGLDisplay(void); - -/*! @brief Returns the `EGLContext` of the specified window. - * - * @return The `EGLContext` of the specified window, or `EGL_NO_CONTEXT` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.0. - * - * @ingroup native - */ -GLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* window); - -/*! @brief Returns the `EGLSurface` of the specified window. - * - * @return The `EGLSurface` of the specified window, or `EGL_NO_SURFACE` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.0. - * - * @ingroup native - */ -GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* window); -#endif - -#if defined(GLFW_EXPOSE_NATIVE_OSMESA) -/*! @brief Retrieves the color buffer associated with the specified window. - * - * @param[in] window The window whose color buffer to retrieve. - * @param[out] width Where to store the width of the color buffer, or `NULL`. - * @param[out] height Where to store the height of the color buffer, or `NULL`. - * @param[out] format Where to store the OSMesa pixel format of the color - * buffer, or `NULL`. - * @param[out] buffer Where to store the address of the color buffer, or - * `NULL`. - * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.3. - * - * @ingroup native - */ -GLFWAPI int glfwGetOSMesaColorBuffer(GLFWwindow* window, int* width, int* height, int* format, void** buffer); - -/*! @brief Retrieves the depth buffer associated with the specified window. - * - * @param[in] window The window whose depth buffer to retrieve. - * @param[out] width Where to store the width of the depth buffer, or `NULL`. - * @param[out] height Where to store the height of the depth buffer, or `NULL`. - * @param[out] bytesPerValue Where to store the number of bytes per depth - * buffer element, or `NULL`. - * @param[out] buffer Where to store the address of the depth buffer, or - * `NULL`. - * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.3. - * - * @ingroup native - */ -GLFWAPI int glfwGetOSMesaDepthBuffer(GLFWwindow* window, int* width, int* height, int* bytesPerValue, void** buffer); - -/*! @brief Returns the `OSMesaContext` of the specified window. - * - * @return The `OSMesaContext` of the specified window, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.3. - * - * @ingroup native - */ -GLFWAPI OSMesaContext glfwGetOSMesaContext(GLFWwindow* window); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* _glfw3_native_h_ */ - diff --git a/thirdparty/glfw/glfw3.dll b/thirdparty/glfw/glfw3.dll deleted file mode 100644 index 1ed6f46c8df70835f70bd75ef97ab09dbf7dafbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 249856 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%0DE0JD>^fIKEBmEkZ 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 diff --git a/thirdparty/glfw/msvc/glfw3.lib b/thirdparty/glfw/msvc/glfw3.lib deleted file mode 100644 index 9051189fc35395b4b2aa47b5e69379836028f6be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 646460 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

s>>ixb(|_9Upg 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%0AUJfdi*guf~p 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 b0F0Efa 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

RC>QP3CeAsi~Kone&^8e)&X;kVl zg}Sb$vxB5=z!N7&8kKq+J{I%qbP;anhL%Z^3UZ1xDzyMUat`*I_m{&%gm5~iNTX6u zFiPa8*Lu|1C#iQhMH-b_$S6?*Jb254?@Q_jPLW2Xo@A7GUUe2WYb~kfEpQQzG%EEJ zeB``n+Y1}(N~#B^NTX6uGfI@NF4w(vt)ymgiZm*emYIx->+H*$(JDz%tV zA`M#|OR6KO-#A4Ym3l^@MogV!$Wd)u;vyVrRO(sy$eD^ja9v+%>uyewMx~xpsBRxF z@JVVur%0nx&ofGtl)ndm^q!IFuLy0>une&h#{hJSF1G%B@3p%ObKmrAO0 zA}+#_Mx|bakHsu{DdXy9BDICB+(cZ2BaKSE1Rps^G;s1Qs4@lhR3a|Ikw&GK!bkRd z$3K;g?y8{nB;q0*X;kWE_*l&76f)Ph>Mso?Woo7Ql18PL!N;P{wEySQb$cY0#wpUM z)N+M-$YVMysX|VXMx|a+sI%YgIxMN@I7J$jdX-Tf%=iaxe3!jA6RB~SQ>0O;74Wf` z1vUGPg1wTeaTDFiWFn19y#^nPS+uZUUhegPq`Gm6G%7{)r=$)fbRH_HVos4prQTqa zn4f=lR*gbQE$0+zRO(HI8d$w-u%y1=6lqjyC8K`Dk=&I5+??8Pn#lA6dV(x}ubMj=Bm7j7I{EvYv-MH-cQ8$NPx zPf3>rKT7H=PLW2X-eDBI_e$>d{Jp3vs%Rff4ccfYq){mZ2)4wk*~cwA7*fN_DblFa z8b*n+L$GSoY-wu>r%0nxYZYqThHI)zY89tQqf+Y_C2G-$4Qe!!)c2esjY_RosIQLx z%oI4lHM?2+mozH10X}kV^i|6rcsMP!Lv6!hABDdqh zXZbROcXNs~DzzCt7Bl&iyZ+hh3MBO~r#9n?N^OCU?9czQ)wsUAl~bfqsjZAUh9kL* zc%P3s1&t#a$I@G@W%|T!@Zm$ zjY@sYC@~XguGwOOw6%;=q*19)7$tW1)kw{}D5+zdB8^IYs!(IU-`P@9^*Z7r9BEYQ zGx*4zgvTOFf02}nQ>0O;BMNoX&OM}9Mx{_NVCz<11GMsgVW3uWiZm+qIitj` z566bN=p2bU>c5;KjY?7dDf4`*8>;^%sT*&_ML5!^)EDrPA^fC9>OGPQbBZ)7b(~S6 zFFJ0j(y?`URx2k`1 zUQ$~)MH-d*FMKTK7jPu^_@EVaBz2xsq*1AF;bSpV|BBojA0I^|M2>3TS@R{0N___( zi}`u&vT59d;|*nbAg4&9Qr|O5w0hB}NA{Ms9_18iRO%F?e#Vhp$t%YUwm#$(X;kV5 z_{hEbRX={gP*N^)iZm*PLTI3Bq&xw$A~kNi4Hw}^qf$S?$6^+9%TGP^?jA|yaf&o5 zMKQ9N@o1SFzP#4!l6sm`q*1BU@R1|LcQ%b%AgR5aB8^J@!YI+E)ZE@5`9Z`>`z{!h zi8LzpE2G4G)W{|Mkxc}Zk%WtIq){nkafDFp@LzVcTQy0I;1p?83RMy)dLraLdp?Xv z2wN|3iZm*97Cv(S#^SFI7fb3DPLW2X&@_VDj3c?>4_1Fd zQpY((8kM>PA8G68Lw~(0sro5&CzFXZD)k3^WPRAnM=REm0QlB(6Cc#Whc zaf&o5^(Ujmh`y*fT>p-*1)Fx11u4N}*au2>0Pg?wi*29+A|I zshTfoRO%o2$b9%veACS9e>;7CbTT-hz zMH-bdGfM2nod39glB9m%6lqk7-r$gXI5Q9TvP-H(8Vk0GG%AHX4xp%vlRN2Z7?o5{ zPLW2X5*Q_F(H$qgFObwMPLW2XXb*<0dzXLoYX?bf

RCsv4ujoWoGxo?9gK8>dL4 zQq>tH_F~nWao8`Zw&_}INuyFV6zbOVThB?VKc`5eQr9p_%(Q=hY5XinJ;Eu{s1)ss zkb440w5?GlsqLI1jY`#G)Vo>)O!FJ`G~|sxI7J$js?8{|*KzcO-_S6M8oN`5b~Dnb z)U}MNiz7Mv$-yO(8pcjM2kFfP5r%0nxWJS(7ypg`)f}}p;6lqkd z9-~BG^btqR>5?*KY9SzvO3}KleDm(FdXJu$R2rv9qf)d(Pqq&4{IzGLqzXAj8kM3n zmn)CkyVk=q5~=YVr%0nxRDa4IQQ~vsK9tm9PLW2Xs60w)$FxlwBvm6zOAXSf6n%@I zO!-!SJ@K2Qx^ap$Dn;+yNov8{MIlKQbBZ)7Me9m(muctc2e**aa!!#(rD(^pw6(rY zEyMHrf>WeXDVj%>Z-4w}&{Bh~`lyG=kw&Fxgd)@MLiTScYT|jhI7J$jqOvdBl=jtK z%_Manr%0nxG~X!mM#sjD-j~!$PLW2XXx&z>1>8P%W?xDDms6xsDH_X5YI^PT?UK5& zi zMH-c&y{vK<_X`i5pCYNBIYke&yl-leN#W&EvY%2B8^JXJ{CD|^Vb<<>^(1wfQ>0NTnh%jw`Ng9c4vI9qt(%q_q){na zotGo2cInS=mQ)_6NTX6TJ0w#+Y0}J*EoA#RMH-c&{-niB zeI9bb^>#yQSnkk#NuyHq9)ZQYR=aGPymzai-drHtg3hGl%kw&F58ATx{S1<61p;XpF9LbSJ zrD#4xuFxe<-t(EX)tytMQK@W3iT+{LlOsn+s)SRdQK>GBqP_vS)o-mq-7ezwDyK-J zQe7EE{VQ_+sd*q@QpY((8kM?Tp~fzI$}g$wtn5}M(x_B7Mp0`>u2qZXhJLTd$~;Y^ zQK>r^CHnI#{=RdFv^AMiq*1Bvj1u|qu|fC#BdNDIMH-c|GK$(za^2li4oK=-EAupw zMx|^DHDG9CLw}=*O`}MoQg%jByGCy1-a8Hb!w9EHqf!n=i4flW=73LS2+KG{8kKS~ zirQ;(FTVJAOG&Nc6lqk-#VBEGYh=L+NuA~tX;jLsP)C-pHq3q9WY0NTAEQLdC+-|%XwA29iZm+aSE$qZ2OgBRE^vx8 zDiu&DThl{^I;taDKysu}sh~o6I$rrw+8V+s(x_BOp{hme4wKXqoFa`%g%zsprLl$_ zwVP9RCs)s`5 zy#3|_l6sC)q*1A!jJl`=#q`0#$(JQ{m{X)tsa}j)%Be-SuQJSUR7XxGM;ev7i&4}o zBiFS>KZC8VoFa`%^=1_HY{_Me7_wJ}a15tNqf&hsMg4qoKVKPz{!A6^gXv{Xkw&HZ zGD?(`e#3_}kksd#B8^J*W0a^j>`M-wkW^i_W|TB4b+B8^H7WYqJVI^NAaPf}lViZm)Uh*8Tpb=lK; zm!ukbG;h+V)L=$YAC=rh=g)=~*3T)@sMHWfQ6H7uEyX8BN?TJnMH-dLVN^{{O}g`8 zLu#zz6lqjyD5Hd}#x>eup+@AW?>R*pmC9uljbF%JJ{~aCY|Su#PL4DxmB%QN8lNuv zV9Ms5wCYSMH-bF#wZ$zkgJxy z$&iL;I7J$j8qTQJoVvG7gM4Z0W}kL1(x_A+qeRO4X4ZXQQg?HTG%9ruqeKXo{oTee zJ2#(Gq*196j1oQbd#5BBTG$UbMH-bF$tdbYlNg=Nl`2+j)lJzwTT-b3mKY||sMJ_SiSo7a^A)#9Y8ao_kk5DXFfUB8^H-U{o5XKHNL%J4ub<6lqjyBBMHRs(#09b0oEtQ>0O;`xuqQ zsd-KR=q#zDoFa`%O=6U2iK1hM-Y=;-m?I@e8kL&NsIA&%)6g#UJ4wpUDblFa6h?`5 zxp#{y=;nyrJC0MNQK_knYKSAbb0>2!V<4#4I7J$jn#QQ| za-*8sY?6ALQ>0O;2NmkvxAS{T>J+C)qf#>%CGz~5AvKOls(C~U0clifreZ5&OK-z` zZx2q9Mx|ycw(g12K0xu5XK{)&Dm9x?NjQ?rYqIfPNp0j5X;f+sqeS~P%+YJEq<-TR zX;kVVMv0av=h=6El2qHM76Q_!R5_zW-ncR^aD$}!bBZ)7HJ4ExaU|Dv*u^H2n$IcH zsMI`0eWpRCe-0a4hi#l9jY>VtC{bhA9zM3Cv~`hFq*1B)jH-ttxjvudd?Tq_@6>!r zqf(DBssX2}&!}g3UOAj1jY>VLP+K3~@`ALrkW-{lsmB!RmAs-$lKO~Kq*1BI86{G~ z^L|cqNtt?R@gj{%Enw6^?Xv08niv0;R63_fqf$>OwqDm0HB87C4eidpR*dQbn91jY=(MR5MO};NALzq?U4uG%EEBqeLHI+5<1I zlGIU7kw&GSRj9&uXUvdPonBhFNuyHFF-p_`hc^7vLQ)P+kw&GSXOw6w?;LW-5U=r^ zB8^JDz^IlulG`w%%K>TYbxx566#aHjn^B`lw}eqOa7N(a=#4gwGHPCA8v2!}bZ9z$ zHZfOI8#OO64JtV1Tsha_xzinunx%?nVVj50ro?JqW*VC8pexa9Uqc@@t~uF?eoGEsN*cbwG&C-wxcye6)r*>j zz5>~Y9~y$E=~Z(gvtlxR#h?4@y3eoNXNB(b7x!7N`_#J2#M~>oPa^kOru%f_KCkIM zcJ5;`3G4mhd`86iOo{V(Quoo)3TrZPJ}Y$}VQWjA&yhHv3voX6&==C2xKGD8AA6k7 z-Elsn<9r^7^I06{vpUXaPn^%U+~-9-ozKT1IA@N!*9(ALb(<6V(#cOr0ml@9TaOJ{B|8W8@BIZ?F5RnMxzMH+guN#?*O?q*gMj zHZ&|Q9e&T1)cc%b8pYOs7}c0lXNPupMpFAZ#Waeow-j5Y`@Z`{QeSb3X%t(l6kFw= zzLh7bbDUxt#n#)3t;}2gTq>!m=#!IU8pYN-j1p=1(kn-QU#6$w4V+>c#nx)Y);(WU zn=7eXImI-Jtu>5lh;ZP<^xc^uZC})FSvkctimkPZttmbC&X81JPBD#QYn^V3p7Oiz zoye6`5vQ0&v9(^Y6&OGIK}pT#6w@fSHYm1kY(4dENiE?N(^mo^4V+>c z#nwhf)kB;pUdx}&?k1_joMIZq)_aPrcfX%=NK!v@ifI&En-p7*u3vP!q^kCVc{rv~ zY`w48n$u!Q3rV%$6w@fSHZ#hY4`0^vMkc42MzOU;v30|q&)$$!kW);f*xIVtqI%;E z-PRCJF^yttn_?^Fx`(cpR57QRMzQq)qZ%Wn=y`qgZQCl6D&rK>D7LmMwgyjm5DRV_F-1?t{-MG$qt0wJ5(Ov4>f2!#K<=xvJbRT2p*G5h!w` zQTy|I8HGtG<}M#TGec5aIYk?b~*j)J9H`Mx_oj z3Xh4oNx!(~OX@tQNTX68GfJf4f|-90lT@bx+Pz4lQlBW)(3$lnODdmJq*19)8P$Y` za7WhR*Cq8Fr%0nxpE2r2PW7EsoG+;ZoFa{udo2UG5dTy$4K5g2QaTnt?8+VPoI8BP z*o-vx`3Sr7X7Nyk$aFpK!G34OnO~4oI zfXnIe=ulQcQa-7YjffF)gsmQ*%M}VmW!j~tCBqmjWh7~#qz?wjAF+DvL6v+HZwt7i4jsxEnw+NHJDo*MJ2ynh9<;jL_K4qa3rZ-XAd?A= zh#_=#hudoR*_@6@SU#k@tYj@a4COYoe`N6NUaKqM_BxR0x~2RqEh-sF=@q7f9l`TQ zLOz>27}lZm{3I5qto)=36C&!hdY#dLE8>!dQZkZQ=E;IHginUf;jsD~4tvOB3+aY( zQj;=BoRU(&{^g*AY%XimjqurgG95Crc{(JEg2FHf*&|j2&g~2vGErKA7NwNbp}cg( zKsJZf8TL86ZkNoiA`>MgSDcCLPMg&cin!gbuza>jc}WFy@2pCnt>5Z#+8t59Pg>F; zo|jnQ3>hNgwYnqGfG-jW=!vH@#`IPhB!fTfbXH(T%YNL9%&ifp)e{MZZODIm;_~>U zREF5B_GrlA388Mt%*x2l$j?m5OwUZyd11s5G|F|sKok{<-=-VN6qS!LD;S`N-Rh*U z`GT?%61grVBgL59GA}q>R&UVba|FXO;Y5X!l$UC(S#=0Cm(vv`TM<2QsOz*xBTBm# zE1jVj*==@zB;uAeR{@-iy?$nZqSk208MHg>vKC59Pv$w)7&!TeAhtT3;b_F|mzMOL znp$y*rJNcF`Ga=5Us@6wC`}}MOq?QqYa|l%dV*+Y#M4A2q@_bvMuk;_9hFcp;Es5M zVV4dGL+NU27}5cd!y5_u4B0`4Smhs|c#)7bYKyvjPM6FMf>BG6G3{Jdf7oI7hHWzK z1e8&UAv^L=FcS8LLKQ?Qqms;O=hdCth1y6Yp0Jc(nI(JF8uIz04xcB!{H1A?zeor@ z@z9KiQPTz74w=JI82B?yHkMkQ2?nhJ9+yj2-~v+ex1pe;C2|FwUb`(UD~GI9t>=)T2(w9zW?Dl}w<3d-+gIx+6Su#}u?tW*>z z;qgO{9DF@#6zMwDEEV0=1cB~@YxkjESLM1yXbA#_Vgm01c{-FCY#=nPhn z5b2dXCh8Lg9H9_WLeCJwQfg)WI|MIivxgBUne_yeTqzW_2Ez70G!&LuPe55oS(Ow) zzt!)wp;PFPHNU7IQj?Y5vHqMwHfu2I^>{ooaC#+~%m*?t84sO&m)+?Oc-*q2i#|$P zTC%a%rJJ!kJyyTh=JU7=Lj)a4tr&{>hzX!SBx`-WHWqbEOyKNDZl^u$^dS!HwlFY;`znew*LWR*2AHfK_3Xg6OV#d~S4ZWHR8nXxilb3cFoMZI{Cl3L^dV zzzxmQ25`ygN<(HyI>adAL}L+dVfM zc(TePG8m$sgWK=(qr)MazdYXC%E-%Q!&?4y4VEHSXE1E{Iy^FX!cu0sF*g_!&tY}= zL*YQgBhw+DH?-LpF;?js4mm?f?$W~M42Lob^6QD3gnQp&fbfrT|=#0TbhVVN> zVTVWd9rWR4Wmz0uC|?Ab&*qWYH7%ES9J&*j8WOE7piylP6Xbi=(KJ8B_AmsK#y8I>?$ zD+ZC8vmlkBN`Z8VPtjHh0L-y6}l1 zbnhx|o1G!dTX_Oen<1;}flEm-W>!6Lc4rutXv8RUs?H=;!r0tsU!q}DcZSfVB#Tm4 zu^}6JP$+s4M^HA+VpyRhwvy{S)_^182}j*B0|_Y0nCD_33^HBLuwB+&I%KSbVxUL_ z#R%PM{V543<9}H4JAEE|z%V1JLzP*=%uvAQ^aQ*}dXXOlWE}G#N65!y3s|FQ(p^Ds zd_w5+rdsxs5SkcoB<#Y(Q2a6IizFk*E%9X@o`WdBpN z&Xqme044)`Zg<#k9Gi*~Ys^B1WI+3hiY{RHAgk+1$C(19BpH&<5wV6n7?q*w(jk5B zGZ|5n&X5Wi&!Pkd9WsZD0akK;Wdp3JH5d;1F-I*sHe&WJDb;Al5IW4C*fB5b3ZXA0 zq9i64lXD70nW8W%q4P#VzK{zgF&0Wmtz$&uj1nS- z%1Z<1`7qUg|f%wEjJ0^lh7G;#sh4cq)UKb{3^%U2Gmt1l1f^JOAy8YgeVO)Wm zvPYVdm2E6bx*;$Qe;|S-0a*=Y59J*^V`fkS=eGJh9)HBMX=~oadvQ{zH@j`dl`BTeEK{&y^`s3jC|4}ss~!}3WTMdylkFFmF|WyucBk) zaE5HCzhqwJ6C4>Cm8}qA_~&qi!(o@qLm8>)O2VNVV9a{@Q^MT758cQB7TLrT(QEyo z6_3f-7y%tMThLI2r=@G75lli=@?fd-c~GOsuq9_|)B0&?6;FlJ+-E3^(X7)@3(+h; zl~tPQH#j{)c1(E&TwcFns=0y%#+aG`ITcG#Sn!ffMch)RR(D%xlZ)L}VbPUQjGWt#*`$fZHZB zLrxx_JV`Dvt_T<`g;2=t0j!hZA@RJNhS4Q*TxLdcMqWlbDx%~Js{0L)&+2tM-BG(? zu1oI;$!X)5?0_x`N-R2(dYRA}In-7eC&pG@f5_`Ibli1F8loI4LkGy`3EH9#oQTq= zL(-B8p-{LnmE?-pWX2PaGUZ^jge5g6mb*M2!>W>i3`-AcoB+A)o`}QgmvylY$)$%F z2-!90wfj7V3{e53#0hf^=-GLF$me=Gh;~dgNob)IL+G!%qb{rjyJW@_#lkR8uQKSM zxSV#U->}?V0i%S?j#=%n&mQ%J4O3A11ht$Bk10zwYs6yAvlAjfYt7Idwd?h9A4>Ar8D(d*>+&nG#IKN zP6d_B)T5O}3fevHkSt8PrAnvw?N~3gVQwQRpRJgfHB9d-&(`j=W8T<@l?1mOz(`1+ z6j2~d??+tjaKMnkMdf9fWK|G5Mx^Ksdi?f)Y%IidO{H_6E|1ma4`Bt}DFY`gRW|pD z{zBA_POeKf&0+yGH$T@{r|1tBi^r}=*x{BB2w_(zOEc7BWOrhX%ohxJLVlU){&nIL zwSFjo1w5CbIuQj{ugKyu9ri1P?H<3)Fu@}xg)-#in3~!s6Ii%$IWSeBR}B?FG1(h& zqSnP>7|ROCFwqrb$z{bVnLXq)OsNSdSI$|*L4J&Puw_O*R~@Q!b`0AB+!!`TLjMy| zEur>7T^wut2*@0H;!x1F8+pz5=RiEV{1I)!)!fvLZ9m8Nf$#p0- z$v7vXTS8gDijv3eGt2~t{9W1X0s1CkuM=wzhOGo~Ol)>_V2_r=XZK>#K@VI7GXYAB zkag@%XCz=Z=GJ6waazynT1vvG#7vWqfQt9z4>1bWf|(-{oiya7iT(*Uw4 zrKW4k0V&Bj6%H2dsJ~r~h|3!??0V62kj!=zJl&8TT|sBSE7~GQ z&=EF{cQlc1Czc6VgXj&SGbH09!j_y_N!SADwTJv3F9zwc@evGKaW#>LPz5VjO6V{^jCfplK8E~L z0i$LGtny%X6~lSItW|MW-cpcOcX~3Q0S`uOu1JI?6?y+VJri55veEZ0$V{VAX$pE% zh?&mVF{Z#uk~bQ4!cgTkz z>{Y`wmm9NJqJj`m5}#U&wG_ZcI-Appof~MCVhka>iY0U<9l*GQZbuZ4N@psVs8AT> zY!|w!7-XV-;dcIQq5}O#9|j^$OcYkmkQHP7fQBsMb~-&_uWVn$Bz>xu3n=qZFGtU; zSoHIGT}TD&_7e%G-4`_&FB7o|N4wR%*xeRzx#a8tV#eEK%wECqSt#8QgQCHZ%i)sE zteEc0kkg(@(%J1;S&L#B%4wI+HEttx%wU$*K0^VDl58x*?oxfxIW7aC=U{W8b7$DH z5IbKJn+|9#!a-jcJ91>;D(KdzF+ygGhC>l-it|5+!1{dA&}@SFX>n}h+rEzww~(|5<~4IzSlUmBw;f%Rw`@(tZU1LEH@i6 zxPm0@eT-NLGbcd|746tDs~ZxNWB6A%B@wVu)Z-5a!+t|wO)$(Ds8~DLdVzX1612In zfl8#VfHL?9t|AD77xV+D8512;z5!pXpT|Pz3}Q4Az`~WBsu707qIN7pRb<4C_g~yp z8OInB+q5f!&|MALZHDz+VF|qs=Heh)K?r&5Zl7O9$uQHbRr}h~h@Kf}eFO7pQS9xO z*+Ezmlcn*N9C#1N7NOPIxHyS@+HsH_S=Af$Is6sm2Q)A|Qfi^V6ZK(xsWXJhE0K7j zAnB8(F$D>$msq677I&n)&ctkLMqX0#9c}W%oG0GmppGOjeCX__Wu{~l(7&lU8L2p< zq?c)jPKMLwN1cLqoP;HP(GPQX6s1^8Sn7*l4i2+WG7q7r%1w&=5feI01Vpes5@{!k z62hWEd~0c}Av>}T-a^1e8Nv#3sF0U z#W>l{idr8gM4YI%BGb-+L9oqfr|AIQQtVu5T$IqU!CX=_67k5y(;+@R9iQ*871NJx zpP2cJw9hxp`q{9{6Ef!*qu&NXy6Vm9H&LC6r;*o7T#*gB*ahnQ7hbPB*36EA|` zVdFklX!XRC^Wa*^h)=u-78&gUPuQ?*Dj}^`9ScR=m6ZA`{fZ#$ zDZwJGEVh#2{jS)uj>S7`M1m)yb|DuBp~epesrT-ZMO|1DJLBUs9=6$HAC%WPLoFb&2R|0Vuq=p0 zQ->4zLOfY9N)U@Fu?!}>9Cl9#TOMV4XNplQ@4Lk^G#y8cU&xQwZiFE*?V!Ijs=YxY z^Btg|JAxS)Y)%Fs4gDv&GU$8=m+_8x>KeWoWiJ78!Lc42#s->@(l2WfLl221F# zVSw(yKs`Qq>H7Q&(!x-d(8%}$w2o(3#S@mYvNZ^sQ&k8r0r_mf05yYpogy}P=j5TA zLyi!GB{a}@$qVaOVfknwQ5Kf)Sv7?9IG5WK^7^Uf=WV$@+b(w0#~7kTJgl_h zvV@L4+pmzEl*wAL_$noYvJ`PT?LL`Z_17%5Dun_|k&>Z9<>m1EJYhqhLp)hLS3b!R z!(jZ2*Erk(cUY!f+=~S<10OpeAGW^O{HT#c+QmVsF_w^ZJYJXIfeyT$TVwZ-#YG9t zkuMkxMM7>vqt0J=!>$dAKc#|_4#;?TT{7Utd_|n0G~U^bGlcdTFL~j8H{-^xm`(T< zK_0vqjTJMrOFR#W6&1NS$=(T)PYDwOm}$jSrtFD}=?d}ce|&a8=-gPoiWnwSVhtrH z#~8xHp_hTM<;pO}5fderdP*J&W6wtrlMjXtQJf|1H76M*Bp%)v35C6eIwcN@c}mo+ z#_rN6I-v+2ueM{MxZnY@yD>7e(RKo!;^|3gxoOGi+3Bh2Xfp7ZomP;RZzvZ?alZqr z$mkmCkg#NU8$roL?44!It_8g`Ys$Oc0urlbanFe?1q1dF-k6BDq_4}xJSWN!US9~W z+{icyOEP%z5Z>en`5YnH2*yHjIf5)jFj0orXZ}a<)Y3!=5%NTB=;+BtP`AY6R8d0U zYbUT{)FlU60+Oj0A18;?ja^rU*N6lp7Sk(=lOuo;lie_{q(gi$JvMlF!6blE8}?!D zP&`{aV%8bLn;Dc5;$}wzsEIsSA@LbnXnlh&&mXZhksTX(&;fO0O;3)q^!4{-ZT+3U zw<}8%T4=W?fR~&M6{QX(RRWu4lwua`W0Qd%Z7^te1_OrIXk(YZ;)V)T zQ--6yFtq}D;^~%nyB1s6sfO_3n<|1d(ZS2DzCD0-K#}4ZsWizX69RE^cpPpYYnyly z>yX$}5Mv3Oe?s&H01;Rep%WcS?ZL8EQz`3MguqUBY_u^>sKmdKpfH#dcSfUb47_Fe z6Ym`v-bhdwJFR_rop>)p4_fRlg!o59gKl&M+{hIoK4MNlypRwFVdRJ1#u%&{rcDKu zrfrUhYc*-rH9#|lQA5hUX074hF2hUsIo2p=!=Js{*@$EdUUCYX>Bu=zO5zW78U~Xi7}WaRe#0vX zdHH;ikyouOLWY74#_jdmFiMpTpw6TtC-8K@KYHZ=1}{Ilv2$IH?sX=aFDPiFk@4f} zH^L#eVH6|7rge~G7^)+&_Y<9JL%tJ+3UVtAoEu*Pgtup8A5So8l_Y{4Mak>Hbf&X{ zloS2r*p#Dv-u8&s6GgMB7bUUSm?YmVP;(GEhS+)?bo&gYLhLe0;k!&gs1U|W5eK&6 zxeQzW1SIye#6#$=;hk!{1}Ym`0U5s6NVSCJC46T^$c6PyQR4|l?170lgh3W2Xl*vb z=5QU#(icf$4B;*IFy48?Hz>qg%B~nfQSc*lKDw1)jaIylnEg$Ws5C3nX$q1W7ZiJM8q)5 zA)uT}Ay^98{MhpsA157(ixb}7c4A!1=C@hO;w2EQGh!PRrdm@|Q!{9Oh&ERlQV;uj zLYURX3lQjl#zDq+APf+iC3GL~#Te88ia{3tf;BAMX!T_579F%OjtIVP4=<#}L6z?y zveCXCJ7#Y5#}xZcP;7R^{%%x64qK3RIP<{$+g6~k7hk{OwMDQxr`r*YbAB?vOH4|(KtbeVz&>)ms%7iyq)Q@VWv7GEh9BG4UZ)`H9I36|7BqLD-)m7P(o5OWEQ7M zXS|AyHq&9vNQNLgH5qbzsUKw6Bao4iick12MTPu$S=UYbw$t*{Gcf9A^Rc`Pf%3@TVkNz@$o=bV_j_wygzyzOXetEt9qh<|9X^ zr>CZ25PKHW=dW`6+9ngVrxFT4SQXny$6^J291UWnb z2R506R7l%1A`t~b%^!6-qTZM&@iZ|&GIVGFy#Z{Pq;GLiLdWNdDu%EnTQ zsF;1|nP0*_IC4gg9Ga6mf_d^UPwi7UI3&4S?%aI4Zxmch1Pt7~78Gd<47K$gwKn%x5u<^QSw-YGF6d zPrGfX6u)Fr;f*V}5-iFcQGxeeqmgvR3%=1~O0`F)-Pw)w3>6_S;6bqT&=aqB>Btc| zqczXLh)-TAPnW?3$VLVHLcyq<2{<1NGdUw6%PTAzJO+8Dq+oE-m=a_tBn^9tgZahW zqEVxYMh_l0R#TZu^jtZ3u&1XtXLR1k{9?!OeB>!0`MIUVg(VXQ=aR?Z+@hiph54p7 zrK86qkG0W%6{HRO(F4Qh+~GNequV4Kd^Cm8N7JOnX^cJwLwI&t_BR-leq6{>(2&Gj z8|SUrPHGc(K?`OD7etIIA(G>7r4cFd7c?6cTo5TziH+3wTN$G*@`y3cx*r$Hhs{+6 z4-rFymw0FfFA+wAm!?W>WAM^cX+|$irFdzo^mvugtNY-HmXCX)h~x~*w{}m)mqP!K z{BE^oTeG#&5kfBPH5_$Bo|bi3!m9NqPiw6%*1vBWYe9CGD~K=F^;mli&+nd&IhsD* z(?=E#EzT*P*gd^)Z1?ohMI|^v$t}zoDVq{}?8S4MV{(dfM(G?HVmrPC z8Q(*L4ab55UJ9cOV)A@E79GLYl-Mvl#9QIkNGXC+RM0&gzo1f7JW-d>#J$b!c6zb4 z#iCxEe{U)3(|iO9`*F1Rl#b3Bms2=0XQ+%hmP-N=d<_gX!B@*q0EGW!H?5W*DXmgQLk|@HW+$hluuDT~=FPmzG%IoSfPEcIrt8ew_pEo$E6&d?8HX=(*BpIs z`+#f3C;o5EdZx~K`9n*Gwc$TjW-_hArS&m7tEryd_~Tnd(~lb5i?4Q{h(B^JrC#bk2gV#^ye9euTaMRv!)e-?fp<0Ab= z1{{5TeMP!A5WZUY_WO1Gd-H2oqDz8*Qd5&@2>!?=;IE?l(NBrZhUR;&t5%8barn1x zW-_h8AGykO_{{~=S!midXR=D|((m^~p;^v#mEErgbl*Uej-QVsr>BeI2aw30p0AH< z=rcKMy(FvgCy&UF((6v>268PPkEW~Oev_{9er3?jzl!_4ah3O54c(TjxZjsodB5+W zJNGa5Ylw8HkDvLt8Gq#TbYV@S=0`_LKL<3CSY1r|(fvk2bAPO^g8MxW&1z5V(v%z`G-VONLN{Y{w>jD`Wt`bD!U&&x2CO_L_bt^zgwV7<=X#s zzdNt;egmN^{FnPBB2=@WSstsaApN#Ob1+sHlYXe0O}|2OC019#{hHroGPTDaxys_3 zh-)5bhH;%4pDRnhd!d=~FZZM8yO?Wm%3NjldkMOg|8hTizI(6oen+AEHuiqS@~7b_ zFw{<2TGN?y)_PWJ=NKI|L$_Roj;eXvRp_Xi8gvyp2XvF;bkVr*d7yj$Ds+j^Rij87 zTt)G{1=rhNg{~cRp{vkQSEKYQb!AtftA+bLdKEgd`^;77C||9(3SA;}Ypz0vE}!Ys ztI&0V&U7;!q^sz8T!YJ#2SD~ZsYlo}U-F_81D(B&=&{6$2;wp50=*GtB;>)=gy7#U^NA*EfD#Qk7 ztrvek7p@1dLf0O;N8@zy^&~yo4OgM_K=);w4&gKWP!%MmSE`^MqDsc-YNC&yn0Om@ z*4XX}_QDHGU2ZBZEzIkTsezlW$~)Avx1&d|7;OY!6k!Xwdft?n0As)5Zw3BFn#}dd zwxi1c$HZY6n+_OWG%9~U{z%OKVJw%IGhj?{(LET`jU7N!aRbKY78j1eht$rg1BR9s zj?5b{4zGwLXLp*Akv3p#aV}GJ&MPb)&?A3je$LqZ0emW=bJ5UyOkGU3*EbC{nGTp5 zm>QZ&Mws<~Lxs7;MPrK!N)p@kXrD;aF{29a!?bjwqiEEaLQEGTjNW-wDX7~lIJ}6z z1e5hHTQ6I0TOZq|D{!f&gXOzi<^Qpb8p?^n+?Ji>MFmpp=-t=^7w*z*vftFX6%|;$60PYy9OotA^P@_tDgc1fsipI2<|>P@hfUsKn4)|I-s?2juYwVdT!oE@z@U3FJ(#*Grl z@0yO@J#|;^a$2^)rv~>qp!uX8D!X!}q(=E?9it!DU3th>_9xw=W8WjV!7-cVu&wMe z^N4-{k3%-gA>5)d-J(WE?@8Q(0_JPRJ^m{^61m4I;n9YB{LDPaNR5ttFTn&^n3!fN zLG1t1;??!S*lON+!*~AFy!1L(*B!;xOKaJ>e$4%@@y_$^^mg4_dX2OEf~)+Jv;1ot z{b;GlTejKjD?4qjJ7d&8SFQxh>4}x&;dsmOw7li?+{(Ax2HOVN1`OQhE&CZCZSA}> zHkY(2%QlrY?>DO=i<6d@!YM_LhCnZkw~*mSCGV{mS!yT`9X%Wn5$L zJgQMm>n$<5ax-q%zMB~x$C6Ins?a}8o#mS=lQUu68HaHzSg2tuyJW6A_f>oQ4=ET7^!{KV5@UOKDYG*8|h0IFb0S8M{iNwt4qo`H})?9@o@W zzNIpwbeE~M*bSPOU9K`kk4!>LWXdMiGnEV^`LsUbX0aL=uU*+S7XQ*_B4(3)<+j>0 zHcznQj^@%7Ti4CgGI1>tWvs+ciTkS-_B+J=ViT7_Qo47>=Bc~>msQ-d4c)R0-EyUN zOFfFQx8(T-PnbG|RM94wY&gEm&H}n0&BwgL{O;5JzQx&_%AX{|oou zaX*y`%Fy0<*FJ-OB3X&Dvf(Y?A1ptqoz7#EZdaZhf`$k}cH=p-lJJT9&6$-&m$Fxq zU)=}4r4LlOeu0zqRWL-qav)fK241DDZTENA>}jFbiki2s>%b3dh;8Wvx?>yF)ZQ!G zrr+MeRC+O3zRg?ysjqzB6;>|s`0Jw7|7`VM+3uZjq4dB{*9I-;cFdxvP@(kBn^gn1 zf<8EJegXvr5l;-xn}w^m$nL@7h2XTh|9zPPaUp60pnN`Iu5wQeTi2a+=h6>-me#YC zdunITqI=h!OFsu(_J?J1bDlDKlC&dplnV62meP(^Bb2>Qx3x^}=bhK9P15=n4^UcC z>Xkd&B)wuTskviTZF~ZW=D)Nlzc&wd$p~B7G&GHQB;GNro)Fd`tReqY&f;5kDPc+- zs!sZry-(q-GC87IZ2PEUu}WztSiNz_tj2^VvJ64b`KKhZ@zc_n0Kg6js~CjUVn{jI+85nf;UH(EP2c+fWbZPU64 zMS`gv&bHw%!IX*PW_ET5jvunKVK^>fXZPYrecuGrWE^P-onR`%aThy#1jjw>>@yrc zVP_|BJjBjw!P3p_EP}Hm?5r2gIDptXSHy46FZxL zvoq{$7S2wyv$^`!CHmDBI6KF#uGFud#n}bscTxAtM5pZ!=64s)w78AJ*?*be1e|@v z&KBTItA3xw*?#7?T=!dvGmYJZvm|zvs?ZvJP;Dl9%P)J&k9x}wA~Kz)Q%?~W~6 zm9u5~?X^(lcrECJ>?o-=eZrN*(yABCUzRlYmLEptDv;8>^oR$b>rwVW;$YNIIAz&M z`+Nhe(#SW#M1vab%*yPSb%O^ghVnm38=@~_7CDFYMd(hVA}(oT)r@HsXA6NORIaYY@V^J^fbCP559qmSGIM< zjV8Z`H1?Ly?2B7#X+cxpsl+c1hLVxBh-zlC#$#eMa zMiCz4Gps9~;Wpzlyq?iV1zo!LhyK*g$Y&?*)Icnj;IFEQ&3fT1!9?Rf@=GwK;;0ou zJI<=2kR+IbIMXs^KF(?|zari5W_+gNmteXLM@<*RnU*yk($A>p%CiXTtE%~j`wDcp`eH)AAdX zD1N9E~8^fjnrLN9ve7UgB^qZXNy z>;~ItCTt1*5==Di)q+k%n*6G=>QW231E2rGUxKLzj+&o%dKeY5(#=9#wq6UY-eOQ- zwYXeaLQN9>=XWQI+MQbA>(+bikRG2(;u^#Y{nR={oP6UTx|H(L6Q|Qv2AmH`Q|(l6~%-SJGyPUT2~U+AdiB zk#EOlR@3f4pA5G^#ef1`L+jZgbV-8;_1|_A{3+`unA|vaVrOPFK-E&JP<3vi1xn$P zabkheWYW$kCsGxQ!9ar9lwijx9K*CzQwsjo2cu(Ho-DvzfOsZf!f8PHHFYmNwV z6mJ<8?TntN7Am?YZNd<)qWhNPqQ!LM%{5JpdR=d7l-AJHXw`LR>Yc2!x%QY^Lx}8) zKMM72_(O*ejy7TlmxU88O|&zL_oK|uSU=DZO1Nxxl|rta5%DDRGdD^wHR^HQnEFHN zCBcJL`t&b3YS}b9+8I&LGC#iICXvr^Cg##!QEZ4z#4e`9qzN};*NsWnj4Z@ntBS5f z#^jIo1QYq@rNo;HJKtQWWBej!VGA$~DsJk~_ID+6@3DzF#rcUvqeo6m%*!t*9G#z+ zi0w(3MpbT{+Bqc=doL4nh8AImj=QLMd`@v*Cv4XIzs}ACJc=TV_g0NgFAS@78dHw&@tLm<V}TDspM4O{hTZlS1jhREc$NHOKu|0` zg|0=Z>v1jO$ecdpKZ7TrouJ%65nK&_UghgVtEo*{#iwBykD#ku85vEzjH3dDnqNA= zst~$LYlO&orDxJ_a3p2M4YOpDP_E2CQ6WSfbDK1%xKUhsw8W1{&y+2R&S4P#O9B@& zbH^10N0WC2fpKsFt?*?+fx()U2O*Kh@mXViMi%R6EcO?UHfF&;7*=O29Gz8YgwQ%; zUVxtoaU(zvS^d1GU~yKy(OZ<83xR{iK<*!}$5&`1b-}QL5eFj*n+4|tYUB-NgSEEi zKolelP6*ueH3N|rC_6f`PE5V z>bu9jf2zUZkYit#^{)F#^A88Meqawhet7Dn){DkZe12xwjGQMv{o=shkfb&(=5)TC zdTq%3aNp+Boz_o&D&;3j!Tl?95_)G09~782I`Q<*4eQqRo;&JVw;L;e>G;aDN8`7j zZOD)RQ%zrYY3kW78*cA@ z#asVswT=7h*Rso`1F06@;P{adNym<#d~{dBk*#gNFMel_|5DNZ?5(e>drqt^x!d&d zfw`9K`pp&`OYZT`?fXmTo%ng*%&V{7&iJxv*uo7Lo9>;`>K|9m#vQw{;_dMr52qdq z^8WSscuAY1w#8EhgudC*vU&K3@23BF=Hm?C7JnW4%1_+y?y)ju>iO&wk_%)kEpOP_sMZ`r7f_HT99vg;0Kb~426HZa znD>c_TBsOapcZ{}E3R!+MZb8b_2?s8apj>ZW%PjVr#@O0*E6buOA4&Ml_l56I<3d<_BL@O+%tt z%ru?n)`N#3mD_`@P!(KGqpvN;$AG-DrZLfEz)$oQK4iv$sv7u~1nR-x_p$HOyJf#k zU%?wvGydDqU?fK&4iDc#X`or~*HkQxG)o*c7#eF9tQ|{z&Els9Lm08Zj12!VlcvE3 z!n|PH42GBZTTQdFie)pigld{Y%u-jgoMM&`%~HWE^)yQ>g_=~&62&ZNuVV-X;j<=} zYMN*ox2EA|>^aF2k>u$|*4hB#RSq$L1%Hzw1;-Du;AJHRuOP7u;3gc0vIa*KvGnKH z0>?9@xGx+d#1b0~udv{VAeLxeGu}7TD;qIwV;+VifANX%?XA5#Zo?af71qr}Jj`XgF-ZtFMRMQe9fEFtWZ!-GKy#< zU!4fW`z8At$ta?cd>JKQ2QNH-U-+8BD58;kJw_;gf8o6xrk#!Dj3OGzS7*uBm@^^s z1htJ(L?iinT%+KHA@cCkk)fKeaz+u2aa5kesv$yXP!3ST{aX*&cpkWoY<`RYn2BmRW{Lsx#{6;vvth(_|&jZl0(49$1e z5mX+dh(_|&oltb1gjffN1rXHBj3OGz7e4G3{W?@SbA+HaGKy#L?Uv-QT zR|M6IQA8v8A`jKbClS{ERoTGRO*CI_MiGtV3qM7LuN^nlwt^bTD59Z%9*I@6LMN3m zpyBd0O!X%e&Wc!`8SyJj7@Yc=QK*qA{Nz^^ zoT;!p=+bnbpc>(F019ekY5-VN1!pQOX*Gm+2u0? z)jO10Q6p325vqdsCYHsv9d9{GJ!>0uaiZ;{7Fz&MxjQg%!I<33d`&zOW~u5w{S9}%y2}e;=rORID24; z_RPx=R4JoSBU2Wzs0yyevFu$w&LODFj6#h};b>PC-og#5lDY}18LJF6GG!waZ=r8! zAzU2ZFBhXwBUAB&!h0Ocl=SDFf||i7)X0<_EUJR{9hO<%Mr#DMmr{N(76la4O4}@tUBPFbXv?l|(2$i{4$iVw0dC6qgj#$dsE< zaN(Tw?0!&g+ z&qj`-fRs0Yz`qi3!}ED7eUNXZ83~9PzLH^Y*+F7WgGcZd`UGBkkKf$jQ*>g`o>r$7 z<>v)UUqfKU3f|sUE&UsmLZLNzvIdiPG~k9a?mGgSbMFds%82S8zBcR^UBnkd#J(JScfs))e|QH6r{suxe6q6IIacF}Z{Y}fe`=Ucm|I;^^*G?PaZ$>mbraq<_T z5j7vDeE)~=H6Q1hL~wxD>_4W)`Y9h<<8j*lnvYX{@I&~TkLyl8Tuc3}qdW1Hk1(j# zTZQ4ZYxEUWx~=ql-*uzz(XYYPP#u{m=p$Tgssg2c~8D)hXVTvK45}Lbs zr`hVZS(6|)pqa%+mMR!AoumjF9hc+6UyhwKEx3rsQk z`_2?4aM-@pZg(dq!gfy8;MEOkjfEWGxZkiP*`~j+e(gBq^o8V>DNd(5!CXxMiO|_0 zQ@q>da$8_WI2vdo-HbvA`!qpT;RG9`qh~^K*XUK&B%9q1`L(OWo(K_~Z;uVq2gC3K zRgLi|8W8J(eYsNb&Sw!S+7Z|&!U;*uZSJ@vGmWHx8yJ?wx*S~?M*;H@%?KqxmpLT? zQe#Foj9Lr}6blgciHWzs4oWbFHP8ol45fKs3cAC{6v5fe9@q^Y zw&zLEI1=;$Ik9*^35TFIje}%d39wm=9X1CxYwICMSq7me&`A<|g7Xjb5C$5Ap9s)y uPISASo@CffT?baVJJ}7caWFwAIbf3l*r> 6, (*face).glyph.metrics.horiBearingY >> 6) - vertical_bearing_px: gg.vec2((*face).glyph.metrics.vertBearingX >> 6, (*face).glyph.metrics.vertBearingY >> 6) // not used for now - - horizontal_advance_px: u32((*face).glyph.metrics.horiAdvance) >> 6 - vertical_advance_px: u32((*face).glyph.metrics.vertAdvance) >> 6 - } -} - -pub fn new_context(cfg gg.Cfg) &FreeType { - scale := cfg.scale - // Can only have text in ortho mode - if !cfg.use_ortho { - return &FreeType{ - face: 0 - } - } - width := cfg.width * scale - height := cfg.height * scale - font_size := cfg.font_size * scale - // exit('fs=$font_size') - // if false { - // retina - // width = width * 2// scale// 2 - // height = height * 2// scale// 2 - // font_size *= scale// 2 - // } - /* - gl.viewport(0, 0, width, height) -*/ - // gl.enable(GL_CULL_FACE) // TODO NEED CULL? - gl.enable(C.GL_BLEND) - C.glBlendFunc(C.GL_SRC_ALPHA, C.GL_ONE_MINUS_SRC_ALPHA) - shader := gl.new_shader('text') - shader.use() - projection := glm.ortho(0, f32(width), 0, f32(height)) // 0 at BOT - shader.set_mat4('projection', projection) - // FREETYPE - ft := C.FT_Library{} - // All functions return a value different than 0 whenever - // an error occurred - mut ret := C.FT_Init_FreeType(&ft) - if ret != 0 { - panic('freetype: Could not init FreeType Library') - } - // Load font as face - mut font_path := cfg.font_path - if font_path == '' { - font_path = 'RobotoMono-Regular.ttf' - } - if !os.exists(font_path) { - font_path = os.resource_abs_path(font_path) - } - if !os.exists(font_path) { - eprintln('freetype: font "$font_path" does not exist') - return voidptr(0) - } - face := &C.FT_FaceRec{ - glyph: 0 - } - ret = int(C.FT_New_Face(ft, font_path.str, 0, &face)) - if ret != 0 { - eprintln('freetype: failed to load font (error=$ret) from path: $font_path') - exit(1) - } - // Set size to load glyphs as - C.FT_Set_Pixel_Sizes(face, 0, font_size) - // Disable byte-alignment restriction - C.glPixelStorei(C.GL_UNPACK_ALIGNMENT, 1) - // Gen texture - // Load first 128 characters of ASCII set - mut chars := []Character{} - for c in 0 .. 128 { - ch := ft_load_char(face, i64(c)) - // s := utf32_to_str(uint(0x043f)) - // s := 'п' - // ch = ft_load_char(f, s.utf32_code()) - // # unsigned long c = FT_Get_Char_Index(face, 0x043f ); - // # printf("!!!!!!!!! %lu\n", c); - // # c = FT_Get_Char_Index(face, 0xd0bf ); - // # printf("!!!!!!!!! %lu\n", c); - // # ch = gg__ft_load_char(f, 0xd0bf) ; // UTF 8 - chars << ch - } - // ch := Character{} - // Configure VAO - vao := gl.gen_vertex_array() - // println('new gg text context vao=$vao') - vbo := gl.gen_buffer() - gl.bind_vao(vao) - gl.bind_buffer(C.GL_ARRAY_BUFFER, vbo) - // # glBufferData(GL_ARRAY_BUFFER, sizeof(GLf32) * 6 * 4, NULL, GL_DYNAMIC_DRAW); - gl.enable_vertex_attrib_array(0) - gl.vertex_attrib_pointer(0, 4, C.GL_FLOAT, false, 4, 0) - // # glVertexAttribPointer(0, 4, GL_FLOAT,false, 4 * sizeof(GLf32), 0); - // gl.bind_buffer(GL_ARRAY_BUFFER, uint(0)) - // # glBindVertexArray(0); - ctx := &FreeType{ - shader: shader - width: width - height: height - scale: scale - vao: vao - vbo: vbo - chars: chars - face: face - } - // ctx.init_utf8_runes() - return ctx -} - -pub fn (mut ctx FreeType) draw_text(_x, _y int, text string, cfg gx.TextCfg) { - // utext := text.ustring_tmp() - utext := text.ustring() - ctx.private_draw_text(_x, _y, utext, cfg) -} - -fn (mut ctx FreeType) draw_text_fast(_x, _y int, text ustring, cfg gx.TextCfg) { - ctx.private_draw_text(_x, _y, text, cfg) -} - -fn (mut ctx FreeType) private_draw_text(_x, _y int, utext ustring, cfg gx.TextCfg) { - /* - if utext.s.contains('on_seg') { - println('\nat(0)') - println(utext.runes) - firstc := utext.at(0) - println('drawtext "$utext.s" len=$utext.s.len ulen=$utext.len x=$_x firstc=$firstc') - if firstc != ' ' { - exit(1) - } - } -*/ - mut x := f32(_x) - mut y := f32(_y) - wx, wy := ctx.text_size(utext.s) - yoffset := if ctx.scale > 1 { 5 } else { -1 } // 5 hidpi, -1 lowdpi - // println('scale=$ctx.scale size=$cfg.size') - if cfg.align == gx.align_right { - // width := utext.len * 7 - width := wx - x -= f32(width + 10) - } - x *= f32(ctx.scale) - y *= f32(ctx.scale) - y += f32(yoffset) - y = f32(ctx.height) - y // invert y direction - color := cfg.color - // Activate corresponding render state - ctx.shader.use() - ctx.shader.set_color('textColor', color) - C.glActiveTexture(C.GL_TEXTURE0) - gl.bind_vao(ctx.vao) - // Iterate through all characters - // utext := text.ustring() - for i in 0 .. utext.len { - rune_ := utext.at(i) - // println('$i => $rune_') - mut ch := Character{} - mut found := false - if rune_.len == 1 { - idx := rune_[0] - if idx < 0 || idx >= ctx.chars.len { - println('BADE RUNE $rune_') - continue - } - found = true - ch = ctx.chars[rune_[0]] - } else if rune_.len > 1 { - // TODO O(1) use map - for j in 0 .. ctx.utf_runes.len { - rune_j := ctx.utf_runes[j] - if rune_j == rune_ { - ch = ctx.utf_chars[j] - found = true - break - } - } - } - // A new Unicode character. Load it and cache it. - if !found && rune_.len > 0 && rune_[0] > 32 { - // c := rune_[0] - // println('cant draw rune "$rune_" code=$c, loading') - // continue - ch = ft_load_char(ctx.face, rune_.utf32_code()) - // println('done loading') - ctx.utf_runes << rune_ - ctx.utf_chars << ch - // exit(1) - // continue - } - xpos := x + f32(ch.horizontal_bearing_px.x) * 1 - ypos := y - f32(ch.size.y + wy - ch.horizontal_bearing_px.y) * 1 - // ypos := y - wy - w := f32(ch.size.x) * 1 - h := f32(ch.size.y) * 1 - // Update VBO for each character - vertices := [ - xpos, ypos + h, 0.0, 0.0, - xpos, ypos, 0.0, 1.0, - xpos + w, ypos, 1.0, 1.0, - xpos, ypos + h, 0.0, 0.0, - xpos + w, ypos, 1.0, 1.0, - xpos + w, ypos + h, 1.0, 0.0] - // Render glyph texture over quad - C.glBindTexture(C.GL_TEXTURE_2D, ch.texture_id) - // Update content of VBO memory - gl.bind_buffer(C.GL_ARRAY_BUFFER, ctx.vbo) - // glBufferSubData(..) - C.glBufferData(C.GL_ARRAY_BUFFER, 96, vertices.data, C.GL_DYNAMIC_DRAW) - // Render quad - gl.draw_arrays(C.GL_TRIANGLES, 0, 6) - x += f32(ch.horizontal_advance_px) - // Stop drawing if the limit is reached - if cfg.max_width > 0 { - if x >= cfg.max_width { - // break - } - } - } - gl.bind_vao(u32(0)) - C.glBindTexture(C.GL_TEXTURE_2D, 0) -} - -pub fn (mut ctx FreeType) draw_text_def(x, y int, text string) { - cfg := gx.TextCfg{ - color: gx.black - size: default_font_size - align: gx.align_left - } - ctx.draw_text(x, y, text, cfg) -} - -pub fn (mut ctx FreeType) text_width(s string) int { - x, _ := ctx.text_size(s) - return x -} - -pub fn (mut ctx FreeType) text_height(s string) int { - _, y := ctx.text_size(s) - return y -} - -pub fn (mut ctx FreeType) text_size(s string) (int, int) { - // t := time.ticks() - utext := s.ustring() - mut x := u32(0) - mut maxy := u32(0) - mut rune_ := '' - mut ch := Character{} - for i in 0 .. utext.len { - rune_ = utext.at(i) - ch = Character{} - mut found := false - if rune_.len == 1 { - idx := rune_[0] - if idx < 0 || idx >= ctx.chars.len { - println('BADE RUNE $rune_') - continue - } - found = true - ch = ctx.chars[rune_[0]] - } else if rune_.len > 1 { - // TODO O(1) use map - for j in 0 .. ctx.utf_runes.len { - rune_j := ctx.utf_runes[j] - if rune_j == rune_ { - ch = ctx.utf_chars[j] - found = true - break - } - } - } - if !found && rune_.len > 0 && rune_[0] > 32 { - ch = ft_load_char(ctx.face, rune_.utf32_code()) - ctx.utf_runes << rune_ - ctx.utf_chars << ch - } - x += ch.horizontal_advance_px - if maxy < ch.vertical_advance_px { - maxy = ch.vertical_advance_px - } - } - // println('text width "$s" = ${time.ticks() - t} ms') - // scaled_x := x - // scaled_y := maxy - scaled_x := int(f64(x) / ctx.scale) - scaled_y := int(f64(maxy) / ctx.scale) - // println('text_size of "${s}" | x,y: $x,$maxy | scaled_x: ${scaled_x:3d} | scaled_y: ${scaled_y:3d} ') - return scaled_x, scaled_y -} - -/* -pub fn (f FT_Face) str() string { - return 'FT_Face{ style_name: ${ptr_str(f.style_name)} family_name: ${ptr_str(f.family_name)} }' -} -*/ -pub fn (ac []Character) str() string { - mut res := []string{} - for c in ac { - res << ' Character{ code: $c.code , texture_id: $c.texture_id }' - } - return '[\n' + res.join(',\n') + ']' -} diff --git a/vlib/gl/1shader.v b/vlib/gl/1shader.v deleted file mode 100644 index ad1b983d03..0000000000 --- a/vlib/gl/1shader.v +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright (c) 2019-2020 Alexander Medvednikov. All rights reserved. -// Use of this source code is governed by an MIT license -// that can be found in the LICENSE file. - -module gl - -import gx -import glm - -// import os - -// import darwin - -pub struct Shader { - program_id int -} -pub fn (s Shader) str() string { - return 'Shader{ program_id: s.program_id }' -} - -pub const ( - text_vert = '#version 330 core -layout (location = 0) in vec4 vertex; // -out vec2 TexCoords; - -uniform mat4 projection; - -void main() -{ - gl_Position = projection * vec4(vertex.xy, 0.0, 1.0); - TexCoords = vertex.zw; -} ' - text_frag = '#version 330 core -in vec2 TexCoords; -out vec4 color; - -uniform sampler2D text; -uniform vec3 textColor; - -void main() -{ - vec4 sampled = vec4(1.0, 1.0, 1.0, texture(text, TexCoords).r); - color = vec4(textColor, 1.0) * sampled; -} ' - simple_vert = ' #version 330 core - -layout (location = 0) in vec3 aPos; -layout (location = 1) in vec3 aColor; -layout (location = 2) in vec2 aTexCoord; - - -out vec3 ourColor; -out vec2 TexCoord; - -uniform mat4 projection; - -void main() { - gl_Position = projection * vec4(aPos, 1.0); -// gl_Position = vec4(aPos, 1.0); - - ourColor = aColor; -//TexCoord = vec2(aTexCoord.x, aTexCoord.y); - TexCoord = aTexCoord; -} -' - simple_frag = '#version 330 core - -out vec4 FragColor; -uniform vec3 color; - -uniform bool has_texture; - -in vec3 ourColor; -in vec2 TexCoord; - -uniform sampler2D ourTexture; - - -void main() { -// FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f); -// FragColor = vec4(1.0f, 0.0f, 0.0f, 1.0f); -if (has_texture) { - /* - vec3 chromaKeyColor = texture(ourTexture,TexCoord.xy).xyz; - -float alpha; -bool is_cyan = ((chromaKeyColor.x == 0)); // && chromaKeyColor.x <= 1) && (chromaKeyColor.y <= 255) && -bool is_pink= ((chromaKeyColor.y == 0)); -//bool is_pink= ((chromaKeyColor.x <= 255) && (chromaKeyColor.y == 0) &&(chromaKeyColor.z <= 255)); -if (is_cyan || is_pink) { - alpha = 0.; -} -else -{ - alpha = 1.0; -} -FragColor= vec4(texture(ourTexture,TexCoord.xy).xyz,alpha); -*/ - - FragColor = texture(ourTexture, TexCoord); - -} else { - FragColor = vec4(color, 1.0f); -} -} -' -) - -pub fn new_shader(name string) Shader { - // TODO This is not used, remove - mut dir := '' - // Already have absolute path - if name.starts_with('/') { - dir = '' - } - //vertex_path := '${dir}${name}.vert' - //fragment_path := '${dir}${name}.frag' - //println('shader path=$vertex_path,\n fpath="$fragment_path"') - // vertex_src := os.read_file(vertex_path.trim_space()) - mut vertex_src := '' - mut fragment_src := '' - if name == 'text' { - vertex_src = text_vert - fragment_src = text_frag - } - else if name == 'simple' { - // println('new shader simple!!!') - // println(simple_vert) - vertex_src = simple_vert - fragment_src = simple_frag - } - // //////////////////////////////////////// - vertex_shader := gl.create_shader(C.GL_VERTEX_SHADER) - gl.shader_source(vertex_shader, 1, vertex_src, 0) - gl.compile_shader(vertex_shader) - if gl.shader_compile_status(vertex_shader) == 0 { - cerror := gl.shader_info_log(vertex_shader) - eprintln('vertex ${vertex_shader} shader compilation failed') - eprintln('shader source = ${vertex_src}') - eprintln('failed to compile, with error') - eprintln(cerror) - exit(1) - } - // fragment shader - // fragment_src := os.read_file(fragment_path.trim_space()) - fragment_shader := gl.create_shader(C.GL_FRAGMENT_SHADER) - gl.shader_source(fragment_shader, 1, fragment_src, 0) - gl.compile_shader(fragment_shader) - if gl.shader_compile_status(fragment_shader) == 0 { - cerror := gl.shader_info_log(fragment_shader) - eprintln('fragment ${fragment_shader} shader compilation failed') - eprintln('shader source = ${fragment_src}') - eprintln('failed to compile, with error') - eprintln(cerror) - exit(1) - } - // link shaders - shader_program := gl.create_program() - gl.attach_shader(shader_program, vertex_shader) - gl.attach_shader(shader_program, fragment_shader) - gl.link_program(shader_program) - // check for linking errors - success := gl.get_program_link_status(shader_program) - if success == 0 { - cerror := gl.shader_info_log(shader_program) - eprintln('shader program linking failed') - eprintln('vertex source = ${vertex_src}') - eprintln('fragment source = ${fragment_src}') - eprintln('failed to compile, with error') - eprintln(cerror) - exit(1) - } - shader := Shader { - program_id: shader_program, - } - return shader -} - -pub fn (s Shader) use() { - gl.use_program(s.program_id) -} - -fn C.glUniformMatrix4fv() -fn C.glUniform1i() -fn C.glUniform3f() - -pub fn (s Shader) uni_location(key string) int { - return C.glGetUniformLocation(s.program_id, key.str) -} - -// fn (s Shader) set_mat4(str string, f *f32) { -pub fn (s Shader) set_mat4(str string, m glm.Mat4) { - // TODO cache uniform location - C.glUniformMatrix4fv(s.uni_location(str), 1, false, m.data) -} - -pub fn (s Shader) set_int(str string, n int) { - C.glUniform1i(s.uni_location(str), n) -} - -pub fn (s Shader) set_color(str string, c gx.Color) { - C.glUniform3f(s.uni_location(str), f32(c.r) / 255.0, f32(c.g) / 255.0, f32(c.b) / 255.0) -} diff --git a/vlib/gl/gl.v b/vlib/gl/gl.v deleted file mode 100644 index 3ce12467ed..0000000000 --- a/vlib/gl/gl.v +++ /dev/null @@ -1,398 +0,0 @@ -// Copyright (c) 2019-2020 Alexander Medvednikov. All rights reserved. -// Use of this source code is governed by an MIT license -// that can be found in the LICENSE file. - -module gl - -import glm - -#flag -I @VROOT/thirdparty/glad -#include "glad.h" -#flag @VROOT/thirdparty/glad/glad.o - - -// joe-c: fix & remove -pub enum TmpGlImportHack{ non_empty } - -fn C.gladLoadGL() int - -fn C.glDisable() -fn C.glEnable() -fn C.glScissor() -fn C.glVertexAttribPointer() -fn C.glGenBuffers() -fn C.glEnableVertexAttribArray() -fn C.glDisableVertexAttribArray() -fn C.glGenVertexArrays() -fn C.glDrawElements() -fn C.glUseProgram() -fn C.glValidateProgram() -fn C.glDrawArrays() -fn C.glBufferData() -fn C.glGenerateMipmap() -fn C.glTexParameteri() -fn C.glDeleteTextures() -fn C.glBindTexture() -fn C.glActiveTexture() -fn C.glGenTextures() -fn C.glBindBuffer() -fn C.glBindVertexArray() -fn C.glGetProgramInfoLog() -fn C.glGetShaderInfoLog() -fn C.glDeleteShader() -fn C.glGetProgramiv() -fn C.glLinkProgram() -fn C.glAttachShader() -fn C.glDetachShader() -fn C.glGetShaderiv() -fn C.glCompileShader() -fn C.glShaderSource() -fn C.glCreateProgram() int -fn C.glDeleteProgram() -fn C.glClear() -fn C.glCreateShader() int -fn C.glClearColor() -fn C.glViewport() -fn C.glPixelStorei() -fn C.glBlendFunc() -fn C.glPolygonMode() -fn C.glDeleteBuffers() -fn C.glDeleteVertexArrays() -fn C.glGetUniformLocation() int -fn C.glGetAttribLocation() int -fn C.glBindAttribLocation() - -fn C.glUniform1f() - - -// init_glad initializes glad, which is needed to use other functions. -pub fn init_glad() { - ok := C.gladLoadGL() - if ok == 0 { - println('Failed to initialize glad OpenGL context') - exit(1) - } -} - -// viewport declares the area, which should be rendered in the window. -// Should be used on resizing the window. -pub fn viewport(x, y, width, height int) { - C.glViewport(x, y, width, height) -} - -// clear_color sets the color, which will be the background, where you can draw. -// Need only set once. -pub fn clear_color(r, g, b, a int) { - C.glClearColor(f32(r)/255.0, f32(g)/255.0, f32(b)/255.0, f32(a)/255.0) -} - -// clear clears the bits of the last frame (ColorBufferBit, DepthBufferBit, StencilBufferBit) to store new data. -// Should be done every frame. -pub fn clear() { - C.glClear(C.GL_COLOR_BUFFER_BIT | C.GL_DEPTH_BUFFER_BIT | C.GL_STENCIL_BUFFER_BIT) -} - -// create_shader creates a shader in OpenGL and returns the id. -pub fn create_shader(typ int) int { - return C.glCreateShader(typ) -} - -// Create a program in OpenGL and returns the id. -// A shader can be attached to a program, which is required to use them. -pub fn create_program() int { - return C.glCreateProgram() -} - -// Delete a program by id. -// Cleanup method, should be used after the main game loop -pub fn delete_program(program int) { - C.glDeleteProgram(program) -} - -// shader_source attaches source code to the shader via the shaderID. -// Could be also used to load multiple sources into a shader. -// To just add one source code to one shader use: `gl.shader_source(shader, 1, src, 0)` -pub fn shader_source(shader, count int, source string, length int) { - C.glShaderSource(shader, count, &source.str, length) -} - -// compile_shader compiles the shader's source code. -// OpenGL compiles the source code at runtime. -pub fn compile_shader(shader int) { - C.glCompileShader(shader) -} - -// shader_compile_status returns the compile status of the shader compilation. -// Can be used to check the compilation and see for errors in the shader code via `gl.shader_info_log()` -pub fn shader_compile_status(shader int) int { - success := 0 - C.glGetShaderiv(shader, C.GL_COMPILE_STATUS, &success) - return success -} - -// attach_shader attaches a shader to a program. -// Required for drawing things on the screen -pub fn attach_shader(program, shader int) { - C.glAttachShader(program, shader) -} - -// detach_shader detaches a shader of a program -// Cleanup method -pub fn detach_shader(program, shader int) { - C.glDetachShader(program, shader) -} - -// link_program links a program as target. -// This let OpenGL know, which program has to be use. -pub fn link_program(program int) { - C.glLinkProgram(program) -} - -// get_program_link_status returns the link status of linking the program -pub fn get_program_link_status(program int) int { - success := 0 - C.glGetProgramiv(program, C.GL_LINK_STATUS, &success) - return success -} - -// validate_program checks that the shaders in the program can be executed -pub fn validate_program(program int) { - C.glValidateProgram(program) -} - -// delete_shader deletes a shader via the shaderID -// Cleanup method -pub fn delete_shader(shader int) { - C.glDeleteShader(shader) -} - -// shader_info_log returns a info log of the shader. -// Can be used to print compilation errors. -pub fn shader_info_log(shader int) string { - info_log := [512]byte - C.glGetShaderInfoLog(shader, 512, 0, info_log) - return tos_clone(info_log) -} - -// get_program_info_log returns a info log of the program. -// Can be used to print linking errors etc. -pub fn get_program_info_log(program int) string { - info_log := [1024]byte - C.glGetProgramInfoLog(program, 1024, 0, info_log) - return tos_clone(info_log) -} - -// bind_vao binds a vertex array buffer to OpenGL. -// Says OpenGL which vao is the target. -pub fn bind_vao(vao u32) { - C.glBindVertexArray(vao) -} - -// bind_buffer binds a vertex buffer object to OpenGL. -// Says OpenGL which vbo is the target. -pub fn bind_buffer(typ int, vbo u32) { - C.glBindBuffer(typ, vbo) -} - -// gen_texture generates a textureID. -// Needed to use texturing. -pub fn gen_texture() u32 { - res := u32(0) - C.glGenTextures(1, &res) - return res -} - -// active_texture activates a texture. -// If you don't do this, texture isn't working. -pub fn active_texture(t int) { - C.glActiveTexture(t) -} - -// bind_2d_texture binds the activated texture as a 2D texture. -// Helper method. -pub fn bind_2d_texture(texture u32) { - C.glBindTexture(C.GL_TEXTURE_2D, texture) -} - -// bind_texture binds the activated texture to a texture type. -// Defines the type for texture. -pub fn bind_texture(texture, typ u32) { - C.glBindTexture(typ, texture) -} - -// delete_texture deletes a texture by ID. -// Cleanup method. -pub fn delete_texture(texture u32) { - C.glDeleteTextures(1, &texture) -} - -// buffer_data puts data into a buffer. -// With these methods, data can put into a buffer. -// Common usage for C.GL_ARRAY_BUFFER or C.GL_ELEMENT_ARRAY_BUFFER. -pub fn buffer_data(typ, size int, arr voidptr, draw_typ int) { - C.glBufferData(typ, size, arr, draw_typ) -} - -// buffer_data_int puts int into a buffer. -pub fn buffer_data_int(typ int, vertices []int, draw_typ int) { - size := sizeof(int) * u32(vertices.len) - C.glBufferData(typ, size, vertices.data, draw_typ) -} - -// buffer_data_f32 puts float into a buffer. -pub fn buffer_data_f32(typ int, vertices []f32, draw_typ int) { - size := sizeof(f32) * u32(vertices.len) - C.glBufferData(typ, size, vertices.data, draw_typ) -} - -// set_vbo sets vertices into a vertex buffer object. -// Helper method. -pub fn set_vbo(vbo u32, vertices []f32, draw_typ int) { - gl.bind_buffer(C.GL_ARRAY_BUFFER, vbo) - gl.buffer_data_f32(C.GL_ARRAY_BUFFER, vertices, draw_typ) -} - -// set_ebo sets indices into a element array buffer. -// Helper method. -pub fn set_ebo(ebo u32, indices []int, draw_typ int) { - gl.bind_buffer(C.GL_ELEMENT_ARRAY_BUFFER, ebo) - gl.buffer_data_int(C.GL_ELEMENT_ARRAY_BUFFER, indices, draw_typ) -} - -// delete_buffer deletes a vertex buffer object. -// Cleanup method. -pub fn delete_buffer(vbo u32) { - C.glDeleteBuffers(1, vbo) -} - -// delete_vao deletes a vertex array object. -// Cleanup method. -pub fn delete_vao(vao u32) { - C.glDeleteVertexArrays(1, vao) -} - -// get_uniform_location gets the uniform location for key in program. -// Required to put uniform data in shader at runtime. -pub fn get_uniform_location(program int, key string) int { - return C.glGetUniformLocation(program, key.str) -} - -// get_attrib_location gets the attribute location for key in program. -// Required to put attrib data in shader at runtime. -pub fn get_attrib_location(program int, key string) int { - return C.glGetAttribLocation(program, key.str) -} - -// bind_attrib_location binds a attrib on index in program to a name. -// Used to send data into a shader. -pub fn bind_attrib_location(program int, index int, name string) { - C.glBindAttribLocation(program, index, name.str) -} - -// draw_arrays draws the vertex buffer object on screen. -// Commonly start is 0 and len 3 (without textures) or 5 (with textures). -// Mode commonly C.GL_TRIANGLES. -pub fn draw_arrays(mode, start, len int) { - C.glDrawArrays(mode, start, len) -} - -// draw_elements draws the element object buffer on screen. -// Commonly typ is C.GL_UNSIGNED_INT and mode C.GL_TRIANGLES. -pub fn draw_elements(mode, count, typ, indices int) { - C.glDrawElements(mode, count, typ, indices) -} - -// use_program binds program to OpenGL. -// Defines the program which is the target. -pub fn use_program(program int) { - C.glUseProgram(program) -} - -// gen_vertex_array generates a vertex array ID. -// Linked to an empty vertex array. -pub fn gen_vertex_array() u32 { - vao := u32(0) - C.glGenVertexArrays(1, &vao) - return vao -} - -// enable_vertex_attrib_array enables a vertex attrib array by index. -pub fn enable_vertex_attrib_array(n int) { - C.glEnableVertexAttribArray(n) -} - -// disable_vertex_attrib_array disabled a vertex attrib array by index. -pub fn disable_vertex_attrib_array(n int) { - C.glDisableVertexAttribArray(n) -} - -// gen_buffer generates an buffer ID. -// Linked to an empty buffer- -pub fn gen_buffer() u32 { - vbo := u32(0) - C.glGenBuffers(1, &vbo) - return vbo -} - -// vertex_attrib_pointer defines the activated array by index. -pub fn vertex_attrib_pointer(index, size int, typ int, normalized bool, _stride int, _ptr int) { - mut stride := u32(_stride) - mut ptr := _ptr - if typ == C.GL_FLOAT { - stride *= sizeof(f32) - ptr *= int(sizeof(f32)) - } - C.glVertexAttribPointer(index, size, typ, normalized, stride, ptr) -} - -// tex_param attachs texture value as int to a texture by ID. -pub fn tex_param(key, val int) { - C.glTexParameteri(C.GL_TEXTURE_2D, key, val) -} - -// enable enables various capabilities for OpenGL. -pub fn enable(val int) { - C.glEnable(val) -} - -// disable disables various capabilities for OpenGL. -pub fn disable(val int) { - C.glDisable(val) -} - -// scissor defines a rectangle in the window. -pub fn scissor(x, y, width, height int) { - C.glScissor(x, y, height, height) -} - -pub fn generate_mipmap(typ int) { - C.glGenerateMipmap(typ) -} - -// set_mat4fv sets a mat4 at uniform location. -// Used for almost every view stuff in OpenGL. -pub fn set_mat4fv(loc, count int, transpose bool, val glm.Mat4) { - C.glUniformMatrix4fv(loc, count, transpose, val.data) -} - -// set_f32 sets a float at uniform location. -// Usable for global lighing. -pub fn set_f32(loc int, val f32) { - C.glUniform1f(loc, val) -} - -// set_vec sets a vec3 at uniform location. -// Usable to set locations or colors. -pub fn set_vec(loc int, x, y, z f32) { - C.glUniform3f(loc, x, y, z) -} - -// set_bool sets a bool at uniform location. -// Send states to the shader. -pub fn set_bool(loc int, val bool) { - if val { - set_f32(loc, 1) - } else { - set_f32(loc, 0) - } -} diff --git a/vlib/glfw/glfw.v b/vlib/glfw/glfw.v deleted file mode 100644 index 0a2e10265d..0000000000 --- a/vlib/glfw/glfw.v +++ /dev/null @@ -1,373 +0,0 @@ -// Copyright (c) 2019-2020 Alexander Medvednikov. All rights reserved. -// Use of this source code is governed by an MIT license -// that can be found in the LICENSE file. -module glfw - -import gl - -// note: we might need special case for this -// see TmpGlImportHack below (joe-c) - -#flag -I @VROOT/thirdparty/glfw -#flag -L @VROOT/thirdparty/glfw - -// Debugging a custom build -//-#flag darwin -L/var/tmp/glfw/src/ - -// MacPorts -#flag darwin -L/opt/local/lib - -#flag darwin -lglfw -#flag freebsd -I/usr/local/include -#flag freebsd -Wl,-L/usr/local/lib,-lglfw - -#flag solaris -I/opt/local/include -#flag solaris -L/opt/local/lib -#flag solaris -lglfw - -#flag linux -lglfw -#flag windows -lgdi32 -lshell32 -lglfw3 -#flag mingw -mwindows -#include -// #flag darwin -framework Carbon -// #flag darwin -framework Cocoa -// #flag darwin -framework CoreVideo -// #flag darwin -framework IOKit -pub const ( - resizable = 1 - decorated = 2 -) - -pub const ( - key_escape = 256 - key_space = 32 - key_left_super = 343 - - key_up = 265 - key_left = 263 - key_right = 262 - key_down = 264 -) - -fn C.glfwGetWindowUserPointer() voidptr -fn C.glfwGetPrimaryMonitor() voidptr -fn C.glfwSetWindowUserPointer() -fn C.glfwSetCursor() -fn C.glfwGetCursorPos() -fn C.glfwSetClipboardString() -fn C.glfwGetWindowContentScale() -fn C.glfwGetClipboardString() -fn C.glfwGetKey() -fn C.glfwGetTime() f64 -fn C.glfwSetCharModsCallback() -fn C.glfwSetKeyCallback() -fn C.glfwPostEmptyEvent() -fn C.glfwSetScrollCallback() -fn C.glfwSetWindowSizeCallback() -fn C.glfwSetMouseButtonCallback() -fn C.glfwSetCursorPosCallback() -fn C.glfwSwapBuffers() -fn C.glfwWindowShouldClose() bool -fn C.glfwSetWindowShouldClose() -fn C.glfwWaitEvents() -fn C.glfwPollEvents() -fn C.glfwSwapInterval() -fn C.glfwMakeContextCurrent() -fn C.glfwSetWindowTitle() -fn C.glfwTerminate() -fn C.glfwCreateWindow(w int, h int, title charptr, m voidptr, sh voidptr) voidptr -fn C.glfwWindowHint() -fn C.glfwDestroyWindow() -fn C.glfwInit() -fn C.glGetIntegerv() - -// joe-c: fix & remove -struct TmpGlImportHack { - hack gl.TmpGlImportHack -} - -pub struct WinCfg { - width int - height int - title string - ptr voidptr - borderless bool - is_modal int - is_browser bool - url string - always_on_top bool - scale_to_monitor bool = true -} - -// data *C.GLFWwindow -// TODO change data to cobj -pub struct Window { - data voidptr - title string - mx int - my int - scale_ f32 -} - -pub struct Size { -pub: - width int - height int -} - -pub struct Pos { -pub: - x int - y int -} - -// type clickpub fn pub fn (window * GLFWwindow, button, action, mods int) -type ClickPubFn fn (window voidptr, button, action, mods int) - -/* - * TODO broken -fn init() { - init_glfw() -} -*/ - -pub fn init_glfw() { - C.glfwInit() - C.glfwWindowHint(C.GLFW_CONTEXT_VERSION_MAJOR, 3) - C.glfwWindowHint(C.GLFW_CONTEXT_VERSION_MINOR, 3) - C.glfwWindowHint(C.GLFW_OPENGL_FORWARD_COMPAT, C.GL_TRUE) - C.glfwWindowHint(C.GLFW_OPENGL_PROFILE, C.GLFW_OPENGL_CORE_PROFILE) -} - -pub fn (w &Window) destroy() { - C.glfwDestroyWindow(w.data) -} - -pub fn terminate() { - C.glfwTerminate() -} - -// pub fn mouse_move(w * GLFWwindow, x, y double) { -pub fn mouse_move(w voidptr, x, y f64) { - // #printf("%f : %f => %d \n", x,y); -} - -pub fn window_hint(key, val int) { - C.glfwWindowHint(key, val) -} - -pub fn create_window(c WinCfg) &Window { - if c.borderless { - window_hint(C.GLFW_RESIZABLE, 0) - window_hint(C.GLFW_DECORATED, 0) - } - if c.always_on_top { - window_hint(C.GLFW_FLOATING, 1) - } - if c.scale_to_monitor { - $if windows { - window_hint(C.GLFW_SCALE_TO_MONITOR, 1) - } - } - cwindow := C.glfwCreateWindow(c.width, c.height, c.title.str, 0, 0) - if isnil(cwindow) { - println('failed to create a glfw window, make sure you have a GPU driver installed') - C.glfwTerminate() - } - // println('create window wnd=$cwindow ptr==$c.ptr') - C.glfwSetWindowUserPointer(cwindow, c.ptr) - - mut scale := f32(1.0) - $if windows { - C.glfwGetWindowContentScale(cwindow, &scale, &scale) - } - $else { - scale = 1.0 - } - - window := &Window { - data: cwindow, - title: c.title, - scale_: scale - } - return window -} - -pub fn (w &Window) set_title(title string) { - C.glfwSetWindowTitle(w.data, title.str) -} - -pub fn (w &Window) make_context_current() { - C.glfwMakeContextCurrent(w.data) -} - -pub fn (w &Window) scale() f32 { - return w.scale_ -} - -pub fn swap_interval(interval int) { - C.glfwSwapInterval(interval) -} - -pub fn wait_events() { - C.glfwWaitEvents() -} - -pub fn poll_events() { - C.glfwPollEvents() -} - -pub fn set_should_close(w voidptr, close bool) { - C.glfwSetWindowShouldClose(w, close) -} - -pub fn (w &Window) set_should_close(close bool) { - C.glfwSetWindowShouldClose(w.data, close) -} - -pub fn (w &Window) should_close() bool { - return C.glfwWindowShouldClose(w.data) -} - -pub fn (w &Window) swap_buffers() { - C.glfwSwapBuffers(w.data) -} - -pub fn (mut w Window) onmousemove(cb voidptr) { - C.glfwSetCursorPosCallback(w.data, cb) -} - -pub fn (mut w Window) set_mouse_button_callback(cb voidptr) { - C.glfwSetMouseButtonCallback(w.data, cb) -} - -pub fn (mut w Window) on_resize(cb voidptr) { - C.glfwSetWindowSizeCallback(w.data, cb) -} - -pub fn (mut w Window) on_click(cb voidptr) { - C.glfwSetMouseButtonCallback(w.data, cb) -} - -pub fn (w &Window) set_scroll_callback(cb voidptr) { - C.glfwSetScrollCallback(w.data, cb) -} - -pub fn (w &Window) on_scroll(cb voidptr) { - C.glfwSetScrollCallback(w.data, cb) -} - -pub fn post_empty_event() { - C.glfwPostEmptyEvent() -} - -pub fn (mut w Window) onkeydown(cb voidptr) { - C.glfwSetKeyCallback(w.data, cb) -} - -pub fn (mut w Window) onchar(cb voidptr) { - C.glfwSetCharModsCallback(w.data, cb) -} - -pub fn get_time() f64 { - return C.glfwGetTime() -} - -pub fn key_pressed(wnd voidptr, key int) bool { - return int(C.glfwGetKey(wnd, key)) == C.GLFW_PRESS -} - -pub fn (w &Window) get_clipboard_text() string { - return string(byteptr(C.glfwGetClipboardString(w.data))) -} - -pub fn (w &Window) set_clipboard_text(s string) { - C.glfwSetClipboardString(w.data, s.str) -} - -pub fn get_cursor_pos(cwindow voidptr) (f64, f64) { - x := f64(0) - y := f64(0) - C.glfwGetCursorPos(cwindow, &x, &y) - - mut scale := f32(1.0) - $if windows { - C.glfwGetWindowContentScale(cwindow, &scale, &scale) - } - $else { - scale = 1.0 - } - return x/scale, y/scale -} - -pub fn (w &Window) get_cursor_pos() Pos { - x := f64(0) - y := f64(0) - C.glfwGetCursorPos(w.data, &x, &y) - - return Pos { - x: int(x/w.scale_) - y: int(y/w.scale_) - } -} - -enum Cursor { - arrow - ibeam - hand -} - -pub fn set_cursor(c Cursor) { - C.glfwSetCursor(0, C.GLFW_IBEAM_CURSOR) -} - -pub fn (w &Window) set_cursor(c Cursor) { - C.glfwSetCursor(w.data, C.GLFW_IBEAM_CURSOR) - -} - -pub fn (w &Window) user_ptr() voidptr { - return C.glfwGetWindowUserPointer(w.data) -} - -pub fn (w &Window) set_user_ptr(ptr voidptr) { - C.glfwSetWindowUserPointer(w.data, ptr) -} - -struct C.GLFWvidmode { - width int - height int -} - -pub fn C.glfwGetVideoMode() &C.GLFWvidmode - -pub fn get_monitor_size() Size { - //# GLFWvidmode* mode = glfwGetVideoMode(glfwGetPrimaryMonitor()); - mode := C.glfwGetVideoMode(C.glfwGetPrimaryMonitor()) - return Size{mode.width, mode.height} -} - -fn C.glfwGetWindowSize(window &Window, width &int, height &int) // screen coordinates -fn C.glfwGetFramebufferSize(window &Window, width &int, height &int) // pixels - -// get_window_size in screen coordinates -pub fn (w &Window) get_window_size() Size { - res := Size {0, 0} - C.glfwGetWindowSize(w.data, &res.width, &res.height) - return res -} - -// get_framebuffer_size in pixels -pub fn (w &Window) get_framebuffer_size() Size { - res := Size {0, 0} - C.glfwGetFramebufferSize(w.data, &res.width, &res.height) - return res -} - -pub fn (size Size) str() string { - return '{$size.width, $size.height}' -} - -pub fn get_window_user_pointer(gwnd voidptr) voidptr { - return C.glfwGetWindowUserPointer(gwnd) -} diff --git a/vlib/oldgg/README.md b/vlib/oldgg/README.md deleted file mode 100644 index 6c52e5474e..0000000000 --- a/vlib/oldgg/README.md +++ /dev/null @@ -1,3 +0,0 @@ -`gg` will be moved to its own repository: - -https://github.com/vlang/gg diff --git a/vlib/oldgg/gg.v b/vlib/oldgg/gg.v deleted file mode 100644 index 2fc08e4906..0000000000 --- a/vlib/oldgg/gg.v +++ /dev/null @@ -1,553 +0,0 @@ -// Copyright (c) 2019-2020 Alexander Medvednikov. All rights reserved. -// Use of this source code is governed by an MIT license -// that can be found in the LICENSE file. - -module oldgg - -import stbi -import glm -import gl -import gx -import os -import glfw - -pub struct Vec2 { -pub: - x int - y int -} - -pub fn (v Vec2) str() string { - return 'Vec2{ x: $v.x y: $v.y }' -} - -pub fn vec2(x, y int) Vec2 { - res := Vec2 { - x: x - y: y - } - return res -} - -pub fn init_gg() { - glfw.init_glfw() - gl.init_glad() -} - - -pub struct Cfg { -pub: - width int - height int - use_ortho bool - retina bool - resizable bool - decorated bool = true - - font_size int - font_path string - create_window bool - window_user_ptr voidptr - window_title string - always_on_top bool - scale int -} - -pub type RenderFn fn() -pub struct GG { - shader gl.Shader - // use_ortho bool - vao u32 - rect_vao u32 - rect_vbo u32 - line_vao u32 - line_vbo u32 - vbo u32 - scale int // retina = 2 , normal = 1 -//pub: -pub mut: - width int - height int - window &glfw.Window - render_fn RenderFn -} - - -// fn new_context(width, height int, use_ortho bool, font_size int) *GG { -pub fn new_context(cfg Cfg) &GG { - mut window := &glfw.Window(0) - if cfg.create_window { - if cfg.resizable { - glfw.window_hint(C.GLFW_RESIZABLE, 1) - } else { - glfw.window_hint(C.GLFW_RESIZABLE, 0) - } - if cfg.decorated { - glfw.window_hint(C.GLFW_DECORATED, 1) - } else { - glfw.window_hint(C.GLFW_DECORATED, 0) - } - window = glfw.create_window(glfw.WinCfg{ - title: cfg.window_title - width: cfg.width - height: cfg.height - ptr: cfg.window_user_ptr - always_on_top: cfg.always_on_top - }) - window.make_context_current() - init_gg() - } - shader := gl.new_shader('simple') - shader.use() - if cfg.use_ortho { - projection := glm.ortho(0, f32(cfg.width), f32(cfg.height), 0) - shader.set_mat4('projection', projection) - } - else { - // TODO move to function (allow volt functions to return arrays without allocations) - // i := glm.identity3() - shader.set_mat4('projection', glm.identity()) - } - vao := gl.gen_vertex_array() - //println('new gg context VAO=$VAO') - vbo := gl.gen_buffer() - mut scale := 1 - if cfg.retina { - scale = 2 - } - gl.enable(C.GL_SCISSOR_TEST) - //gl.enable(GL_BLEND) - //# glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - //println('new gg text context VAO=$VAO') - //gl.bind_vao(VAO) - //gl.bind_buffer(GL_ARRAY_BUFFER, VBO) - //gl.enable_vertex_attrib_array(0) - //gl.vertex_attrib_pointer(0, 4, GL_FLOAT, false, 4, 0) - todo_remove_me(cfg, scale) - return &GG { - shader: shader - width: cfg.width - height: cfg.height - vao: vao - vbo: vbo - window: window - - // /line_vao: gl.gen_vertex_array() - // /line_vbo: gl.gen_buffer() - //text_ctx: new_context_text(cfg, scale), - scale: scale - // use_ortho: use_ortho - } - - // ctx.init_rect_vao() - //return ctx -} - -/* -pub fn (gg &GG) render_loop() bool { - for !gg.window.show_close() { - gg.render_fn() - gg.window.swap_buffers() - glfw.wait_events() - } -} -*/ - -pub fn clear(color gx.Color) { - gl.clear_color(color.r, color.g, color.b, 255) - gl.clear() -} - -pub fn (gg &GG) render() { - gg.window.swap_buffers() - glfw.wait_events() -} - -pub fn (ctx &GG) draw_triangle(x1, y1, x2, y2, x3, y3 f32, c gx.Color) { - // println('draw_triangle $x1,$y1 $x2,$y2 $x3,$y3') - ctx.shader.use() - ctx.shader.set_color('color', c) - vertices := [ - x1, y1, 0, - x2, y2, 0, - x3, y3, 0, - ] ! - // bind the Vertex Array Object first, then bind and set vertex buffer(s), - // and then configure vertex attributes(s). - gl.bind_vao(ctx.vao) - gl.set_vbo(ctx.vbo, vertices, C.GL_STATIC_DRAW) - gl.vertex_attrib_pointer(0, 3, C.GL_FLOAT, false, 3, 0) - gl.enable_vertex_attrib_array(0) - // gl.bind_buffer(GL_ARRAY_BUFFER, uint(0)) - // You can unbind the VAO afterwards so other VAO calls won't accidentally modify this VAO, - // but this rarely happens. Modifying other - // VAOs requires a call to glBindVertexArray anyways so we generally don't unbind VAOs - // (nor VBOs) when it's not directly necessary. - // gl.bind_vertex_array(uint(0)) - // gl.bind_vertex_array(ctx.VAO) - gl.draw_arrays(C.GL_TRIANGLES, 0, 3) -} - -pub fn (ctx &GG) draw_triangle_tex(x1, y1, x2, y2, x3, y3 f32, c gx.Color) { - ctx.shader.use() - ctx.shader.set_color('color', c) - ctx.shader.set_int('has_texture', 1) - vertices := [ - x1, y1, 0, 0, 0, 0, 1, 1, - x2, y2, 0, 0, 0, 0, 1, 0, - x3, y3, 0, 0, 0, 0, 0, 0, - ] ! - gl.bind_vao(ctx.vao) - gl.set_vbo(ctx.vbo, vertices, C.GL_STATIC_DRAW) - // position attribute - gl.vertex_attrib_pointer(0, 3, C.GL_FLOAT, false, 3, 0) - gl.enable_vertex_attrib_array(0) - // color attribute - gl.vertex_attrib_pointer(1, 3, C.GL_FLOAT, false, 8, 3) - gl.enable_vertex_attrib_array(1) - // texture attribute - gl.vertex_attrib_pointer(2, 2, C.GL_FLOAT, false, 8, 6) - gl.enable_vertex_attrib_array(2) - // / - // gl.draw_arrays(GL_TRIANGLES, 0, 3) - gl.draw_elements(C.GL_TRIANGLES, 6, C.GL_UNSIGNED_INT, 0) -} - -pub fn (ctx &GG) draw_rect(x, y, w, h f32, c gx.Color) { - // println('gg.draw_rect($x,$y,$w,$h)') - // wrong order - // // ctx.draw_triangle(x, y, x + w, y, x + w, y + h, c) - // // ctx.draw_triangle(x, y, x, y + h, x + w, y + h, c) - // good order. counter clockwise - // ctx.draw_triangle(x, y, x, y + h, x + w, y + h, c) - // ctx.draw_triangle(x, y, x + w, y + h, x + w, y, c) - ctx.draw_rect2(x, y, w, h, c) -} - -// Useful for debugging meshes. -pub fn set_mode_wireframe() { - C.glPolygonMode(C.GL_FRONT_AND_BACK, C.GL_LINE) -} -pub fn set_mode_point() { - C.glPolygonMode(C.GL_FRONT_AND_BACK, C.GL_POINT) -} -pub fn set_mode_fill() { - C.glPolygonMode(C.GL_FRONT_AND_BACK, C.GL_FILL) -} - -/* -fn (mut ctx GG) init_rect_vao() { - - ctx.rect_vao = gl.gen_vertex_array() - ctx.rect_vbo = gl.gen_buffer() - vertices := [ - x + w, y, 0, - x + w, y + h, 0, - x, y + h, 0, - x, y, 0, - ] ! - indices := [ - 0, 1, 3,// first triangle - 1, 2, 3// second triangle - ] ! - gl.bind_vao(ctx.rect_vao) - gl.set_vbo(ctx.rect_vbo, vertices, C.GL_STATIC_DRAW) - ebo := gl.gen_buffer() - // /////// - gl.set_ebo(ebo, indices, C.GL_STATIC_DRAW) -} -*/ -pub fn (ctx &GG) draw_rect2(x, y, w, h f32, c gx.Color) { - C.glDeleteBuffers(1, &ctx.vao) - C.glDeleteBuffers(1, &ctx.vbo) - ctx.shader.use() - ctx.shader.set_color('color', c) - ctx.shader.set_int('has_texture', 0) - // 4--1 - // 3--2 - $if linux { - // y += h - } - vertices := [ - x + w, y, 0, - x + w, y + h, 0, - x, y + h, 0, - x, y, 0, - ] ! - indices := [ - 0, 1, 3,// first triangle - 1, 2, 3// second triangle - ] ! - gl.bind_vao(ctx.vao) - gl.set_vbo(ctx.vbo, vertices, C.GL_STATIC_DRAW) - ebo := gl.gen_buffer() - // /////// - gl.set_ebo(ebo, indices, C.GL_STATIC_DRAW)// !!! LEAKS - // ///// - gl.vertex_attrib_pointer(0, 3, C.GL_FLOAT, false, 3, 0) - gl.enable_vertex_attrib_array(0) - // gl.bind_vao(ctx.rect_vao) - gl.bind_vao(ctx.vao) - gl.draw_elements(C.GL_TRIANGLES, 6, C.GL_UNSIGNED_INT, 0) - C.glDeleteBuffers(1, &ebo) -} - -fn todo_remove_me(cfg Cfg, scale int) { - // Can only have text in ortho mode - if !cfg.use_ortho { - return - } - width := cfg.width * scale - height := cfg.height * scale - //font_size := cfg.font_size * scale - gl.enable(C.GL_BLEND) - //# glBlendFunc(C.GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - shader := gl.new_shader('text') - shader.use() - projection := glm.ortho(0, f32(width), 0, f32(height))// 0 at BOT - // projection_new := ortho(0, width, 0, height)// 0 at BOT - // projection := gl.ortho(0, width,height,0) // 0 at TOP - shader.set_mat4('projection', projection) - vao := gl.gen_vertex_array() - //println('new gg text context VAO=$VAO') - vbo := gl.gen_buffer() - gl.bind_vao(vao) - gl.bind_buffer(C.GL_ARRAY_BUFFER, vbo) - gl.enable_vertex_attrib_array(0) - gl.vertex_attrib_pointer(0, 4, C.GL_FLOAT, false, 4, 0) -} - -fn update() { - // # ui__post_empty_event(); -} - -pub fn post_empty_event() { - glfw.post_empty_event() -} - -pub fn (c GG) circle(x, y, r int) { -} - -fn (c GG) fill_color(color gx.Color) { -} - -fn (c GG) fill() { -} - -fn (c GG) move_to(x, y int) { -} - -fn (c GG) line_to(x, y int) { -} - -fn (c GG) stroke_width(size int) { -} - -fn (c GG) stroke_color(color gx.Color) { -} - -fn (c GG) stroke() { -} - -fn (c GG) save() { -} - -fn (c GG) restore() { -} - -fn (c GG) intersect_scissor(x, y, w, h int) { -} - -fn (c GG) translate(x, y int) { -} - -fn (c GG) create_font(name, file string) int { - return 0 -} - -fn (c GG) text(x, y int, text string) { -} - -fn (c GG) text_box(x, y, max int, text string) { -} - -fn (c GG) font_face(f string) { -} - -fn (c GG) font_size(size int) { -} - -fn (c GG) text_align(a int) { -} - -pub fn (ctx &GG) create_image(file string) u32 { - return create_image(file) -} - -pub fn create_image(file string) u32 { - //println('gg create image "$file"') - if file.contains('twitch') { - return u32(0)// TODO - } - if !os.exists(file) { - println('gg create image no such file "$file"') - return u32(0) - } - texture := gl.gen_texture() - img := stbi.load(file) - gl.bind_2d_texture(texture) - img.tex_image_2d() - gl.generate_mipmap(C.GL_TEXTURE_2D) - img.free() - return texture -} - -pub fn create_image_from_memory(buf byteptr) u32 { - texture := gl.gen_texture() - img := stbi.load_from_memory(buf) - // TODO copy pasta - gl.bind_2d_texture(texture) - img.tex_image_2d() - gl.generate_mipmap(C.GL_TEXTURE_2D) - img.free() - return texture -} - -pub fn (ctx &GG) draw_line(x, y, x2, y2 f32, color gx.Color) { - ctx.use_color_shader(color) - vertices := [x, y, x2, y2] ! - ctx.bind_vertices(vertices) - gl.draw_arrays(C.GL_LINES, 0, 2) -} - -pub fn (ctx &GG) draw_arc(x, y, r, start_angle, end_angle f32, segments int, color gx.Color) { - ctx.use_color_shader(color) - vertices := arc_vertices(x, y, r, start_angle, end_angle, segments) - ctx.bind_vertices(vertices) - gl.draw_arrays(C.GL_LINE_STRIP, 0, segments + 1) - unsafe { vertices.free() } -} - -pub fn (ctx &GG) draw_filled_arc(x, y, r, start_angle, end_angle f32, segments int, color gx.Color) { - ctx.use_color_shader(color) - - - mut vertices := []f32{} - vertices << [x, y] ! - vertices << arc_vertices(x, y, r, start_angle, end_angle, segments) - ctx.bind_vertices(vertices) - gl.draw_arrays(C.GL_TRIANGLE_FAN, 0, segments + 2) - unsafe { vertices.free() } -} - -pub fn (ctx &GG) draw_circle(x, y, r f32, color gx.Color) { - ctx.draw_filled_arc(x, y, r, 0, 360, 24 + int(r / 2), color) -} - -pub fn (ctx &GG) draw_rounded_rect(x, y, w, h, r f32, color gx.Color) { - ctx.use_color_shader(color) - mut vertices := []f32{} - segments := 6 + int(r / 8) - - // Create a rounded rectangle using a triangle fan mesh. - vertices << [x + (w/2.0), y + (h/2.0)] ! - vertices << arc_vertices(x + w - r, y + h - r, r, 0, 90, segments) - vertices << arc_vertices(x + r, y + h - r, r, 90, 180, segments) - vertices << arc_vertices(x + r, y + r, r, 180, 270, segments) - vertices << arc_vertices(x + w - r, y + r, r, 270, 360, segments) - // Finish the loop by going back to the first vertex - vertices << [vertices[2], vertices[3]] ! - - ctx.bind_vertices(vertices) - gl.draw_arrays(C.GL_TRIANGLE_FAN, 0, segments * 4 + 6) - unsafe { vertices.free() } -} - -pub fn (ctx &GG) draw_empty_rounded_rect(x, y, w, h, r f32, color gx.Color) { - ctx.use_color_shader(color) - mut vertices := []f32{} - segments := 6 + int(r / 8) - - vertices << arc_vertices(x + w - r, y + h - r, r, 0, 90, segments) - vertices << arc_vertices(x + r, y + h - r, r, 90, 180, segments) - vertices << arc_vertices(x + r, y + r, r, 180, 270, segments) - vertices << arc_vertices(x + w - r, y + r, r, 270, 360, segments) - - ctx.bind_vertices(vertices) - gl.draw_arrays(C.GL_LINE_STRIP, 0, segments * 4 + 1) - unsafe { vertices.free() } -} - -/* -pub fn (c &GG) draw_gray_line(x, y, x2, y2 f32) { - c.draw_line(x, y, x2, y2, gx.gray) -} - -pub fn (c &GG) draw_vertical(x, y, height int) { - c.draw_line(x, y, x, y + height) -} -*/ - - -//ctx.gg.draw_line(center + prev_x, center+prev_y, center + x*10.0, center+y) - -// fn (ctx &GG) draw_image(x, y, w, h f32, img stbi.Image) { -pub fn (ctx &GG) draw_image(x, y, w, h f32, tex_id u32) { - - // NB: HACK to ensure same state ... TODO: remove next line - ctx.draw_empty_rect(0,0,0,0, gx.white) - - last_array_buffer := 0 - last_texture := 0 - C.glGetIntegerv(C.GL_ARRAY_BUFFER_BINDING, &last_array_buffer) - C.glGetIntegerv(C.GL_TEXTURE_BINDING_2D, &last_texture) - - // println('DRAW IMAGE $x $y $w $h $tex_id') - ctx.shader.use() - // ctx.shader.set_color('color', c) - ctx.shader.set_int('has_texture', 1) - // 4--1 - // | | - // 3--2 - vertices := [ - x + w, y, 0, 1, 0, 0, 1, 1, - x + w, y + h, 0, 0, 1, 0, 1, 0, - x, y + h, 0, 0, 0, 1, 0, 0, - x, y, 0, 1, 1, 0, 0, 1, - ] ! - indices := [ - 0, 1, 3,// first triangle - 1, 2, 3// second triangle - ] ! - // VAO := gl.gen_vertex_array() - // VBO := gl.gen_buffer() - C.glEnable(C.GL_TEXTURE_2D) - gl.bind_vao(ctx.vao) - gl.set_vbo(ctx.vbo, vertices, C.GL_STATIC_DRAW) - ebo := gl.gen_buffer() - gl.set_ebo(ebo, indices, C.GL_STATIC_DRAW) - gl.vertex_attrib_pointer(0, 3, C.GL_FLOAT, false, 8, 0) - gl.enable_vertex_attrib_array(0) - gl.vertex_attrib_pointer(1, 3, C.GL_FLOAT, false, 8, 3) - gl.enable_vertex_attrib_array(1) - gl.vertex_attrib_pointer(2, 2, C.GL_FLOAT, false, 8, 6) - gl.enable_vertex_attrib_array(2) - gl.bind_2d_texture(tex_id) - gl.bind_vao(ctx.vao) - gl.draw_elements(C.GL_TRIANGLES, 6, C.GL_UNSIGNED_INT, 0) - C.glDisable(C.GL_TEXTURE_2D) - // restore state - C.glBindBuffer(C.GL_ARRAY_BUFFER, last_array_buffer) - C. glBindTexture(C.GL_TEXTURE_2D, last_texture) -} - -pub fn (c &GG) draw_empty_rect(x, y, w, h f32, color gx.Color) { - c.draw_line(x, y, x + w, y, color) - c.draw_line(x, y, x, y + h, color) - c.draw_line(x, y + h, x + w, y + h, color) - c.draw_line(x + w, y, x + w, y + h, color) -} - -pub fn scissor(x, y, w, h f32) { - C.glScissor(x, y, w, h) -} diff --git a/vlib/oldgg/utils.v b/vlib/oldgg/utils.v deleted file mode 100644 index 7a97e146b8..0000000000 --- a/vlib/oldgg/utils.v +++ /dev/null @@ -1,37 +0,0 @@ -module oldgg - -import gl -import gx -import math - -fn arc_vertices(x, y, r, start_angle, end_angle f32, segments int) []f32 { - mut vertices := []f32{} - start_rads := start_angle * 0.0174533 // deg -> rad approx - end_rads := end_angle * 0.0174533 - increment := (end_rads - start_rads) / f32(segments) - vertices << [x + f32(math.cos(start_rads)) * r, y + f32(math.sin(start_rads)) * r] ! - mut i := 1 - for i < segments { - theta := f32(i) * increment + start_rads - vertices << [x + f32(math.cos(theta)) * r, y + f32(math.sin(theta)) * r] ! - i++ - } - vertices << [x + f32(math.cos(end_rads)) * r, y + f32(math.sin(end_rads)) * r] ! - return vertices -} - -fn (ctx &GG) use_color_shader(color gx.Color) { - ctx.shader.set_int('has_texture', 0) - C.glDeleteBuffers(1, &ctx.vao) - C.glDeleteBuffers(1, &ctx.vbo) - ctx.shader.use() - ctx.shader.set_color('color', color) -} - -fn (ctx &GG) bind_vertices(vertices []f32) { - gl.bind_vao(ctx.vao) - gl.set_vbo(ctx.vbo, vertices, C.GL_STATIC_DRAW) - gl.vertex_attrib_pointer(0, 2, C.GL_FLOAT, false, 2, 0) - gl.enable_vertex_attrib_array(0) - gl.bind_vao(ctx.vao) -} diff --git a/vlib/v/gen/comptime.v b/vlib/v/gen/comptime.v index 8671c63abd..e83e109c08 100644 --- a/vlib/v/gen/comptime.v +++ b/vlib/v/gen/comptime.v @@ -100,12 +100,16 @@ fn (mut g Gen) comp_if(it ast.CompIf) { } fn (mut g Gen) comp_for(node ast.CompFor) { - g.writeln('// comptime $' + 'for {') + g.writeln('// 2comptime $' + 'for {') sym := g.table.get_type_symbol(g.unwrap_generic(node.typ)) + vweb_result_type := table.new_type(g.table.find_type_idx('vweb.Result')) mut i := 0 // g.writeln('string method = tos_lit("");') for method in sym.methods { - if method.attrs.len == 0 { + // if method.attrs.len == 0 { + // continue + // } + if method.return_type != vweb_result_type { // table.void_type { continue } g.comp_for_method = method.name @@ -117,7 +121,11 @@ fn (mut g Gen) comp_for(node ast.CompFor) { if i == 0 { g.write('\tstring ') } - g.writeln('attrs = tos_lit("${method.attrs[0]}");') + if method.attrs.len == 0 { + g.writeln('attrs = tos_lit("");') + } else { + g.writeln('attrs = tos_lit("${method.attrs[0]}");') + } g.stmts(node.stmts) i++ g.writeln('') diff --git a/vlib/vweb/vweb.v b/vlib/vweb/vweb.v index 9e3fdb0554..ae73a4c1c1 100644 --- a/vlib/vweb/vweb.v +++ b/vlib/vweb/vweb.v @@ -54,6 +54,14 @@ pub mut: page_gen_start i64 } +pub struct Cookie { + name string + value string + exprires time.Time + secure bool + http_only bool +} + pub struct Result {} fn (mut ctx Context) send_response_to_client(mimetype string, res string) bool { @@ -108,10 +116,17 @@ pub fn (mut ctx Context) not_found() Result { return vweb.Result{} } -pub fn (mut ctx Context) set_cookie(key, val string) { +pub fn (mut ctx Context) set_cookie(cookie Cookie) { + secure := if cookie.secure { "Secure;" } else { "" } + http_only := if cookie.http_only { "HttpOnly" } else { "" } + ctx.add_header('Set-Cookie', '$cookie.name=$cookie.value; $secure $http_only') +} + +pub fn (mut ctx Context) set_cookie_old(key, val string) { // TODO support directives, escape cookie value (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie) //println('Set-Cookie $key=$val') - ctx.add_header('Set-Cookie', '${key}=${val}; Secure; HttpOnly') + //ctx.add_header('Set-Cookie', '${key}=${val}; Secure; HttpOnly') + ctx.add_header('Set-Cookie', '${key}=${val}; HttpOnly') } pub fn (mut ctx Context) set_content_type(typ string) { @@ -313,39 +328,72 @@ fn handle_conn(conn net.Socket, mut app T) { } app.init() // Call the right action + println('route matching...') + t := time.ticks() mut action := '' mut route_words := []string{} mut ok := true url_words := vals[1][1..].split('/') mut vars := []string{cap: route_words.len} + $for method in T { ok = true - route_words = attrs[1..].split('/') - //println('words:') println(route_words) - //println('vals:') println(url_words) - vars = []string{cap: route_words.len} - if route_words.len <= url_words.len { - // match `/:user/:repo/tree` to `/vlang/v/tree` - for i, word in route_words { - if word.starts_with(':') { - // remember and skip the var - vars << url_words[i] - continue - } - if word != url_words[i] { - ok = false - break - } - } - if ok { - action = method - println('OK !! $action="$action"') + println('\n\n method = $method urlwords=') + println(url_words) + println('attrs=$attrs') + if attrs == '' { + // No routing for this method. If it matches, call it and finish matching + // since such methods have a priority. + // For example URL `/register` matches route `/:user`, but `fn register()` + // should be called first. + println('no attrs for ${url_words[0]}') + if url_words[0] == method { + println('easy match $method') + vars = [] app.$method(vars) conn.close() or {} return } } + else { + //println('ATTR=$attrs') + route_words = attrs[1..].split('/') + //println('words:') println(route_words) + //println('vals:') println(url_words) + vars = []string{cap: route_words.len} + if route_words.len <= url_words.len { + // match `/:user/:repo/tree` to `/vlang/v/tree` + for i, word in route_words { + if word.starts_with(':') { + // remember and skip the var + vars << url_words[i] + continue + } + if word != url_words[i] { + ok = false + break + } + } + if ok { + //goto end // TODO break in $for + if !route_words[0].starts_with(':') { + // Routes without variables have higher priority, so call it right now + // e.g. `/register` matches `['/:user']`, but `['/register']` should be called first. + //println('OK not var $action="$action"') + app.$method(vars) + conn.close() or {} + return + } + action = method + println('setting action to $method') + } + } + } } + if action == '' { + conn.send_string(http_404) or {} + } + //end: // No route matched, just do a simple `/home` => `action=home` if action == '' { //println('action is empty because no routes were matched...') @@ -357,10 +405,11 @@ fn handle_conn(conn net.Socket, mut app T) { action = 'index' } } - //$if debug { + $if debug { println('action=$action') - //} + } + println('route matching took ${time.ticks() - t}ms') app.$action() /* app.$action() or {