From 09887f2ea92f8b40c7be9f8dd2b5a46c9363d8e1 Mon Sep 17 00:00:00 2001 From: chaoskagami Date: Sat, 16 Jul 2016 04:13:12 -0400 Subject: [PATCH] Unscrew makefile --- Makefile | 35 +- external/glfw-3.1.1/COPYING.txt | 22 - external/glfw-3.1.1/include/GLFW/glfw3.h | 3340 ----------------- .../glfw-3.1.1/include/GLFW/glfw3native.h | 356 -- external/glfw-3.1.1/lib-mingw-i686/glfw3dll.a | Bin 54834 -> 0 bytes external/glfw-3.1.1/lib-mingw-i686/libglfw3.a | Bin 89732 -> 0 bytes .../glfw-3.1.1/lib-mingw-x86_64/glfw3dll.a | Bin 53500 -> 0 bytes .../glfw-3.1.1/lib-mingw-x86_64/libglfw3.a | Bin 97354 -> 0 bytes 8 files changed, 21 insertions(+), 3732 deletions(-) delete mode 100644 external/glfw-3.1.1/COPYING.txt delete mode 100644 external/glfw-3.1.1/include/GLFW/glfw3.h delete mode 100644 external/glfw-3.1.1/include/GLFW/glfw3native.h delete mode 100644 external/glfw-3.1.1/lib-mingw-i686/glfw3dll.a delete mode 100644 external/glfw-3.1.1/lib-mingw-i686/libglfw3.a delete mode 100644 external/glfw-3.1.1/lib-mingw-x86_64/glfw3dll.a delete mode 100644 external/glfw-3.1.1/lib-mingw-x86_64/libglfw3.a diff --git a/Makefile b/Makefile index f4542ec..b226cd2 100644 --- a/Makefile +++ b/Makefile @@ -7,24 +7,31 @@ HARDWARE_FILES := source/hardware/*.cpp PROCESS9_FILES := source/process9/*.cpp source/process9/archive/*.cpp UTIL_FILES := source/util/*.cpp - #COMMON_FILES := source/Bootloader.cpp source/arm/*.cpp $(ARM_FILES) $(KERNEL_FILES) $(HARDWARE_FILES) $(PROCESS9_FILES) $(UTIL_FILES) -COMMON_FILES := source/citraimport/glad/src/glad.c external/imgui/imgui.cpp external/imgui/imgui_draw.cpp external/imgui/examples/opengl3_example/imgui_impl_glfw_gl3.cpp $(shell for file in `find source -name *.cpp`; do echo $$file; done) +SOURCE_FILES := source/citraimport/glad/src/glad.o external/imgui/imgui.o external/imgui/examples/opengl3_example/imgui_impl_glfw_gl3.o $(shell for file in `find source -name *.cpp`; do echo $$file ; done) + +CFLAGS := -I$(PWD)/include -Isource/citraimport -I$(PWD)/external/gl3w/include -I$(PWD)/external/imgui -g --std=c11 $(ARM_FLAGS) -mtune=native -msse4.1 -Wfatal-errors +CXXFLAGS := -I$(PWD)/include -Isource/citraimport -I$(PWD)/external/gl3w/include -I$(PWD)/external/imgui -g --std=c++11 $(ARM_FLAGS) -mtune=native -msse4.1 -Wfatal-errors +LDFLAGS := -L/opt/local/lib -Lexternal/gl3w -lpthread -lX11 -lXxf86vm -lXrender -lXcursor -lXrandr -lXinerama -lglfw3 -lgl3w -lGL -ldl + +COMMON_FILES := $(patsubst %.cpp,%.o,$(patsubst %.c,%.o,$(SOURCE_FILES))) +xds: $(COMMON_FILES) source/Main.cpp + echo $(COMMON_FILES) + g++ -o xds $(TEST_DEFS) $(BUILD_FLAGS) $(COMMON_FILES) $(LDFLAGS) -BUILD_FLAGS := -I/opt/local/include -Iinclude -Isource/citraimport -Iexternal/gl3w/include -Iexternal/imgui -g --std=c++11 $(ARM_FLAGS) -mtune=native -msse4.1 -Wfatal-errors -LINK_FLAGS := -L/opt/local/lib -Lexternal/gl3w -lglfw -lpthread -lgl3w -liconv -framework OpenGL -framework Cocoa +%.o: %.c + gcc $(CFLAGS) -c -o $@ $< -main: - g++ -c source/Main.cpp $(TEST_DEFS) $(BUILD_FLAGS) $(COMMON_FILES) - g++ -o xds $(TEST_DEFS) $(BUILD_FLAGS) $(LINK_FLAGS) *.o +%.o: %.cpp + g++ $(CXXFLAGS) -c -o $@ $< -test: - g++ -o xds_test_memorymap tests/kernel/MemoryMap.cpp $(TEST_DEFS) $(BUILD_FLAGS) $(COMMON_FILES) - g++ -o xds_test_handletable tests/kernel/HandleTable.cpp $(TEST_DEFS) $(BUILD_FLAGS) $(COMMON_FILES) - g++ -o xds_test_linkedlist tests/kernel/LinkedList.cpp $(TEST_DEFS) $(BUILD_FLAGS) $(COMMON_FILES) - g++ -o xds_test_resourcelimit tests/kernel/ResourceLimit.cpp $(TEST_DEFS) $(BUILD_FLAGS) $(COMMON_FILES) - g++ -o xds_test_mutex tests/util/Mutex.cpp $(TEST_DEFS) $(BUILD_FLAGS) $(COMMON_FILES) +test: tests/kernel/MemoryMap.o tests/kernel/HandleTable.o tests/kernel/LinkedList.o tests/kernel/ResourceLimit.o tests/util/Mutex.o + g++ -o xds_test_memorymap tests/kernel/MemoryMap.o $(TEST_DEFS) $(BUILD_FLAGS) $(COMMON_FILES) + g++ -o xds_test_handletable tests/kernel/HandleTable.o $(TEST_DEFS) $(BUILD_FLAGS) $(COMMON_FILES) + g++ -o xds_test_linkedlist tests/kernel/LinkedList.o $(TEST_DEFS) $(BUILD_FLAGS) $(COMMON_FILES) + g++ -o xds_test_resourcelimit tests/kernel/ResourceLimit.o $(TEST_DEFS) $(BUILD_FLAGS) $(COMMON_FILES) + g++ -o xds_test_mutex tests/util/Mutex.o $(TEST_DEFS) $(BUILD_FLAGS) $(COMMON_FILES) runtests: ./xds_test_memorymap @@ -34,4 +41,4 @@ runtests: ./xds_test_mutex clean: - rm ./*.o ./xds ./xds_test_memorymap ./xds_test_handletable ./xds_test_linkedlist ./xds_test_resourcelimit ./xds_test_mutex + rm -f $(COMMON_FILES) ./xds ./xds_test_memorymap ./xds_test_handletable ./xds_test_linkedlist ./xds_test_resourcelimit ./xds_test_mutex diff --git a/external/glfw-3.1.1/COPYING.txt b/external/glfw-3.1.1/COPYING.txt deleted file mode 100644 index b30c701..0000000 --- a/external/glfw-3.1.1/COPYING.txt +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2002-2006 Marcus Geelnard -Copyright (c) 2006-2010 Camilla Berglund - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would - be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and must not - be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source - distribution. - diff --git a/external/glfw-3.1.1/include/GLFW/glfw3.h b/external/glfw-3.1.1/include/GLFW/glfw3.h deleted file mode 100644 index 009fa75..0000000 --- a/external/glfw-3.1.1/include/GLFW/glfw3.h +++ /dev/null @@ -1,3340 +0,0 @@ -/************************************************************************* - * GLFW 3.1 - www.glfw.org - * A library for OpenGL, window and input - *------------------------------------------------------------------------ - * Copyright (c) 2002-2006 Marcus Geelnard - * Copyright (c) 2006-2010 Camilla Berglund - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would - * be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and must not - * be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - * - *************************************************************************/ - -#ifndef _glfw3_h_ -#define _glfw3_h_ - -#ifdef __cplusplus -extern "C" { -#endif - - -/************************************************************************* - * Doxygen documentation - *************************************************************************/ - -/*! @defgroup context Context handling - * - * This is the reference documentation for context related functions. For more - * information, see the @ref context. - */ -/*! @defgroup init Initialization, version and errors - * - * This is the reference documentation for initialization and termination of - * the library, version management and error handling. For more information, - * see the @ref intro. - */ -/*! @defgroup input Input handling - * - * This is the reference documentation for input related functions and types. - * For more information, see the @ref input. - */ -/*! @defgroup monitor Monitor handling - * - * This is the reference documentation for monitor related functions and types. - * For more information, see the @ref monitor. - */ -/*! @defgroup window Window handling - * - * This is the reference documentation for window related functions and types, - * including creation, deletion and event polling. For more information, see - * the @ref window. - */ - - -/************************************************************************* - * Compiler- and platform-specific preprocessor work - *************************************************************************/ - -/* If we are we on Windows, we want a single define for it. - */ -#if !defined(_WIN32) && (defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__)) - #define _WIN32 -#endif /* _WIN32 */ - -/* It is customary to use APIENTRY for OpenGL function pointer declarations on - * all platforms. Additionally, the Windows OpenGL header needs APIENTRY. - */ -#ifndef APIENTRY - #ifdef _WIN32 - #define APIENTRY __stdcall - #else - #define APIENTRY - #endif -#endif /* APIENTRY */ - -/* Some Windows OpenGL headers need this. - */ -#if !defined(WINGDIAPI) && defined(_WIN32) - #define WINGDIAPI __declspec(dllimport) - #define GLFW_WINGDIAPI_DEFINED -#endif /* WINGDIAPI */ - -/* Some Windows GLU headers need this. - */ -#if !defined(CALLBACK) && defined(_WIN32) - #define CALLBACK __stdcall - #define GLFW_CALLBACK_DEFINED -#endif /* CALLBACK */ - -/* Most Windows GLU headers need wchar_t. - * The OS X OpenGL header blocks the definition of ptrdiff_t by glext.h. - */ -#if !defined(GLFW_INCLUDE_NONE) - #include -#endif - -/* Include the chosen client API headers. - */ -#if defined(__APPLE_CC__) - #if defined(GLFW_INCLUDE_GLCOREARB) - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - #elif !defined(GLFW_INCLUDE_NONE) - #if !defined(GLFW_INCLUDE_GLEXT) - #define GL_GLEXT_LEGACY - #endif - #include - #endif - #if defined(GLFW_INCLUDE_GLU) - #include - #endif -#else - #if defined(GLFW_INCLUDE_GLCOREARB) - #include - #elif defined(GLFW_INCLUDE_ES1) - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - #elif defined(GLFW_INCLUDE_ES2) - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - #elif defined(GLFW_INCLUDE_ES3) - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - #elif defined(GLFW_INCLUDE_ES31) - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - #elif !defined(GLFW_INCLUDE_NONE) - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - #endif - #if defined(GLFW_INCLUDE_GLU) - #include - #endif -#endif - -#if defined(GLFW_DLL) && defined(_GLFW_BUILD_DLL) - /* GLFW_DLL must be defined by applications that are linking against the DLL - * version of the GLFW library. _GLFW_BUILD_DLL is defined by the GLFW - * configuration header when compiling the DLL version of the library. - */ - #error "You may 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 1 -/*! @brief The revision number of the GLFW library. - * - * This is incremented when a bug fix release is made that does not contain any - * API changes. - * @ingroup init - */ -#define GLFW_VERSION_REVISION 1 -/*! @} */ - -/*! @name Key and button actions - * @{ */ -/*! @brief The key or mouse button was released. - * - * The key or mouse button was released. - * - * @ingroup input - */ -#define GLFW_RELEASE 0 -/*! @brief The key or mouse button was pressed. - * - * The key or mouse button was pressed. - * - * @ingroup input - */ -#define GLFW_PRESS 1 -/*! @brief The key was held down until it repeated. - * - * The key was held down until it repeated. - * - * @ingroup input - */ -#define GLFW_REPEAT 2 -/*! @} */ - -/*! @defgroup keys Keyboard keys - * - * See [key input](@ref input_key) for how these are used. - * - * These key codes are inspired by the _USB HID Usage Tables v1.12_ (p. 53-60), - * but re-arranged to map to 7-bit ASCII for printable keys (function keys are - * put in the 256+ range). - * - * The naming of the key codes follow these rules: - * - The US keyboard layout is used - * - Names of printable alpha-numeric characters are used (e.g. "A", "R", - * "3", etc.) - * - For non-alphanumeric characters, Unicode:ish names are used (e.g. - * "COMMA", "LEFT_SQUARE_BRACKET", etc.). Note that some names do not - * correspond to the Unicode standard (usually for brevity) - * - Keys that lack a clear US mapping are named "WORLD_x" - * - For non-printable keys, custom names are used (e.g. "F4", - * "BACKSPACE", etc.) - * - * @ingroup input - * @{ - */ - -/* The unknown key */ -#define GLFW_KEY_UNKNOWN -1 - -/* Printable keys */ -#define GLFW_KEY_SPACE 32 -#define GLFW_KEY_APOSTROPHE 39 /* ' */ -#define GLFW_KEY_COMMA 44 /* , */ -#define GLFW_KEY_MINUS 45 /* - */ -#define GLFW_KEY_PERIOD 46 /* . */ -#define GLFW_KEY_SLASH 47 /* / */ -#define GLFW_KEY_0 48 -#define GLFW_KEY_1 49 -#define GLFW_KEY_2 50 -#define GLFW_KEY_3 51 -#define GLFW_KEY_4 52 -#define GLFW_KEY_5 53 -#define GLFW_KEY_6 54 -#define GLFW_KEY_7 55 -#define GLFW_KEY_8 56 -#define GLFW_KEY_9 57 -#define GLFW_KEY_SEMICOLON 59 /* ; */ -#define GLFW_KEY_EQUAL 61 /* = */ -#define GLFW_KEY_A 65 -#define GLFW_KEY_B 66 -#define GLFW_KEY_C 67 -#define GLFW_KEY_D 68 -#define GLFW_KEY_E 69 -#define GLFW_KEY_F 70 -#define GLFW_KEY_G 71 -#define GLFW_KEY_H 72 -#define GLFW_KEY_I 73 -#define GLFW_KEY_J 74 -#define GLFW_KEY_K 75 -#define GLFW_KEY_L 76 -#define GLFW_KEY_M 77 -#define GLFW_KEY_N 78 -#define GLFW_KEY_O 79 -#define GLFW_KEY_P 80 -#define GLFW_KEY_Q 81 -#define GLFW_KEY_R 82 -#define GLFW_KEY_S 83 -#define GLFW_KEY_T 84 -#define GLFW_KEY_U 85 -#define GLFW_KEY_V 86 -#define GLFW_KEY_W 87 -#define GLFW_KEY_X 88 -#define GLFW_KEY_Y 89 -#define GLFW_KEY_Z 90 -#define GLFW_KEY_LEFT_BRACKET 91 /* [ */ -#define GLFW_KEY_BACKSLASH 92 /* \ */ -#define GLFW_KEY_RIGHT_BRACKET 93 /* ] */ -#define GLFW_KEY_GRAVE_ACCENT 96 /* ` */ -#define GLFW_KEY_WORLD_1 161 /* non-US #1 */ -#define GLFW_KEY_WORLD_2 162 /* non-US #2 */ - -/* Function keys */ -#define GLFW_KEY_ESCAPE 256 -#define GLFW_KEY_ENTER 257 -#define GLFW_KEY_TAB 258 -#define GLFW_KEY_BACKSPACE 259 -#define GLFW_KEY_INSERT 260 -#define GLFW_KEY_DELETE 261 -#define GLFW_KEY_RIGHT 262 -#define GLFW_KEY_LEFT 263 -#define GLFW_KEY_DOWN 264 -#define GLFW_KEY_UP 265 -#define GLFW_KEY_PAGE_UP 266 -#define GLFW_KEY_PAGE_DOWN 267 -#define GLFW_KEY_HOME 268 -#define GLFW_KEY_END 269 -#define GLFW_KEY_CAPS_LOCK 280 -#define GLFW_KEY_SCROLL_LOCK 281 -#define GLFW_KEY_NUM_LOCK 282 -#define GLFW_KEY_PRINT_SCREEN 283 -#define GLFW_KEY_PAUSE 284 -#define GLFW_KEY_F1 290 -#define GLFW_KEY_F2 291 -#define GLFW_KEY_F3 292 -#define GLFW_KEY_F4 293 -#define GLFW_KEY_F5 294 -#define GLFW_KEY_F6 295 -#define GLFW_KEY_F7 296 -#define GLFW_KEY_F8 297 -#define GLFW_KEY_F9 298 -#define GLFW_KEY_F10 299 -#define GLFW_KEY_F11 300 -#define GLFW_KEY_F12 301 -#define GLFW_KEY_F13 302 -#define GLFW_KEY_F14 303 -#define GLFW_KEY_F15 304 -#define GLFW_KEY_F16 305 -#define GLFW_KEY_F17 306 -#define GLFW_KEY_F18 307 -#define GLFW_KEY_F19 308 -#define GLFW_KEY_F20 309 -#define GLFW_KEY_F21 310 -#define GLFW_KEY_F22 311 -#define GLFW_KEY_F23 312 -#define GLFW_KEY_F24 313 -#define GLFW_KEY_F25 314 -#define GLFW_KEY_KP_0 320 -#define GLFW_KEY_KP_1 321 -#define GLFW_KEY_KP_2 322 -#define GLFW_KEY_KP_3 323 -#define GLFW_KEY_KP_4 324 -#define GLFW_KEY_KP_5 325 -#define GLFW_KEY_KP_6 326 -#define GLFW_KEY_KP_7 327 -#define GLFW_KEY_KP_8 328 -#define GLFW_KEY_KP_9 329 -#define GLFW_KEY_KP_DECIMAL 330 -#define GLFW_KEY_KP_DIVIDE 331 -#define GLFW_KEY_KP_MULTIPLY 332 -#define GLFW_KEY_KP_SUBTRACT 333 -#define GLFW_KEY_KP_ADD 334 -#define GLFW_KEY_KP_ENTER 335 -#define GLFW_KEY_KP_EQUAL 336 -#define GLFW_KEY_LEFT_SHIFT 340 -#define GLFW_KEY_LEFT_CONTROL 341 -#define GLFW_KEY_LEFT_ALT 342 -#define GLFW_KEY_LEFT_SUPER 343 -#define GLFW_KEY_RIGHT_SHIFT 344 -#define GLFW_KEY_RIGHT_CONTROL 345 -#define GLFW_KEY_RIGHT_ALT 346 -#define GLFW_KEY_RIGHT_SUPER 347 -#define GLFW_KEY_MENU 348 -#define GLFW_KEY_LAST GLFW_KEY_MENU - -/*! @} */ - -/*! @defgroup mods Modifier key flags - * - * See [key input](@ref input_key) for how these are used. - * - * @ingroup input - * @{ */ - -/*! @brief If this bit is set one or more Shift keys were held down. - */ -#define GLFW_MOD_SHIFT 0x0001 -/*! @brief If this bit is set one or more Control keys were held down. - */ -#define GLFW_MOD_CONTROL 0x0002 -/*! @brief If this bit is set one or more Alt keys were held down. - */ -#define GLFW_MOD_ALT 0x0004 -/*! @brief If this bit is set one or more Super keys were held down. - */ -#define GLFW_MOD_SUPER 0x0008 - -/*! @} */ - -/*! @defgroup buttons Mouse buttons - * - * See [mouse button input](@ref input_mouse_button) for how these are used. - * - * @ingroup input - * @{ */ -#define GLFW_MOUSE_BUTTON_1 0 -#define GLFW_MOUSE_BUTTON_2 1 -#define GLFW_MOUSE_BUTTON_3 2 -#define GLFW_MOUSE_BUTTON_4 3 -#define GLFW_MOUSE_BUTTON_5 4 -#define GLFW_MOUSE_BUTTON_6 5 -#define GLFW_MOUSE_BUTTON_7 6 -#define GLFW_MOUSE_BUTTON_8 7 -#define GLFW_MOUSE_BUTTON_LAST GLFW_MOUSE_BUTTON_8 -#define GLFW_MOUSE_BUTTON_LEFT GLFW_MOUSE_BUTTON_1 -#define GLFW_MOUSE_BUTTON_RIGHT GLFW_MOUSE_BUTTON_2 -#define GLFW_MOUSE_BUTTON_MIDDLE GLFW_MOUSE_BUTTON_3 -/*! @} */ - -/*! @defgroup joysticks Joysticks - * - * See [joystick input](@ref joystick) for how these are used. - * - * @ingroup input - * @{ */ -#define GLFW_JOYSTICK_1 0 -#define GLFW_JOYSTICK_2 1 -#define GLFW_JOYSTICK_3 2 -#define GLFW_JOYSTICK_4 3 -#define GLFW_JOYSTICK_5 4 -#define GLFW_JOYSTICK_6 5 -#define GLFW_JOYSTICK_7 6 -#define GLFW_JOYSTICK_8 7 -#define GLFW_JOYSTICK_9 8 -#define GLFW_JOYSTICK_10 9 -#define GLFW_JOYSTICK_11 10 -#define GLFW_JOYSTICK_12 11 -#define GLFW_JOYSTICK_13 12 -#define GLFW_JOYSTICK_14 13 -#define GLFW_JOYSTICK_15 14 -#define GLFW_JOYSTICK_16 15 -#define GLFW_JOYSTICK_LAST GLFW_JOYSTICK_16 -/*! @} */ - -/*! @defgroup errors Error codes - * - * See [error handling](@ref error_handling) for how these are used. - * - * @ingroup init - * @{ */ -/*! @brief GLFW has not been initialized. - * - * This occurs if a GLFW function was called that may not be called unless the - * library is [initialized](@ref intro_init). - * - * @par 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. - * - * @par Analysis - * Application programmer error. Ensure a context is current before calling - * functions that require a current context. - */ -#define GLFW_NO_CURRENT_CONTEXT 0x00010002 -/*! @brief One of the arguments to the function was an invalid enum value. - * - * One of the arguments to the function was an invalid enum value, for example - * requesting [GLFW_RED_BITS](@ref window_hints_fb) with @ref - * glfwGetWindowAttrib. - * - * @par 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. - * - * @par Analysis - * Application programmer error. Fix the offending call. - */ -#define GLFW_INVALID_VALUE 0x00010004 -/*! @brief A memory allocation failed. - * - * A memory allocation failed. - * - * @par 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 client API on the - * system. - * - * GLFW could not find support for the requested client API on the system. If - * emitted by functions other than @ref glfwCreateWindow, no supported client - * API was found. - * - * @par Analysis - * The installed graphics driver does not support the requested client 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 supports it via - * a WGL or GLX extension. OS X does not provide OpenGL ES at all. The Mesa - * EGL, OpenGL and OpenGL ES libraries do not interface with the Nvidia binary - * driver. - */ -#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. - * - * @par 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. - * - * @par 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. - * - * @par 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 -/*! @} */ - -#define GLFW_FOCUSED 0x00020001 -#define GLFW_ICONIFIED 0x00020002 -#define GLFW_RESIZABLE 0x00020003 -#define GLFW_VISIBLE 0x00020004 -#define GLFW_DECORATED 0x00020005 -#define GLFW_AUTO_ICONIFY 0x00020006 -#define GLFW_FLOATING 0x00020007 - -#define GLFW_RED_BITS 0x00021001 -#define GLFW_GREEN_BITS 0x00021002 -#define GLFW_BLUE_BITS 0x00021003 -#define GLFW_ALPHA_BITS 0x00021004 -#define GLFW_DEPTH_BITS 0x00021005 -#define GLFW_STENCIL_BITS 0x00021006 -#define GLFW_ACCUM_RED_BITS 0x00021007 -#define GLFW_ACCUM_GREEN_BITS 0x00021008 -#define GLFW_ACCUM_BLUE_BITS 0x00021009 -#define GLFW_ACCUM_ALPHA_BITS 0x0002100A -#define GLFW_AUX_BUFFERS 0x0002100B -#define GLFW_STEREO 0x0002100C -#define GLFW_SAMPLES 0x0002100D -#define GLFW_SRGB_CAPABLE 0x0002100E -#define GLFW_REFRESH_RATE 0x0002100F -#define GLFW_DOUBLEBUFFER 0x00021010 - -#define GLFW_CLIENT_API 0x00022001 -#define GLFW_CONTEXT_VERSION_MAJOR 0x00022002 -#define GLFW_CONTEXT_VERSION_MINOR 0x00022003 -#define GLFW_CONTEXT_REVISION 0x00022004 -#define GLFW_CONTEXT_ROBUSTNESS 0x00022005 -#define GLFW_OPENGL_FORWARD_COMPAT 0x00022006 -#define GLFW_OPENGL_DEBUG_CONTEXT 0x00022007 -#define GLFW_OPENGL_PROFILE 0x00022008 -#define GLFW_CONTEXT_RELEASE_BEHAVIOR 0x00022009 - -#define GLFW_OPENGL_API 0x00030001 -#define GLFW_OPENGL_ES_API 0x00030002 - -#define GLFW_NO_ROBUSTNESS 0 -#define GLFW_NO_RESET_NOTIFICATION 0x00031001 -#define GLFW_LOSE_CONTEXT_ON_RESET 0x00031002 - -#define GLFW_OPENGL_ANY_PROFILE 0 -#define GLFW_OPENGL_CORE_PROFILE 0x00032001 -#define GLFW_OPENGL_COMPAT_PROFILE 0x00032002 - -#define GLFW_CURSOR 0x00033001 -#define GLFW_STICKY_KEYS 0x00033002 -#define GLFW_STICKY_MOUSE_BUTTONS 0x00033003 - -#define GLFW_CURSOR_NORMAL 0x00034001 -#define GLFW_CURSOR_HIDDEN 0x00034002 -#define GLFW_CURSOR_DISABLED 0x00034003 - -#define GLFW_ANY_RELEASE_BEHAVIOR 0 -#define GLFW_RELEASE_BEHAVIOR_FLUSH 0x00035001 -#define GLFW_RELEASE_BEHAVIOR_NONE 0x00035002 - -/*! @defgroup shapes Standard cursor shapes - * - * See [standard cursor creation](@ref cursor_standard) for how these are used. - * - * @ingroup input - * @{ */ - -/*! @brief The regular arrow cursor shape. - * - * The regular arrow cursor. - */ -#define GLFW_ARROW_CURSOR 0x00036001 -/*! @brief The text input I-beam cursor shape. - * - * The text input I-beam cursor shape. - */ -#define GLFW_IBEAM_CURSOR 0x00036002 -/*! @brief The crosshair shape. - * - * The crosshair shape. - */ -#define GLFW_CROSSHAIR_CURSOR 0x00036003 -/*! @brief The hand shape. - * - * The hand shape. - */ -#define GLFW_HAND_CURSOR 0x00036004 -/*! @brief The horizontal resize arrow shape. - * - * The horizontal resize arrow shape. - */ -#define GLFW_HRESIZE_CURSOR 0x00036005 -/*! @brief The vertical resize arrow shape. - * - * The vertical resize arrow shape. - */ -#define GLFW_VRESIZE_CURSOR 0x00036006 -/*! @} */ - -#define GLFW_CONNECTED 0x00040001 -#define GLFW_DISCONNECTED 0x00040002 - -#define GLFW_DONT_CARE -1 - - -/************************************************************************* - * GLFW API types - *************************************************************************/ - -/*! @brief Client API function pointer type. - * - * Generic function pointer used for returning client API function pointers - * without forcing a cast from a regular pointer. - * - * @ingroup context - */ -typedef void (*GLFWglproc)(void); - -/*! @brief Opaque monitor object. - * - * Opaque monitor object. - * - * @ingroup monitor - */ -typedef struct GLFWmonitor GLFWmonitor; - -/*! @brief Opaque window object. - * - * Opaque window object. - * - * @ingroup window - */ -typedef struct GLFWwindow GLFWwindow; - -/*! @brief Opaque cursor object. - * - * Opaque cursor object. - * - * @ingroup cursor - */ -typedef struct GLFWcursor GLFWcursor; - -/*! @brief The function signature for error callbacks. - * - * This is the function signature for error callback functions. - * - * @param[in] error An [error code](@ref errors). - * @param[in] description A UTF-8 encoded string describing the error. - * - * @sa glfwSetErrorCallback - * - * @ingroup init - */ -typedef void (* GLFWerrorfun)(int,const char*); - -/*! @brief The function signature for window position callbacks. - * - * This is the function signature for window position callback functions. - * - * @param[in] window The window that was moved. - * @param[in] xpos The new x-coordinate, in screen coordinates, of the - * upper-left corner of the client area of the window. - * @param[in] ypos The new y-coordinate, in screen coordinates, of the - * upper-left corner of the client area of the window. - * - * @sa glfwSetWindowPosCallback - * - * @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 glfwSetWindowSizeCallback - * - * @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 glfwSetWindowCloseCallback - * - * @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 glfwSetWindowRefreshCallback - * - * @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 `GL_TRUE` if the window was given input focus, or - * `GL_FALSE` if it lost it. - * - * @sa glfwSetWindowFocusCallback - * - * @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 `GL_TRUE` if the window was iconified, or `GL_FALSE` - * if it was restored. - * - * @sa glfwSetWindowIconifyCallback - * - * @ingroup window - */ -typedef void (* GLFWwindowiconifyfun)(GLFWwindow*,int); - -/*! @brief The function signature for framebuffer resize callbacks. - * - * This is the function signature for framebuffer resize callback - * functions. - * - * @param[in] window The window whose framebuffer was resized. - * @param[in] width The new width, in pixels, of the framebuffer. - * @param[in] height The new height, in pixels, of the framebuffer. - * - * @sa glfwSetFramebufferSizeCallback - * - * @ingroup window - */ -typedef void (* GLFWframebuffersizefun)(GLFWwindow*,int,int); - -/*! @brief The function signature for mouse button callbacks. - * - * This is the function signature for mouse button callback functions. - * - * @param[in] window The window that received the event. - * @param[in] button The [mouse button](@ref buttons) that was pressed or - * released. - * @param[in] action One of `GLFW_PRESS` or `GLFW_RELEASE`. - * @param[in] mods Bit field describing which [modifier keys](@ref mods) were - * held down. - * - * @sa glfwSetMouseButtonCallback - * - * @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 x-coordinate, in screen coordinates, of the cursor. - * @param[in] ypos The new y-coordinate, in screen coordinates, of the cursor. - * - * @sa glfwSetCursorPosCallback - * - * @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 `GL_TRUE` if the cursor entered the window's client - * area, or `GL_FALSE` if it left it. - * - * @sa glfwSetCursorEnterCallback - * - * @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 glfwSetScrollCallback - * - * @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 glfwSetKeyCallback - * - * @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 glfwSetCharCallback - * - * @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 glfwSetCharModsCallback - * - * @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 glfwSetDropCallback - * - * @ingroup input - */ -typedef void (* GLFWdropfun)(GLFWwindow*,int,const char**); - -/*! @brief The function signature for monitor configuration callbacks. - * - * This is the function signature for monitor configuration callback functions. - * - * @param[in] monitor The monitor that was connected or disconnected. - * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. - * - * @sa glfwSetMonitorCallback - * - * @ingroup monitor - */ -typedef void (* GLFWmonitorfun)(GLFWmonitor*,int); - -/*! @brief Video mode type. - * - * This describes a single video mode. - * - * @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 glfwGetGammaRamp glfwSetGammaRamp - * - * @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. - */ -typedef struct GLFWimage -{ - /*! The width, in pixels, of this image. - */ - int width; - /*! The height, in pixels, of this image. - */ - int height; - /*! The pixel data of this image, arranged left-to-right, top-to-bottom. - */ - unsigned char* pixels; -} GLFWimage; - - -/************************************************************************* - * GLFW API functions - *************************************************************************/ - -/*! @brief Initializes the GLFW library. - * - * This function initializes the GLFW library. Before most GLFW functions can - * be used, GLFW must be initialized, and before an application terminates GLFW - * should be terminated in order to free any resources allocated during or - * after initialization. - * - * If this function fails, it calls @ref glfwTerminate before returning. If it - * succeeds, you should call @ref glfwTerminate before the application exits. - * - * Additional calls to this function after successful initialization but before - * termination will return `GL_TRUE` immediately. - * - * @return `GL_TRUE` if successful, or `GL_FALSE` if an - * [error](@ref error_handling) occurred. - * - * @remarks __OS X:__ This function will change the current directory of the - * application to the `Contents/Resources` subdirectory of the application's - * bundle, if present. This can be disabled with a - * [compile-time option](@ref compile_options_osx). - * - * @remarks __X11:__ If the `LC_CTYPE` category of the current locale is set to - * `"C"` then the environment's locale will be applied to that category. This - * is done because character input will not function when `LC_CTYPE` is set to - * `"C"`. If another locale was set before this function was called, it will - * be left untouched. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref intro_init - * @sa glfwTerminate - * - * @since Added in GLFW 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. - * - * @remarks This function may be called before @ref glfwInit. - * - * @warning No window's context may be current on another thread when this - * function is called. - * - * @par Reentrancy - * This function may not be called from a callback. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref intro_init - * @sa glfwInit - * - * @since Added in GLFW 1.0. - * - * @ingroup init - */ -GLFWAPI void glfwTerminate(void); - -/*! @brief Retrieves the version of the GLFW library. - * - * This function retrieves the major, minor and revision numbers of the GLFW - * library. It is intended for when you are using GLFW as a shared library and - * want to ensure that you are using the minimum required version. - * - * Any or all of the version arguments may be `NULL`. This function always - * succeeds. - * - * @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`. - * - * @remarks This function may be called before @ref glfwInit. - * - * @par Thread Safety - * This function may be called from any thread. - * - * @sa @ref intro_version - * @sa glfwGetVersionString - * - * @since Added in GLFW 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. - * - * __Do not use the version string__ to parse the GLFW library version. The - * @ref glfwGetVersion function already provides the version of the running - * library binary. - * - * This function always succeeds. - * - * @return The GLFW version string. - * - * @remarks This function may be called before @ref glfwInit. - * - * @par Pointer Lifetime - * The returned string is static and compile-time generated. - * - * @par Thread Safety - * This function may be called from any thread. - * - * @sa @ref intro_version - * @sa glfwGetVersion - * - * @since Added in GLFW 3.0. - * - * @ingroup init - */ -GLFWAPI const char* glfwGetVersionString(void); - -/*! @brief Sets the error callback. - * - * This function sets the error callback, which is called with an error code - * and a human-readable description each time a GLFW error occurs. - * - * The error callback is called on the thread where the error occurred. If you - * are using GLFW from multiple threads, your error callback needs to be - * written accordingly. - * - * Because the description string may have been generated specifically for that - * error, it is not guaranteed to be valid after the callback has returned. If - * you wish to use it after the callback returns, you need to make a copy. - * - * Once set, the error callback remains set even after the library has been - * terminated. - * - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set. - * - * @remarks This function may be called before @ref glfwInit. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref error_handling - * - * @since Added in GLFW 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. - * - * @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 an - * [error](@ref error_handling) occurred. - * - * @par 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. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref monitor_monitors - * @sa @ref monitor_event - * @sa glfwGetPrimaryMonitor - * - * @since Added in GLFW 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 Windows task bar or the OS X menu bar is located. - * - * @return The primary monitor, or `NULL` if an [error](@ref error_handling) - * occurred. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref monitor_monitors - * @sa glfwGetMonitors - * - * @since Added in GLFW 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`. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref monitor_properties - * - * @since Added in GLFW 3.0. - * - * @ingroup monitor - */ -GLFWAPI void glfwGetMonitorPos(GLFWmonitor* monitor, int* xpos, int* ypos); - -/*! @brief Returns the physical size of the monitor. - * - * This function returns the size, in millimetres, of the display area of the - * specified monitor. - * - * Some systems do not provide accurate monitor size information, either - * because the monitor - * [EDID](https://en.wikipedia.org/wiki/Extended_display_identification_data) - * data is incorrect or because the driver does not report it accurately. - * - * Any or all of the size arguments may be `NULL`. If an error occurs, all - * non-`NULL` size arguments will be set to zero. - * - * @param[in] monitor The monitor to query. - * @param[out] widthMM Where to store the width, in millimetres, of the - * monitor's display area, or `NULL`. - * @param[out] heightMM Where to store the height, in millimetres, of the - * monitor's display area, or `NULL`. - * - * @remarks __Windows:__ The OS calculates the returned physical size from the - * current resolution and system DPI instead of querying the monitor EDID data. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref monitor_properties - * - * @since Added in GLFW 3.0. - * - * @ingroup monitor - */ -GLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* monitor, int* widthMM, int* heightMM); - -/*! @brief Returns the name of the specified monitor. - * - * This function returns a human-readable name, encoded as UTF-8, of the - * specified monitor. The name typically reflects the make and model of the - * monitor and is not guaranteed to be unique among the connected monitors. - * - * @param[in] monitor The monitor to query. - * @return The UTF-8 encoded name of the monitor, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @par 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. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref monitor_properties - * - * @since Added in GLFW 3.0. - * - * @ingroup monitor - */ -GLFWAPI const char* glfwGetMonitorName(GLFWmonitor* monitor); - -/*! @brief Sets the monitor configuration callback. - * - * This function sets the monitor configuration callback, or removes the - * currently set callback. This is called when a monitor is connected to or - * disconnected from the system. - * - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @bug __X11:__ This callback is not yet called on monitor configuration - * changes. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref monitor_event - * - * @since Added in GLFW 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. - * - * @par 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. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref monitor_modes - * @sa glfwGetVideoMode - * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ 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. - * - * @par 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. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref monitor_modes - * @sa glfwGetVideoModes - * - * @since Added in GLFW 3.0. Replaces `glfwGetDesktopMode`. - * - * @ingroup monitor - */ -GLFWAPI const GLFWvidmode* glfwGetVideoMode(GLFWmonitor* monitor); - -/*! @brief Generates a gamma ramp and sets it for the specified monitor. - * - * This function generates a 256-element gamma ramp from the specified exponent - * and then calls @ref glfwSetGammaRamp with it. The value must be a finite - * number greater than zero. - * - * @param[in] monitor The monitor whose gamma ramp to set. - * @param[in] gamma The desired exponent. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref monitor_gamma - * - * @since Added in GLFW 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. - * - * @par 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. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref monitor_gamma - * - * @since Added in GLFW 3.0. - * - * @ingroup monitor - */ -GLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* monitor); - -/*! @brief Sets the current gamma ramp for the specified monitor. - * - * This function sets the current gamma ramp for the specified monitor. The - * original gamma ramp for that monitor is saved by GLFW the first time this - * function is called and is restored by @ref glfwTerminate. - * - * @param[in] monitor The monitor whose gamma ramp to set. - * @param[in] ramp The gamma ramp to use. - * - * @remarks Gamma ramp sizes other than 256 are not supported by all platforms - * or graphics hardware. - * - * @remarks __Windows:__ The gamma ramp size must be 256. - * - * @par Pointer Lifetime - * The specified gamma ramp is copied before this function returns. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref monitor_gamma - * - * @since Added in GLFW 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). - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_hints - * @sa glfwWindowHint - * - * @since Added in GLFW 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwDefaultWindowHints(void); - -/*! @brief Sets the specified window hint to the desired value. - * - * This function sets hints for the next call to @ref glfwCreateWindow. The - * hints, once set, retain their values until changed by a call to @ref - * glfwWindowHint or @ref glfwDefaultWindowHints, or until the library is - * terminated. - * - * @param[in] target The [window hint](@ref window_hints) to set. - * @param[in] hint The new value of the window hint. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_hints - * @sa glfwDefaultWindowHints - * - * @since Added in GLFW 3.0. Replaces `glfwOpenWindowHint`. - * - * @ingroup window - */ -GLFWAPI void glfwWindowHint(int target, int hint); - -/*! @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, use queries like @ref - * glfwGetWindowAttrib and @ref glfwGetWindowSize. - * - * To create a full screen window, you need to specify the monitor the window - * will cover. If no monitor is specified, windowed mode will be used. 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 has input - * focus, 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. - * - * By default, newly created windows use the placement recommended by the - * window system. To create the window at a specific position, make it - * initially invisible using the [GLFW_VISIBLE](@ref window_hints_wnd) window - * hint, set its [position](@ref window_pos) and then [show](@ref window_hide) - * it. - * - * If a full screen window has input focus, 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` to use - * 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. - * - * @remarks __Windows:__ Window creation will fail if the Microsoft GDI - * software OpenGL implementation is the only one available. - * - * @remarks __Windows:__ If the executable has an icon resource named - * `GLFW_ICON,` it will be set as the icon for the window. If no such icon is - * present, the `IDI_WINLOGO` icon will be used instead. - * - * @remarks __Windows:__ The context to share resources with may not be current - * on any other thread. - * - * @remarks __OS X:__ 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. - * - * @remarks __OS X:__ The first time a window is created the menu bar is - * populated with common commands like Hide, Quit and About. The About entry - * opens a minimal about dialog with information from the application's bundle. - * The menu bar can be disabled with a - * [compile-time option](@ref compile_options_osx). - * - * @remarks __OS X:__ On OS X 10.10 and later the window frame will not be - * rendered at full resolution on Retina displays unless the - * `NSHighResolutionCapable` key is enabled in the application bundle's - * `Info.plist`. For more information, see - * [High Resolution Guidelines for OS X](https://developer.apple.com/library/mac/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html) - * in the Mac Developer Library. - * - * @remarks __X11:__ There is no mechanism for setting the window icon yet. - * - * @remarks __X11:__ Some window managers will not respect the placement of - * initially hidden windows. - * - * @par Reentrancy - * This function may not be called from a callback. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_creation - * @sa glfwDestroyWindow - * - * @since Added in GLFW 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. - * - * @note The context of the specified window must not be current on any other - * thread when this function is called. - * - * @par Reentrancy - * This function may not be called from a callback. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_creation - * @sa glfwCreateWindow - * - * @since Added in GLFW 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. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @sa @ref window_close - * - * @since Added in GLFW 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. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @sa @ref window_close - * - * @since Added in GLFW 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. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_title - * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowTitle(GLFWwindow* window, const char* title); - -/*! @brief Retrieves the position of the client area of the specified window. - * - * This function retrieves the position, in screen coordinates, of the - * upper-left corner of the client area of the specified window. - * - * Any or all of the position arguments may be `NULL`. If an error occurs, all - * non-`NULL` position arguments will be set to zero. - * - * @param[in] window The window to query. - * @param[out] xpos Where to store the x-coordinate of the upper-left corner of - * the client area, or `NULL`. - * @param[out] ypos Where to store the y-coordinate of the upper-left corner of - * the client area, or `NULL`. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_pos - * @sa glfwSetWindowPos - * - * @since Added in GLFW 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos); - -/*! @brief Sets the position of the client area of the specified window. - * - * This function sets the position, in screen coordinates, of the upper-left - * corner of the client area of the specified windowed mode window. If the - * window is a full screen window, this function does nothing. - * - * __Do not use this function__ to move an already visible window unless you - * have very good reasons for doing so, as it will confuse and annoy the user. - * - * The window manager may put limits on what positions are allowed. GLFW - * cannot and should not override these limits. - * - * @param[in] window The window to query. - * @param[in] xpos The x-coordinate of the upper-left corner of the client area. - * @param[in] ypos The y-coordinate of the upper-left corner of the client area. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_pos - * @sa glfwGetWindowPos - * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowPos(GLFWwindow* window, int xpos, int ypos); - -/*! @brief Retrieves the size of the client area of the specified window. - * - * This function retrieves the size, in screen coordinates, of the client area - * of the specified window. If you wish to retrieve the size of the - * framebuffer of the window in pixels, see @ref glfwGetFramebufferSize. - * - * Any or all of the size arguments may be `NULL`. If an error occurs, all - * non-`NULL` size arguments will be set to zero. - * - * @param[in] window The window whose size to retrieve. - * @param[out] width Where to store the width, in screen coordinates, of the - * client area, or `NULL`. - * @param[out] height Where to store the height, in screen coordinates, of the - * client area, or `NULL`. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_size - * @sa glfwSetWindowSize - * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwGetWindowSize(GLFWwindow* window, int* width, int* height); - -/*! @brief Sets the size of the client area of the specified window. - * - * This function sets the size, in screen coordinates, of the client area of - * the specified window. - * - * For full screen windows, this function selects and switches to the resolution - * closest to the specified size, without affecting the window's context. As - * the context is unaffected, the bit depths of the framebuffer remain - * unchanged. - * - * 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 of the specified window. - * @param[in] height The desired height of the specified window. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_size - * @sa glfwGetWindowSize - * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ 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`. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_fbsize - * @sa glfwSetFramebufferSizeCallback - * - * @since Added in GLFW 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`. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_size - * - * @since Added in GLFW 3.1. - * - * @ingroup window - */ -GLFWAPI void glfwGetWindowFrameSize(GLFWwindow* window, int* left, int* top, int* right, int* bottom); - -/*! @brief Iconifies the specified window. - * - * This function iconifies (minimizes) the specified window if it was - * previously restored. If the window is already iconified, this function does - * nothing. - * - * If the specified window is a full screen window, the original monitor - * resolution is restored until the window is restored. - * - * @param[in] window The window to iconify. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_iconify - * @sa glfwRestoreWindow - * - * @since Added in GLFW 2.1. - * - * @par - * __GLFW 3:__ 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). 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. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_iconify - * @sa glfwIconifyWindow - * - * @since Added in GLFW 2.1. - * - * @par - * __GLFW 3:__ Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwRestoreWindow(GLFWwindow* window); - -/*! @brief Makes the specified window visible. - * - * This function makes the specified window visible if it was previously - * hidden. If the window is already visible or is in full screen mode, this - * function does nothing. - * - * @param[in] window The window to make visible. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_hide - * @sa glfwHideWindow - * - * @since Added in GLFW 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. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_hide - * @sa glfwShowWindow - * - * @since Added in GLFW 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwHideWindow(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 - * occurred. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_monitor - * - * @since Added in GLFW 3.0. - * - * @ingroup window - */ -GLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* window); - -/*! @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. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_attribs - * - * @since Added in GLFW 3.0. Replaces `glfwGetWindowParam` and - * `glfwGetGLVersion`. - * - * @ingroup window - */ -GLFWAPI int glfwGetWindowAttrib(GLFWwindow* window, int attrib); - -/*! @brief Sets the user pointer of the specified window. - * - * This function sets the user-defined pointer of the specified window. The - * current value is retained until the window is destroyed. The initial value - * is `NULL`. - * - * @param[in] window The window whose pointer to set. - * @param[in] pointer The new value. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @sa @ref window_userptr - * @sa glfwGetWindowUserPointer - * - * @since Added in GLFW 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. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @sa @ref window_userptr - * @sa glfwSetWindowUserPointer - * - * @since Added in GLFW 3.0. - * - * @ingroup window - */ -GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow* window); - -/*! @brief Sets the position callback for the specified window. - * - * This function sets the position callback of the specified window, which is - * called when the window is moved. The callback is provided with the screen - * position of the upper-left corner of the client area of the window. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_pos - * - * @since Added in GLFW 3.0. - * - * @ingroup window - */ -GLFWAPI GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* window, GLFWwindowposfun cbfun); - -/*! @brief Sets the size callback for the specified window. - * - * This function sets the size callback of the specified window, which is - * called when the window is resized. The callback is provided with the size, - * in screen coordinates, of the client area of the window. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_size - * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Added window handle parameter. Updated callback signature. - * - * @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). - * - * @remarks __OS X:__ Selecting Quit from the application menu will - * trigger the close callback for all windows. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_close - * - * @since Added in GLFW 2.5. - * - * @par - * __GLFW 3:__ Added window handle parameter. Updated callback signature. - * - * @ingroup window - */ -GLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* window, GLFWwindowclosefun cbfun); - -/*! @brief Sets the refresh callback for the specified window. - * - * This function sets the refresh callback of the specified window, which is - * called when the client area of the window needs to be redrawn, for example - * if the window has been exposed after having been covered by another window. - * - * On compositing window systems such as Aero, Compiz or Aqua, where the window - * contents are saved off-screen, this callback may be called only very - * infrequently or never at all. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_refresh - * - * @since Added in GLFW 2.5. - * - * @par - * __GLFW 3:__ Added window handle parameter. Updated callback signature. - * - * @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). - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_focus - * - * @since Added in GLFW 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). - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_iconify - * - * @since Added in GLFW 3.0. - * - * @ingroup window - */ -GLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* window, GLFWwindowiconifyfun cbfun); - -/*! @brief Sets the framebuffer resize callback for the specified window. - * - * This function sets the framebuffer resize callback of the specified window, - * which is called when the framebuffer of the specified window is resized. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_fbsize - * - * @since Added in GLFW 3.0. - * - * @ingroup window - */ -GLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* window, GLFWframebuffersizefun cbfun); - -/*! @brief Processes all pending events. - * - * This function processes only those events that are already in the event - * queue and then returns immediately. Processing events will cause the window - * and input callbacks associated with those events to be called. - * - * On some platforms, a window move, resize or menu operation will cause event - * processing to block. This is due to how event processing is designed on - * those platforms. You can use the - * [window refresh callback](@ref window_refresh) to redraw the contents of - * your window when necessary during such operations. - * - * On some platforms, certain events are sent directly to the application - * without going through the event queue, causing callbacks to be called - * outside of a call to one of the event processing functions. - * - * Event processing is not required for joystick input to work. - * - * @par Reentrancy - * This function may not be called from a callback. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref events - * @sa glfwWaitEvents - * - * @since Added in GLFW 1.0. - * - * @ingroup window - */ -GLFWAPI void glfwPollEvents(void); - -/*! @brief Waits until events are queued and processes them. - * - * This function puts the calling thread to sleep until at least one event is - * available in the event queue. Once one or more events are available, - * it behaves exactly like @ref glfwPollEvents, i.e. the events in the queue - * are processed and the function then returns immediately. Processing events - * will cause the window and input callbacks associated with those events to be - * called. - * - * Since not all events are associated with callbacks, this function may return - * without a callback having been called even if you are monitoring all - * callbacks. - * - * On some platforms, a window move, resize or menu operation will cause event - * processing to block. This is due to how event processing is designed on - * those platforms. You can use the - * [window refresh callback](@ref window_refresh) to redraw the contents of - * your window when necessary during such operations. - * - * On some platforms, certain callbacks may be called outside of a call to one - * of the event processing functions. - * - * If no windows exist, this function returns immediately. For synchronization - * of threads in applications that do not create windows, use your threading - * library of choice. - * - * Event processing is not required for joystick input to work. - * - * @par Reentrancy - * This function may not be called from a callback. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref events - * @sa glfwPollEvents - * - * @since Added in GLFW 2.5. - * - * @ingroup window - */ -GLFWAPI void glfwWaitEvents(void); - -/*! @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 to return. - * - * If no windows exist, this function returns immediately. For synchronization - * of threads in applications that do not create windows, use your threading - * library of choice. - * - * @par Thread Safety - * This function may be called from any thread. - * - * @sa @ref events - * @sa glfwWaitEvents - * - * @since Added in GLFW 3.1. - * - * @ingroup window - */ -GLFWAPI void glfwPostEmptyEvent(void); - -/*! @brief Returns the value of an input option for the specified window. - * - * This function returns the value of an input option for the specified window. - * The mode must be one of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or - * `GLFW_STICKY_MOUSE_BUTTONS`. - * - * @param[in] window The window to query. - * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or - * `GLFW_STICKY_MOUSE_BUTTONS`. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa glfwSetInputMode - * - * @since Added in GLFW 3.0. - * - * @ingroup input - */ -GLFWAPI int glfwGetInputMode(GLFWwindow* window, int mode); - -/*! @brief Sets an input option for the specified window. - * - * This function sets an input mode option for the specified window. The mode - * must be one of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or - * `GLFW_STICKY_MOUSE_BUTTONS`. - * - * If the mode is `GLFW_CURSOR`, the value must be one of the following cursor - * modes: - * - `GLFW_CURSOR_NORMAL` makes the cursor visible and behaving normally. - * - `GLFW_CURSOR_HIDDEN` makes the cursor invisible when it is over the client - * area of the window but does not restrict the cursor from leaving. - * - `GLFW_CURSOR_DISABLED` hides and grabs the cursor, providing virtual - * and unlimited cursor movement. This is useful for implementing for - * example 3D camera controls. - * - * If the mode is `GLFW_STICKY_KEYS`, the value must be either `GL_TRUE` to - * enable sticky keys, or `GL_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 - * `GL_TRUE` to enable sticky mouse buttons, or `GL_FALSE` to disable it. If - * sticky mouse buttons are enabled, a mouse button press will ensure that @ref - * glfwGetMouseButton returns `GLFW_PRESS` the next time it is called even if - * the mouse button had been released before the call. This is useful when you - * are only interested in whether mouse buttons have been pressed but not when - * or in which order. - * - * @param[in] window The window whose input mode to set. - * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or - * `GLFW_STICKY_MOUSE_BUTTONS`. - * @param[in] value The new value of the specified input mode. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa glfwGetInputMode - * - * @since Added in GLFW 3.0. Replaces `glfwEnable` and `glfwDisable`. - * - * @ingroup input - */ -GLFWAPI void glfwSetInputMode(GLFWwindow* window, int mode, int value); - -/*! @brief Returns the last reported state of a keyboard key for the specified - * window. - * - * This function returns the last state reported for the specified key to the - * specified window. The returned state is one of `GLFW_PRESS` or - * `GLFW_RELEASE`. The higher-level action `GLFW_REPEAT` is only reported to - * the key callback. - * - * If the `GLFW_STICKY_KEYS` input mode is enabled, this function returns - * `GLFW_PRESS` the first time you call it for a key that was pressed, even if - * that key has already been released. - * - * The key functions deal with physical keys, with [key tokens](@ref keys) - * named after their use on the standard US keyboard layout. If you want to - * input text, use the Unicode character callback instead. - * - * The [modifier key bit masks](@ref mods) are not key tokens and cannot be - * used with this function. - * - * @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`. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref input_key - * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Added window handle parameter. - * - * @ingroup input - */ -GLFWAPI int glfwGetKey(GLFWwindow* window, int key); - -/*! @brief Returns the last reported state of a mouse button for the specified - * window. - * - * This function returns the last state reported for the specified mouse button - * to the specified window. The returned state is one of `GLFW_PRESS` or - * `GLFW_RELEASE`. - * - * If the `GLFW_STICKY_MOUSE_BUTTONS` input mode is enabled, this function - * `GLFW_PRESS` the first time you call it for a mouse button that was pressed, - * even if that mouse button has already been released. - * - * @param[in] window The desired window. - * @param[in] button The desired [mouse button](@ref buttons). - * @return One of `GLFW_PRESS` or `GLFW_RELEASE`. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref input_mouse_button - * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Added window handle parameter. - * - * @ingroup input - */ -GLFWAPI int glfwGetMouseButton(GLFWwindow* window, int button); - -/*! @brief Retrieves the position of the cursor relative to the client area of - * the window. - * - * This function returns the position of the cursor, in screen coordinates, - * relative to the upper-left corner of the client area of the specified - * window. - * - * If the cursor is disabled (with `GLFW_CURSOR_DISABLED`) then the cursor - * position is unbounded and limited only by the minimum and maximum values of - * a `double`. - * - * The coordinate can be converted to their integer equivalents with the - * `floor` function. Casting directly to an integer type works for positive - * coordinates, but fails for negative ones. - * - * Any or all of the position arguments may be `NULL`. If an error occurs, all - * non-`NULL` position arguments will be set to zero. - * - * @param[in] window The desired window. - * @param[out] xpos Where to store the cursor x-coordinate, relative to the - * left edge of the client area, or `NULL`. - * @param[out] ypos Where to store the cursor y-coordinate, relative to the to - * top edge of the client area, or `NULL`. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref cursor_pos - * @sa glfwSetCursorPos - * - * @since Added in GLFW 3.0. Replaces `glfwGetMousePos`. - * - * @ingroup input - */ -GLFWAPI void glfwGetCursorPos(GLFWwindow* window, double* xpos, double* ypos); - -/*! @brief Sets the position of the cursor, relative to the client area of the - * window. - * - * This function sets the position, in screen coordinates, of the cursor - * relative to the upper-left corner of the client area of the specified - * window. The window must have input focus. If the window does not have - * input focus when this function is called, it fails silently. - * - * __Do not use this function__ to implement things like camera controls. GLFW - * already provides the `GLFW_CURSOR_DISABLED` cursor mode that hides the - * cursor, transparently re-centers it and provides unconstrained cursor - * motion. See @ref glfwSetInputMode for more information. - * - * If the cursor mode is `GLFW_CURSOR_DISABLED` then the cursor position is - * unconstrained and limited only by the minimum and maximum values of - * a `double`. - * - * @param[in] window The desired window. - * @param[in] xpos The desired x-coordinate, relative to the left edge of the - * client area. - * @param[in] ypos The desired y-coordinate, relative to the top edge of the - * client area. - * - * @remarks __X11:__ Due to the asynchronous nature of a modern X desktop, it - * may take a moment for the window focus event to arrive. This means you will - * not be able to set the cursor position directly after window creation. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref cursor_pos - * @sa glfwGetCursorPos - * - * @since Added in GLFW 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 RGBA, i.e. eight bits per channel. They - * are arranged canonically as packed sequential rows, starting from the - * top-left corner. - * - * The cursor hotspot is specified in pixels, relative to the upper-left corner - * of the cursor image. Like all other coordinate systems in GLFW, the X-axis - * points to the right and the Y-axis points down. - * - * @param[in] image The desired cursor image. - * @param[in] xhot The desired x-coordinate, in pixels, of the cursor hotspot. - * @param[in] yhot The desired y-coordinate, in pixels, of the cursor hotspot. - * - * @return The handle of the created cursor, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @par Pointer Lifetime - * The specified image data is copied before this function returns. - * - * @par Reentrancy - * This function may not be called from a callback. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref cursor_object - * @sa glfwDestroyCursor - * @sa glfwCreateStandardCursor - * - * @since Added in GLFW 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. - * - * @par Reentrancy - * This function may not be called from a callback. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref cursor_object - * @sa glfwCreateCursor - * - * @since Added in GLFW 3.1. - * - * @ingroup input - */ -GLFWAPI GLFWcursor* glfwCreateStandardCursor(int shape); - -/*! @brief Destroys a cursor. - * - * This function destroys a cursor previously created with @ref - * glfwCreateCursor. Any remaining cursors will be destroyed by @ref - * glfwTerminate. - * - * @param[in] cursor The cursor object to destroy. - * - * @par Reentrancy - * This function may not be called from a callback. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref cursor_object - * @sa glfwCreateCursor - * - * @since Added in GLFW 3.1. - * - * @ingroup input - */ -GLFWAPI void glfwDestroyCursor(GLFWcursor* cursor); - -/*! @brief Sets the cursor for the window. - * - * This function sets the cursor image to be used when the cursor is over the - * client area of the specified window. The set cursor will only be visible - * when the [cursor mode](@ref cursor_mode) of the window is - * `GLFW_CURSOR_NORMAL`. - * - * On some platforms, the set cursor may not be visible unless the window also - * has input focus. - * - * @param[in] window The window to set the cursor for. - * @param[in] cursor The cursor to set, or `NULL` to switch back to the default - * arrow cursor. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref cursor_object - * - * @since Added in GLFW 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). - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref input_key - * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Added window handle parameter. Updated callback signature. - * - * @ingroup input - */ -GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun cbfun); - -/*! @brief Sets the Unicode character callback. - * - * This function sets the character callback of the specified window, which is - * called when a Unicode character is input. - * - * The character callback is intended for Unicode text input. As it deals with - * characters, it is keyboard layout dependent, whereas the - * [key callback](@ref glfwSetKeyCallback) is not. Characters do not map 1:1 - * to physical keys, as a key may produce zero, one or more characters. If you - * want to know whether a specific physical key was pressed or released, see - * the key callback instead. - * - * The character callback behaves as system text input normally does and will - * not be called if modifier keys are held down that would prevent normal text - * input on that platform, for example a Super (Command) key on OS X or Alt key - * on Windows. There is a - * [character with modifiers callback](@ref glfwSetCharModsCallback) that - * receives these events. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref input_char - * - * @since Added in GLFW 2.4. - * - * @par - * __GLFW 3:__ Added window handle parameter. Updated callback signature. - * - * @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 occurred. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref input_char - * - * @since Added in GLFW 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). - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref input_mouse_button - * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Added window handle parameter. Updated callback signature. - * - * @ingroup input - */ -GLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* window, GLFWmousebuttonfun cbfun); - -/*! @brief Sets the cursor position callback. - * - * This function sets the cursor position callback of the specified window, - * which is called when the cursor is moved. The callback is provided with the - * position, in screen coordinates, relative to the upper-left corner of the - * client area of the window. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref cursor_pos - * - * @since Added in GLFW 3.0. Replaces `glfwSetMousePosCallback`. - * - * @ingroup input - */ -GLFWAPI GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* window, GLFWcursorposfun cbfun); - -/*! @brief Sets the cursor enter/exit callback. - * - * This function sets the cursor boundary crossing callback of the specified - * window, which is called when the cursor enters or leaves the client area of - * the window. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref cursor_enter - * - * @since Added in GLFW 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). - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref scrolling - * - * @since Added in GLFW 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). - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref path_drop - * - * @since Added in GLFW 3.1. - * - * @ingroup input - */ -GLFWAPI GLFWdropfun glfwSetDropCallback(GLFWwindow* window, GLFWdropfun cbfun); - -/*! @brief Returns whether the specified joystick is present. - * - * This function returns whether the specified joystick is present. - * - * @param[in] joy The [joystick](@ref joysticks) to query. - * @return `GL_TRUE` if the joystick is present, or `GL_FALSE` otherwise. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref joystick - * - * @since Added in GLFW 3.0. Replaces `glfwGetJoystickParam`. - * - * @ingroup input - */ -GLFWAPI int glfwJoystickPresent(int joy); - -/*! @brief Returns the values of all axes of the specified joystick. - * - * This function returns the values of all axes of the specified joystick. - * Each element in the array is a value between -1.0 and 1.0. - * - * @param[in] joy The [joystick](@ref joysticks) to query. - * @param[out] count Where to store the number of axis values in the returned - * array. This is set to zero if an error occurred. - * @return An array of axis values, or `NULL` if the joystick is not present. - * - * @par 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. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref joystick_axis - * - * @since Added in GLFW 3.0. Replaces `glfwGetJoystickPos`. - * - * @ingroup input - */ -GLFWAPI const float* glfwGetJoystickAxes(int joy, int* count); - -/*! @brief Returns the state of all buttons of the specified joystick. - * - * This function returns the state of all buttons of the specified joystick. - * Each element in the array is either `GLFW_PRESS` or `GLFW_RELEASE`. - * - * @param[in] joy The [joystick](@ref joysticks) to query. - * @param[out] count Where to store the number of button states in the returned - * array. This is set to zero if an error occurred. - * @return An array of button states, or `NULL` if the joystick is not present. - * - * @par 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. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref joystick_button - * - * @since Added in GLFW 2.2. - * - * @par - * __GLFW 3:__ Changed to return a dynamic array. - * - * @ingroup input - */ -GLFWAPI const unsigned char* glfwGetJoystickButtons(int joy, int* count); - -/*! @brief Returns the name of the specified joystick. - * - * This function returns the name, encoded as UTF-8, of the specified joystick. - * The returned string is allocated and freed by GLFW. You should not free it - * yourself. - * - * @param[in] joy The [joystick](@ref joysticks) to query. - * @return The UTF-8 encoded name of the joystick, or `NULL` if the joystick - * is not present. - * - * @par Pointer Lifetime - * The returned string is allocated and freed by GLFW. You should not free it - * yourself. It is valid until the specified joystick is disconnected, this - * function is called again for that joystick or the library is terminated. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref joystick_name - * - * @since Added in GLFW 3.0. - * - * @ingroup input - */ -GLFWAPI const char* glfwGetJoystickName(int joy); - -/*! @brief Sets the clipboard to the specified string. - * - * This function sets the system clipboard to the specified, UTF-8 encoded - * string. - * - * @param[in] window The window that will own the clipboard contents. - * @param[in] string A UTF-8 encoded string. - * - * @par Pointer Lifetime - * The specified string is copied before this function returns. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref clipboard - * @sa glfwGetClipboardString - * - * @since Added in GLFW 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. - * - * @param[in] window The window that will request the clipboard contents. - * @return The contents of the clipboard as a UTF-8 encoded string, or `NULL` - * if an [error](@ref error_handling) occurred. - * - * @par 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. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref clipboard - * @sa glfwSetClipboardString - * - * @since Added in GLFW 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. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @sa @ref time - * - * @since Added in GLFW 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. - * - * @remarks 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. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref time - * - * @since Added in GLFW 2.2. - * - * @ingroup input - */ -GLFWAPI void glfwSetTime(double time); - -/*! @brief Makes the context of the specified window current for the calling - * thread. - * - * This function makes the OpenGL or OpenGL ES context of the specified window - * current on the calling thread. A context can only be made current on - * a single thread at a time and each thread can have only a single current - * context at a time. - * - * By default, making a context non-current implicitly forces a pipeline flush. - * On machines that support `GL_KHR_context_flush_control`, you can control - * whether a context performs this flush by setting the - * [GLFW_CONTEXT_RELEASE_BEHAVIOR](@ref window_hints_ctx) window hint. - * - * @param[in] window The window whose context to make current, or `NULL` to - * detach the current context. - * - * @par Thread Safety - * This function may be called from any thread. - * - * @sa @ref context_current - * @sa glfwGetCurrentContext - * - * @since Added in GLFW 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. - * - * @par Thread Safety - * This function may be called from any thread. - * - * @sa @ref context_current - * @sa glfwMakeContextCurrent - * - * @since Added in GLFW 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. If - * the swap interval is greater than zero, the GPU driver waits the specified - * number of screen updates before swapping the buffers. - * - * @param[in] window The window whose buffers to swap. - * - * @par Thread Safety - * This function may be called from any thread. - * - * @sa @ref buffer_swap - * @sa glfwSwapInterval - * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ 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 context, i.e. the - * number of screen updates to wait from the time @ref glfwSwapBuffers was - * called before swapping the buffers and returning. This is sometimes called - * _vertical synchronization_, _vertical retrace synchronization_ or just - * _vsync_. - * - * Contexts that support either of the `WGL_EXT_swap_control_tear` and - * `GLX_EXT_swap_control_tear` extensions also accept negative swap intervals, - * which allow the driver to swap even if a frame arrives a little bit late. - * You can check for the presence of these extensions using @ref - * glfwExtensionSupported. For more information about swap tearing, see the - * extension specifications. - * - * A context must be current on the calling thread. Calling this function - * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. - * - * @param[in] interval The minimum number of screen updates to wait for - * until the buffers are swapped by @ref glfwSwapBuffers. - * - * @remarks 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. - * - * @remarks 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. - * - * @par Thread Safety - * This function may be called from any thread. - * - * @sa @ref buffer_swap - * @sa glfwSwapBuffers - * - * @since Added in GLFW 1.0. - * - * @ingroup context - */ -GLFWAPI void glfwSwapInterval(int interval); - -/*! @brief Returns whether the specified extension is available. - * - * This function returns whether the specified - * [client API extension](@ref context_glext) is supported by the current - * OpenGL or OpenGL ES context. It searches both for OpenGL and OpenGL ES - * extension and platform-specific 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. - * - * @param[in] extension The ASCII encoded name of the extension. - * @return `GL_TRUE` if the extension is available, or `GL_FALSE` otherwise. - * - * @par Thread Safety - * This function may be called from any thread. - * - * @sa @ref context_glext - * @sa glfwGetProcAddress - * - * @since Added in GLFW 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 - * [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. - * - * @param[in] procname The ASCII encoded name of the function. - * @return The address of the function, or `NULL` if the function is - * unavailable or an [error](@ref error_handling) occurred. - * - * @remarks The addresses of a given function is not guaranteed to be the same - * between contexts. - * - * @remarks 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 presence first. - * - * @par Pointer Lifetime - * The returned function pointer is valid until the context is destroyed or the - * library is terminated. - * - * @par Thread Safety - * This function may be called from any thread. - * - * @sa @ref context_glext - * @sa glfwExtensionSupported - * - * @since Added in GLFW 1.0. - * - * @ingroup context - */ -GLFWAPI GLFWglproc glfwGetProcAddress(const char* procname); - - -/************************************************************************* - * Global definition cleanup - *************************************************************************/ - -/* ------------------- BEGIN SYSTEM/COMPILER SPECIFIC -------------------- */ - -#ifdef GLFW_WINGDIAPI_DEFINED - #undef WINGDIAPI - #undef GLFW_WINGDIAPI_DEFINED -#endif - -#ifdef GLFW_CALLBACK_DEFINED - #undef CALLBACK - #undef GLFW_CALLBACK_DEFINED -#endif - -/* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */ - - -#ifdef __cplusplus -} -#endif - -#endif /* _glfw3_h_ */ - diff --git a/external/glfw-3.1.1/include/GLFW/glfw3native.h b/external/glfw-3.1.1/include/GLFW/glfw3native.h deleted file mode 100644 index b3ce748..0000000 --- a/external/glfw-3.1.1/include/GLFW/glfw3native.h +++ /dev/null @@ -1,356 +0,0 @@ -/************************************************************************* - * GLFW 3.1 - www.glfw.org - * A library for OpenGL, window and input - *------------------------------------------------------------------------ - * Copyright (c) 2002-2006 Marcus Geelnard - * Copyright (c) 2006-2010 Camilla Berglund - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would - * be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and must not - * be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - * - *************************************************************************/ - -#ifndef _glfw3_native_h_ -#define _glfw3_native_h_ - -#ifdef __cplusplus -extern "C" { -#endif - - -/************************************************************************* - * Doxygen documentation - *************************************************************************/ - -/*! @defgroup native Native access - * - * **By using the native access functions you assert that you know what you're - * doing and how to fix problems caused by using them. If you don't, you - * shouldn't be using them.** - * - * Before the inclusion of @ref glfw3native.h, you must define exactly one - * window system API macro and exactly one context creation API macro. Failure - * to do this will cause a compile-time error. - * - * The available window API macros are: - * * `GLFW_EXPOSE_NATIVE_WIN32` - * * `GLFW_EXPOSE_NATIVE_COCOA` - * * `GLFW_EXPOSE_NATIVE_X11` - * - * The available context API macros are: - * * `GLFW_EXPOSE_NATIVE_WGL` - * * `GLFW_EXPOSE_NATIVE_NSGL` - * * `GLFW_EXPOSE_NATIVE_GLX` - * * `GLFW_EXPOSE_NATIVE_EGL` - * - * These macros select which of the native access functions that are declared - * and which platform-specific headers to include. It is then up your (by - * definition platform-specific) code to handle which of these should be - * defined. - */ - - -/************************************************************************* - * System headers and types - *************************************************************************/ - -#if defined(GLFW_EXPOSE_NATIVE_WIN32) - // This is a workaround for the fact that glfw3.h needs to export APIENTRY (for - // example to allow applications to correctly declare a GL_ARB_debug_output - // callback) but windows.h assumes no one will define APIENTRY before it does - #undef APIENTRY - #include -#elif defined(GLFW_EXPOSE_NATIVE_COCOA) - #include - #if defined(__OBJC__) - #import - #else - typedef void* id; - #endif -#elif defined(GLFW_EXPOSE_NATIVE_X11) - #include - #include -#else - #error "No window API selected" -#endif - -#if defined(GLFW_EXPOSE_NATIVE_WGL) - /* WGL is declared by windows.h */ -#elif defined(GLFW_EXPOSE_NATIVE_NSGL) - /* NSGL is declared by Cocoa.h */ -#elif defined(GLFW_EXPOSE_NATIVE_GLX) - #include -#elif defined(GLFW_EXPOSE_NATIVE_EGL) - #include -#else - #error "No context API selected" -#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. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 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. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 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. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 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. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 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. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 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. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 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. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 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. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 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. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 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. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 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. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 3.0. - * - * @ingroup native - */ -GLFWAPI Window glfwGetX11Window(GLFWwindow* window); -#endif - -#if defined(GLFW_EXPOSE_NATIVE_GLX) -/*! @brief Returns the `GLXContext` of the specified window. - * - * @return The `GLXContext` of the specified window, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 3.0. - * - * @ingroup native - */ -GLFWAPI GLXContext glfwGetGLXContext(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. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 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. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 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. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 3.0. - * - * @ingroup native - */ -GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* window); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* _glfw3_native_h_ */ - diff --git a/external/glfw-3.1.1/lib-mingw-i686/glfw3dll.a b/external/glfw-3.1.1/lib-mingw-i686/glfw3dll.a deleted file mode 100644 index dc593d062ac5b7f9d68e9bcea647d0d99a3910cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54834 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�l@P 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