From 5f5d191d8869b2b3424e68c3dc80cf8fd74f0ba8 Mon Sep 17 00:00:00 2001 From: Ray Date: Mon, 6 Jun 2016 20:26:02 +0200 Subject: [PATCH] Updated to GLFW 3.2 --- src/external/glfw3/COPYING.txt | 5 +- src/external/glfw3/include/GLFW/glfw3.h | 2044 ++++++++++++----- src/external/glfw3/include/GLFW/glfw3native.h | 244 +- src/external/glfw3/lib/win32/libglfw3.a | Bin 83834 -> 148800 bytes src/external/glfw3/lib/win32/libglfw3dll.a | Bin 54834 -> 67426 bytes 5 files changed, 1637 insertions(+), 656 deletions(-) diff --git a/src/external/glfw3/COPYING.txt b/src/external/glfw3/COPYING.txt index 8e1af0843..ad16462a9 100644 --- a/src/external/glfw3/COPYING.txt +++ b/src/external/glfw3/COPYING.txt @@ -1,5 +1,5 @@ Copyright (c) 2002-2006 Marcus Geelnard -Copyright (c) 2006-2010 Camilla Berglund +Copyright (c) 2006-2016 Camilla Berglund This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -18,4 +18,5 @@ freely, subject to the following restrictions: be misrepresented as being the original software. 3. This notice may not be removed or altered from any source - distribution. \ No newline at end of file + distribution. + diff --git a/src/external/glfw3/include/GLFW/glfw3.h b/src/external/glfw3/include/GLFW/glfw3.h index 89414491e..5a0c45089 100644 --- a/src/external/glfw3/include/GLFW/glfw3.h +++ b/src/external/glfw3/include/GLFW/glfw3.h @@ -1,9 +1,9 @@ /************************************************************************* - * GLFW 3.1 - www.glfw.org + * GLFW 3.2 - www.glfw.org * A library for OpenGL, window and input *------------------------------------------------------------------------ * Copyright (c) 2002-2006 Marcus Geelnard - * Copyright (c) 2006-2010 Camilla Berglund + * Copyright (c) 2006-2016 Camilla Berglund * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -38,58 +38,60 @@ extern "C" { * Doxygen documentation *************************************************************************/ -/*! @defgroup context Context handling +/*! @file glfw3.h + * @brief The header of the GLFW 3 API. * - * This is the reference documentation for context related functions. For more - * information, see the @ref context. + * This is the header file of the GLFW 3 API. It defines all its types and + * declares all its functions. + * + * For more information about how to use this file, see @ref build_include. */ -/*! @defgroup init Initialization, version and errors +/*! @defgroup context Context reference + * + * This is the reference documentation for OpenGL and OpenGL ES context related + * functions. For more task-oriented information, see the @ref context_guide. + */ +/*! @defgroup vulkan Vulkan reference + * + * This is the reference documentation for Vulkan related functions and types. + * For more task-oriented information, see the @ref vulkan_guide. + */ +/*! @defgroup init Initialization, version and error reference * * This is the reference documentation for initialization and termination of - * the library, version management and error handling. For more information, - * see the @ref intro. + * the library, version management and error handling. For more task-oriented + * information, see the @ref intro_guide. */ -/*! @defgroup input Input handling +/*! @defgroup input Input reference * * This is the reference documentation for input related functions and types. - * For more information, see the @ref input. + * For more task-oriented information, see the @ref input_guide. */ -/*! @defgroup monitor Monitor handling +/*! @defgroup monitor Monitor reference * * This is the reference documentation for monitor related functions and types. - * For more information, see the @ref monitor. + * For more task-oriented information, see the @ref monitor_guide. */ -/*! @defgroup window Window handling +/*! @defgroup window Window reference * * This is the reference documentation for window related functions and types, - * including creation, deletion and event polling. For more information, see - * the @ref window. + * including creation, deletion and event polling. For more task-oriented + * information, see the @ref window_guide. */ /************************************************************************* - * Global definitions + * Compiler- and platform-specific preprocessor work *************************************************************************/ -/* ------------------- BEGIN SYSTEM/COMPILER SPECIFIC -------------------- */ - -/* Please report any problems that you find with your compiler, which may - * be solved in this section! There are several compilers that I have not - * been able to test this file with yet. - * - * First: If we are we on Windows, we want a single define for it (_WIN32) - * (Note: For Cygwin the compiler flag -mwin32 should be used, but to - * make sure that things run smoothly for Cygwin users, we add __CYGWIN__ - * to the list of "valid Win32 identifiers", which removes the need for - * -mwin32) +/* If we are we on Windows, we want a single define for it. */ -#if !defined(_WIN32) && (defined(__WIN32__) || defined(WIN32) || defined(__CYGWIN__)) +#if !defined(_WIN32) && (defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__)) #define _WIN32 #endif /* _WIN32 */ -/* In order for extension support to be portable, we need to define an - * OpenGL function call method. We use the keyword APIENTRY, which is - * defined for Win32. (Note: Windows also needs this for ) +/* 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 @@ -99,51 +101,30 @@ extern "C" { #endif #endif /* APIENTRY */ -/* The following three defines are here solely to make some Windows-based - * files happy. Theoretically we could include , but - * it has the major drawback of severely polluting our namespace. +/* Some Windows OpenGL headers need this. */ - -/* Under Windows, we need WINGDIAPI defined */ #if !defined(WINGDIAPI) && defined(_WIN32) - #if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__POCC__) - /* Microsoft Visual C++, Borland C++ Builder and Pelles C */ - #define WINGDIAPI __declspec(dllimport) - #elif defined(__LCC__) - /* LCC-Win32 */ - #define WINGDIAPI __stdcall - #else - /* Others (e.g. MinGW, Cygwin) */ - #define WINGDIAPI extern - #endif + #define WINGDIAPI __declspec(dllimport) #define GLFW_WINGDIAPI_DEFINED #endif /* WINGDIAPI */ -/* Some files also need CALLBACK defined */ +/* Some Windows GLU headers need this. + */ #if !defined(CALLBACK) && defined(_WIN32) - #if defined(_MSC_VER) - /* Microsoft Visual C++ */ - #if (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS) - #define CALLBACK __stdcall - #else - #define CALLBACK - #endif - #else - /* Other Windows compilers */ - #define CALLBACK __stdcall - #endif + #define CALLBACK __stdcall #define GLFW_CALLBACK_DEFINED #endif /* CALLBACK */ -/* Most GL/glu.h variants on Windows need wchar_t - * OpenGL/gl.h blocks the definition of ptrdiff_t by glext.h on OS X */ -#if !defined(GLFW_INCLUDE_NONE) - #include -#endif +/* Most Windows GLU headers need wchar_t. + * The OS X OpenGL header blocks the definition of ptrdiff_t by glext.h. + * Include it unconditionally to avoid surprising side-effects. + */ +#include +#include /* Include the chosen client API headers. */ -#if defined(__APPLE_CC__) +#if defined(__APPLE__) #if defined(GLFW_INCLUDE_GLCOREARB) #include #if defined(GLFW_INCLUDE_GLEXT) @@ -174,13 +155,15 @@ extern "C" { #elif defined(GLFW_INCLUDE_ES3) #include #if defined(GLFW_INCLUDE_GLEXT) - #include + #include #endif #elif defined(GLFW_INCLUDE_ES31) #include #if defined(GLFW_INCLUDE_GLEXT) - #include + #include #endif + #elif defined(GLFW_INCLUDE_VULKAN) + #include #elif !defined(GLFW_INCLUDE_NONE) #include #if defined(GLFW_INCLUDE_GLEXT) @@ -208,11 +191,7 @@ extern "C" { #define GLFWAPI __declspec(dllexport) #elif defined(_WIN32) && defined(GLFW_DLL) /* We are calling GLFW as a Win32 DLL */ - #if defined(__LCC__) - #define GLFWAPI extern - #else - #define GLFWAPI __declspec(dllimport) - #endif + #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"))) @@ -221,8 +200,6 @@ extern "C" { #define GLFWAPI #endif -/* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */ - /************************************************************************* * GLFW API tokens @@ -242,7 +219,7 @@ extern "C" { * backward-compatible. * @ingroup init */ -#define GLFW_VERSION_MINOR 1 +#define GLFW_VERSION_MINOR 2 /*! @brief The revision number of the GLFW library. * * This is incremented when a bug fix release is made that does not contain any @@ -252,6 +229,24 @@ extern "C" { #define GLFW_VERSION_REVISION 0 /*! @} */ +/*! @name Boolean values + * @{ */ +/*! @brief One. + * + * One. Seriously. You don't _need_ to use this symbol in your code. It's + * just semantic sugar for the number 1. You can use `1` or `true` or `_True` + * or `GL_TRUE` or whatever you want. + */ +#define GLFW_TRUE 1 +/*! @brief Zero. + * + * Zero. Seriously. You don't _need_ to use this symbol in your code. It's + * just just semantic sugar for the number 0. You can use `0` or `false` or + * `_False` or `GL_FALSE` or whatever you want. + */ +#define GLFW_FALSE 0 +/*! @} */ + /*! @name Key and button actions * @{ */ /*! @brief The key or mouse button was released. @@ -426,6 +421,7 @@ extern "C" { #define GLFW_KEY_RIGHT_ALT 346 #define GLFW_KEY_RIGHT_SUPER 347 #define GLFW_KEY_MENU 348 + #define GLFW_KEY_LAST GLFW_KEY_MENU /*! @} */ @@ -505,12 +501,11 @@ extern "C" { * @{ */ /*! @brief GLFW has not been initialized. * - * This occurs if a GLFW function was called that may not be called unless the + * This occurs if a GLFW function was called that must 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. + * @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. @@ -519,9 +514,8 @@ extern "C" { * 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. + * @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. @@ -530,8 +524,7 @@ extern "C" { * requesting [GLFW_RED_BITS](@ref window_hints_fb) with @ref * glfwGetWindowAttrib. * - * @par Analysis - * Application programmer error. Fix the offending call. + * @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. @@ -542,46 +535,41 @@ extern "C" { * 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. + * @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). + * @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. +/*! @brief GLFW could not find support for the requested API on the system. * - * GLFW could not find support for the requested client API on the system. + * GLFW could not find support for the requested API on the system. * - * @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. + * @analysis The installed graphics driver does not support the requested + * API, or does not support it via the chosen context creation backend. + * Below are a few examples. * * @par * Some pre-installed Windows graphics drivers do not support OpenGL. AMD only - * supports OpenGL ES via EGL, while Nvidia and Intel only supports it via + * supports OpenGL ES via EGL, while Nvidia and Intel only support it via * a WGL or GLX extension. OS X does not provide OpenGL ES at all. The Mesa * EGL, OpenGL and OpenGL ES libraries do not interface with the Nvidia binary - * driver. + * driver. Older graphics drivers do not support Vulkan. */ #define GLFW_API_UNAVAILABLE 0x00010006 /*! @brief The requested OpenGL or OpenGL ES version is not available. * - * The requested OpenGL or OpenGL ES version (including any requested profile - * or context option) is not available on this machine. + * 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 + * @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 @@ -597,9 +585,9 @@ extern "C" { * A platform-specific error occurred that does not match any of the more * specific categories. * - * @par Analysis - * A bug in GLFW or the underlying operating system. Report the bug to our - * [issue tracker](https://github.com/glfw/glfw/issues). + * @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. @@ -610,8 +598,7 @@ extern "C" { * 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 + * @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 @@ -622,6 +609,14 @@ extern "C" { * the user, as appropriate. */ #define GLFW_FORMAT_UNAVAILABLE 0x00010009 +/*! @brief The specified window does not have an OpenGL or OpenGL ES context. + * + * A window that does not have an OpenGL or OpenGL ES context was passed to + * a function that requires it to have one. + * + * @analysis Application programmer error. Fix the offending call. + */ +#define GLFW_NO_WINDOW_CONTEXT 0x0001000A /*! @} */ #define GLFW_FOCUSED 0x00020001 @@ -631,6 +626,7 @@ extern "C" { #define GLFW_DECORATED 0x00020005 #define GLFW_AUTO_ICONIFY 0x00020006 #define GLFW_FLOATING 0x00020007 +#define GLFW_MAXIMIZED 0x00020008 #define GLFW_RED_BITS 0x00021001 #define GLFW_GREEN_BITS 0x00021002 @@ -658,7 +654,10 @@ extern "C" { #define GLFW_OPENGL_DEBUG_CONTEXT 0x00022007 #define GLFW_OPENGL_PROFILE 0x00022008 #define GLFW_CONTEXT_RELEASE_BEHAVIOR 0x00022009 +#define GLFW_CONTEXT_NO_ERROR 0x0002200A +#define GLFW_CONTEXT_CREATION_API 0x0002200B +#define GLFW_NO_API 0 #define GLFW_OPENGL_API 0x00030001 #define GLFW_OPENGL_ES_API 0x00030002 @@ -682,6 +681,9 @@ extern "C" { #define GLFW_RELEASE_BEHAVIOR_FLUSH 0x00035001 #define GLFW_RELEASE_BEHAVIOR_NONE 0x00035002 +#define GLFW_NATIVE_CONTEXT_API 0x00036001 +#define GLFW_EGL_CONTEXT_API 0x00036002 + /*! @defgroup shapes Standard cursor shapes * * See [standard cursor creation](@ref cursor_standard) for how these are used. @@ -736,14 +738,37 @@ extern "C" { * Generic function pointer used for returning client API function pointers * without forcing a cast from a regular pointer. * + * @sa @ref context_glext + * @sa glfwGetProcAddress + * + * @since Added in version 3.0. + * @ingroup context */ typedef void (*GLFWglproc)(void); +/*! @brief Vulkan API function pointer type. + * + * Generic function pointer used for returning Vulkan API function pointers + * without forcing a cast from a regular pointer. + * + * @sa @ref vulkan_proc + * @sa glfwGetInstanceProcAddress + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +typedef void (*GLFWvkproc)(void); + /*! @brief Opaque monitor object. * * Opaque monitor object. * + * @see @ref monitor_object + * + * @since Added in version 3.0. + * * @ingroup monitor */ typedef struct GLFWmonitor GLFWmonitor; @@ -752,6 +777,10 @@ typedef struct GLFWmonitor GLFWmonitor; * * Opaque window object. * + * @see @ref window_object + * + * @since Added in version 3.0. + * * @ingroup window */ typedef struct GLFWwindow GLFWwindow; @@ -760,6 +789,10 @@ typedef struct GLFWwindow GLFWwindow; * * Opaque cursor object. * + * @see @ref cursor_object + * + * @since Added in version 3.1. + * * @ingroup cursor */ typedef struct GLFWcursor GLFWcursor; @@ -771,8 +804,11 @@ typedef struct GLFWcursor GLFWcursor; * @param[in] error An [error code](@ref errors). * @param[in] description A UTF-8 encoded string describing the error. * + * @sa @ref error_handling * @sa glfwSetErrorCallback * + * @since Added in version 3.0. + * * @ingroup init */ typedef void (* GLFWerrorfun)(int,const char*); @@ -787,8 +823,11 @@ typedef void (* GLFWerrorfun)(int,const char*); * @param[in] ypos The new y-coordinate, in screen coordinates, of the * upper-left corner of the client area of the window. * + * @sa @ref window_pos * @sa glfwSetWindowPosCallback * + * @since Added in version 3.0. + * * @ingroup window */ typedef void (* GLFWwindowposfun)(GLFWwindow*,int,int); @@ -801,8 +840,12 @@ typedef void (* GLFWwindowposfun)(GLFWwindow*,int,int); * @param[in] width The new width, in screen coordinates, of the window. * @param[in] height The new height, in screen coordinates, of the window. * + * @sa @ref window_size * @sa glfwSetWindowSizeCallback * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * * @ingroup window */ typedef void (* GLFWwindowsizefun)(GLFWwindow*,int,int); @@ -813,8 +856,12 @@ typedef void (* GLFWwindowsizefun)(GLFWwindow*,int,int); * * @param[in] window The window that the user attempted to close. * + * @sa @ref window_close * @sa glfwSetWindowCloseCallback * + * @since Added in version 2.5. + * @glfw3 Added window handle parameter. + * * @ingroup window */ typedef void (* GLFWwindowclosefun)(GLFWwindow*); @@ -825,8 +872,12 @@ typedef void (* GLFWwindowclosefun)(GLFWwindow*); * * @param[in] window The window whose content needs to be refreshed. * + * @sa @ref window_refresh * @sa glfwSetWindowRefreshCallback * + * @since Added in version 2.5. + * @glfw3 Added window handle parameter. + * * @ingroup window */ typedef void (* GLFWwindowrefreshfun)(GLFWwindow*); @@ -836,11 +887,14 @@ typedef void (* GLFWwindowrefreshfun)(GLFWwindow*); * 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. + * @param[in] focused `GLFW_TRUE` if the window was given input focus, or + * `GLFW_FALSE` if it lost it. * + * @sa @ref window_focus * @sa glfwSetWindowFocusCallback * + * @since Added in version 3.0. + * * @ingroup window */ typedef void (* GLFWwindowfocusfun)(GLFWwindow*,int); @@ -851,11 +905,14 @@ typedef void (* GLFWwindowfocusfun)(GLFWwindow*,int); * 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. + * @param[in] iconified `GLFW_TRUE` if the window was iconified, or + * `GLFW_FALSE` if it was restored. * + * @sa @ref window_iconify * @sa glfwSetWindowIconifyCallback * + * @since Added in version 3.0. + * * @ingroup window */ typedef void (* GLFWwindowiconifyfun)(GLFWwindow*,int); @@ -869,8 +926,11 @@ typedef void (* GLFWwindowiconifyfun)(GLFWwindow*,int); * @param[in] width The new width, in pixels, of the framebuffer. * @param[in] height The new height, in pixels, of the framebuffer. * + * @sa @ref window_fbsize * @sa glfwSetFramebufferSizeCallback * + * @since Added in version 3.0. + * * @ingroup window */ typedef void (* GLFWframebuffersizefun)(GLFWwindow*,int,int); @@ -886,8 +946,12 @@ typedef void (* GLFWframebuffersizefun)(GLFWwindow*,int,int); * @param[in] mods Bit field describing which [modifier keys](@ref mods) were * held down. * + * @sa @ref input_mouse_button * @sa glfwSetMouseButtonCallback * + * @since Added in version 1.0. + * @glfw3 Added window handle and modifier mask parameters. + * * @ingroup input */ typedef void (* GLFWmousebuttonfun)(GLFWwindow*,int,int,int); @@ -897,11 +961,16 @@ typedef void (* GLFWmousebuttonfun)(GLFWwindow*,int,int,int); * 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. + * @param[in] xpos The new cursor x-coordinate, relative to the left edge of + * the client area. + * @param[in] ypos The new cursor y-coordinate, relative to the top edge of the + * client area. * + * @sa @ref cursor_pos * @sa glfwSetCursorPosCallback * + * @since Added in version 3.0. Replaces `GLFWmouseposfun`. + * * @ingroup input */ typedef void (* GLFWcursorposfun)(GLFWwindow*,double,double); @@ -911,11 +980,14 @@ typedef void (* GLFWcursorposfun)(GLFWwindow*,double,double); * 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. + * @param[in] entered `GLFW_TRUE` if the cursor entered the window's client + * area, or `GLFW_FALSE` if it left it. * + * @sa @ref cursor_enter * @sa glfwSetCursorEnterCallback * + * @since Added in version 3.0. + * * @ingroup input */ typedef void (* GLFWcursorenterfun)(GLFWwindow*,int); @@ -928,8 +1000,11 @@ typedef void (* GLFWcursorenterfun)(GLFWwindow*,int); * @param[in] xoffset The scroll offset along the x-axis. * @param[in] yoffset The scroll offset along the y-axis. * + * @sa @ref scrolling * @sa glfwSetScrollCallback * + * @since Added in version 3.0. Replaces `GLFWmousewheelfun`. + * * @ingroup input */ typedef void (* GLFWscrollfun)(GLFWwindow*,double,double); @@ -945,8 +1020,12 @@ typedef void (* GLFWscrollfun)(GLFWwindow*,double,double); * @param[in] mods Bit field describing which [modifier keys](@ref mods) were * held down. * + * @sa @ref input_key * @sa glfwSetKeyCallback * + * @since Added in version 1.0. + * @glfw3 Added window handle, scancode and modifier mask parameters. + * * @ingroup input */ typedef void (* GLFWkeyfun)(GLFWwindow*,int,int,int,int); @@ -958,8 +1037,12 @@ typedef void (* GLFWkeyfun)(GLFWwindow*,int,int,int,int); * @param[in] window The window that received the event. * @param[in] codepoint The Unicode code point of the character. * + * @sa @ref input_char * @sa glfwSetCharCallback * + * @since Added in version 2.4. + * @glfw3 Added window handle parameter. + * * @ingroup input */ typedef void (* GLFWcharfun)(GLFWwindow*,unsigned int); @@ -976,8 +1059,11 @@ typedef void (* GLFWcharfun)(GLFWwindow*,unsigned int); * @param[in] mods Bit field describing which [modifier keys](@ref mods) were * held down. * + * @sa @ref input_char * @sa glfwSetCharModsCallback * + * @since Added in version 3.1. + * * @ingroup input */ typedef void (* GLFWcharmodsfun)(GLFWwindow*,unsigned int,int); @@ -988,10 +1074,13 @@ typedef void (* GLFWcharmodsfun)(GLFWwindow*,unsigned int,int); * * @param[in] window The window that received the event. * @param[in] count The number of dropped files. - * @param[in] names The UTF-8 encoded path names of the dropped files. + * @param[in] paths The UTF-8 encoded file and/or directory path names. * + * @sa @ref path_drop * @sa glfwSetDropCallback * + * @since Added in version 3.1. + * * @ingroup input */ typedef void (* GLFWdropfun)(GLFWwindow*,int,const char**); @@ -1003,16 +1092,42 @@ typedef void (* GLFWdropfun)(GLFWwindow*,int,const char**); * @param[in] monitor The monitor that was connected or disconnected. * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. * + * @sa @ref monitor_event * @sa glfwSetMonitorCallback * + * @since Added in version 3.0. + * * @ingroup monitor */ typedef void (* GLFWmonitorfun)(GLFWmonitor*,int); +/*! @brief The function signature for joystick configuration callbacks. + * + * This is the function signature for joystick configuration callback + * functions. + * + * @param[in] joy The joystick that was connected or disconnected. + * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. + * + * @sa @ref joystick_event + * @sa glfwSetJoystickCallback + * + * @since Added in version 3.2. + * + * @ingroup input + */ +typedef void (* GLFWjoystickfun)(int,int); + /*! @brief Video mode type. * * This describes a single video mode. * + * @sa @ref monitor_modes + * @sa glfwGetVideoMode glfwGetVideoModes + * + * @since Added in version 1.0. + * @glfw3 Added refresh rate member. + * * @ingroup monitor */ typedef struct GLFWvidmode @@ -1041,8 +1156,11 @@ typedef struct GLFWvidmode * * This describes the gamma ramp for a monitor. * + * @sa @ref monitor_gamma * @sa glfwGetGammaRamp glfwSetGammaRamp * + * @since Added in version 3.0. + * * @ingroup monitor */ typedef struct GLFWgammaramp @@ -1062,6 +1180,11 @@ typedef struct GLFWgammaramp } GLFWgammaramp; /*! @brief Image data. + * + * @sa @ref cursor_custom + * + * @since Added in version 2.1. + * @glfw3 Removed format and bytes-per-pixel members. */ typedef struct GLFWimage { @@ -1092,29 +1215,24 @@ typedef struct GLFWimage * 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. + * termination will return `GLFW_TRUE` immediately. * - * @return `GL_TRUE` if successful, or `GL_FALSE` if an + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an * [error](@ref error_handling) occurred. * - * @remarks __OS X:__ This function will change the current directory of the + * @errors Possible errors include @ref GLFW_PLATFORM_ERROR. + * + * @remark @osx This function will change the current directory of the * application to the `Contents/Resources` subdirectory of the application's * bundle, if present. This can be disabled with a * [compile-time option](@ref compile_options_osx). * - * @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. + * @thread_safety This function must only be called from the main thread. * * @sa @ref intro_init * @sa glfwTerminate * - * @since Added in GLFW 1.0. + * @since Added in version 1.0. * * @ingroup init */ @@ -1132,21 +1250,21 @@ GLFWAPI int glfwInit(void); * call this function, as it is called by @ref glfwInit before it returns * failure. * - * @remarks This function may be called before @ref glfwInit. + * @errors Possible errors include @ref GLFW_PLATFORM_ERROR. * - * @warning No window's context may be current on another thread when this - * function is called. + * @remark This function may be called before @ref glfwInit. * - * @par Reentrancy - * This function may not be called from a callback. + * @warning The contexts of any remaining windows must not be current on any + * other thread when this function is called. * - * @par Thread Safety - * This function may only be called from the main thread. + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref intro_init * @sa glfwInit * - * @since Added in GLFW 1.0. + * @since Added in version 1.0. * * @ingroup init */ @@ -1158,22 +1276,22 @@ GLFWAPI void glfwTerminate(void); * 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. + * Any or all of the version arguments may be `NULL`. * * @param[out] major Where to store the major version number, or `NULL`. * @param[out] minor Where to store the minor version number, or `NULL`. * @param[out] rev Where to store the revision number, or `NULL`. * - * @remarks This function may be called before @ref glfwInit. + * @errors None. * - * @par Thread Safety - * This function may be called from any thread. + * @remark This function may be called before @ref glfwInit. + * + * @thread_safety This function may be called from any thread. * * @sa @ref intro_version * @sa glfwGetVersionString * - * @since Added in GLFW 1.0. + * @since Added in version 1.0. * * @ingroup init */ @@ -1184,28 +1302,27 @@ GLFWAPI void glfwGetVersion(int* major, int* minor, int* rev); * 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. + * compile-time options. It should not be confused with the OpenGL or OpenGL + * ES version string, queried with `glGetString`. * * __Do not use the version string__ to parse the GLFW library version. The - * @ref glfwGetVersion function already provides the version of the running - * library binary. + * @ref glfwGetVersion function provides the version of the running library + * binary in numerical format. * - * This function always succeeds. + * @return The ASCII encoded GLFW version string. * - * @return The GLFW version string. + * @errors None. * - * @remarks This function may be called before @ref glfwInit. + * @remark This function may be called before @ref glfwInit. * - * @par Pointer Lifetime - * The returned string is static and compile-time generated. + * @pointer_lifetime The returned string is static and compile-time generated. * - * @par Thread Safety - * This function may be called from any thread. + * @thread_safety This function may be called from any thread. * * @sa @ref intro_version * @sa glfwGetVersion * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup init */ @@ -1231,14 +1348,15 @@ GLFWAPI const char* glfwGetVersionString(void); * callback. * @return The previously set callback, or `NULL` if no callback was set. * - * @remarks This function may be called before @ref glfwInit. + * @errors None. * - * @par Thread Safety - * This function may only be called from the main thread. + * @remark This function may be called before @ref glfwInit. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref error_handling * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup init */ @@ -1247,26 +1365,27 @@ GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun cbfun); /*! @brief Returns the currently connected monitors. * * This function returns an array of handles for all currently connected - * monitors. + * monitors. The primary monitor is always first in the returned array. If no + * monitors were found, this function returns `NULL`. * * @param[out] count Where to store the number of monitors in the returned * array. This is set to zero if an error occurred. - * @return An array of monitor handles, or `NULL` if an - * [error](@ref error_handling) occurred. + * @return An array of monitor handles, or `NULL` if no monitors were found or + * 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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. * - * @par Thread Safety - * This function may only be called from the main thread. + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is guaranteed to be valid only until the + * monitor configuration changes or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref monitor_monitors * @sa @ref monitor_event * @sa glfwGetPrimaryMonitor * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup monitor */ @@ -1275,18 +1394,22 @@ 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. + * where elements like the task bar or global menu bar are located. * - * @return The primary monitor, or `NULL` if an [error](@ref error_handling) - * occurred. + * @return The primary monitor, or `NULL` if no monitors were found or if an + * [error](@ref error_handling) occurred. * - * @par Thread Safety - * This function may only be called from the main thread. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @remark The primary monitor is always first in the array returned by @ref + * glfwGetMonitors. * * @sa @ref monitor_monitors * @sa glfwGetMonitors * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup monitor */ @@ -1304,12 +1427,14 @@ GLFWAPI GLFWmonitor* glfwGetPrimaryMonitor(void); * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref monitor_properties * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup monitor */ @@ -1334,15 +1459,16 @@ GLFWAPI void glfwGetMonitorPos(GLFWmonitor* monitor, int* xpos, int* ypos); * @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 + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark @win32 calculates the returned physical size from the * current resolution and system DPI instead of querying the monitor EDID data. * - * @par Thread Safety - * This function may only be called from the main thread. + * @thread_safety This function must only be called from the main thread. * * @sa @ref monitor_properties * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup monitor */ @@ -1358,17 +1484,17 @@ GLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* monitor, int* widthMM, int* * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. * - * @par Thread Safety - * This function may only be called from the main thread. + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified monitor is + * disconnected or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref monitor_properties * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup monitor */ @@ -1385,15 +1511,13 @@ GLFWAPI const char* glfwGetMonitorName(GLFWmonitor* monitor); * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. * - * @par Thread Safety - * This function may only be called from the main thread. + * @thread_safety This function must only be called from the main thread. * * @sa @ref monitor_event * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup monitor */ @@ -1412,21 +1536,21 @@ GLFWAPI GLFWmonitorfun glfwSetMonitorCallback(GLFWmonitorfun cbfun); * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. * - * @par Thread Safety - * This function may only be called from the main thread. + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified monitor is + * disconnected, this function is called again for that monitor or the library + * is terminated. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref monitor_modes * @sa glfwGetVideoMode * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Changed to return an array of modes for a specific monitor. + * @since Added in version 1.0. + * @glfw3 Changed to return an array of modes for a specific monitor. * * @ingroup monitor */ @@ -1442,18 +1566,19 @@ GLFWAPI const GLFWvidmode* glfwGetVideoModes(GLFWmonitor* monitor, int* count); * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. * - * @par Thread Safety - * This function may only be called from the main thread. + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified monitor is + * disconnected or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref monitor_modes * @sa glfwGetVideoModes * - * @since Added in GLFW 3.0. Replaces `glfwGetDesktopMode`. + * @since Added in version 3.0. Replaces `glfwGetDesktopMode`. * * @ingroup monitor */ @@ -1462,17 +1587,20 @@ 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. + * 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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref monitor_gamma * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup monitor */ @@ -1486,18 +1614,19 @@ GLFWAPI void glfwSetGamma(GLFWmonitor* monitor, float gamma); * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. * - * @par Thread Safety - * This function may only be called from the main thread. + * @pointer_lifetime The returned structure and its arrays are allocated and + * freed by GLFW. You should not free them yourself. They are valid until the + * specified monitor is disconnected, this function is called again for that + * monitor or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref monitor_gamma * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup monitor */ @@ -1512,17 +1641,22 @@ GLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* monitor); * @param[in] monitor The monitor whose gamma ramp to set. * @param[in] ramp The gamma ramp to use. * - * @note Gamma ramp sizes other than 256 are not supported by all hardware. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. * - * @par Pointer Lifetime - * The specified gamma ramp is copied before this function returns. + * @remark Gamma ramp sizes other than 256 are not supported by all platforms + * or graphics hardware. * - * @par Thread Safety - * This function may only be called from the main thread. + * @remark @win32 The gamma ramp size must be 256. + * + * @pointer_lifetime The specified gamma ramp is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref monitor_gamma * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup monitor */ @@ -1533,13 +1667,14 @@ GLFWAPI void glfwSetGammaRamp(GLFWmonitor* monitor, const GLFWgammaramp* ramp); * 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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref window_hints * @sa glfwWindowHint * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup window */ @@ -1552,20 +1687,26 @@ GLFWAPI void glfwDefaultWindowHints(void); * 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. + * This function does not check whether the specified hint values are valid. + * If you set hints to invalid values this will instead be reported by the next + * call to @ref glfwCreateWindow. * - * @par Thread Safety - * This function may only be called from the main thread. + * @param[in] hint The [window hint](@ref window_hints) to set. + * @param[in] value The new value of the window hint. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref window_hints * @sa glfwDefaultWindowHints * - * @since Added in GLFW 3.0. Replaces `glfwOpenWindowHint`. + * @since Added in version 3.0. Replaces `glfwOpenWindowHint`. * * @ingroup window */ -GLFWAPI void glfwWindowHint(int target, int hint); +GLFWAPI void glfwWindowHint(int hint, int value); /*! @brief Creates a window and its associated context. * @@ -1582,21 +1723,21 @@ GLFWAPI void glfwWindowHint(int target, int hint); * 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. + * of the created window, framebuffer and context, see @ref + * glfwGetWindowAttrib, @ref glfwGetWindowSize and @ref glfwGetFramebufferSize. * * To create a full screen window, you need to specify the monitor the window - * will cover. If no monitor is specified, 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. + * will cover. If no monitor is specified, the window will be windowed mode. + * Unless you have a way for the user to choose a specific monitor, it is + * recommended that you pick the primary monitor. For more information on how + * to query connected monitors, see @ref monitor_monitors. * * For full screen windows, the specified size becomes the resolution of the - * window's _desired video mode_. As long as a full screen window 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. + * window's _desired video mode_. As long as a full screen window is not + * iconified, the supported video mode most closely matching the desired video + * mode is set for the specified monitor. For more information about full + * screen windows, including the creation of so called _windowed full screen_ + * or _borderless full screen_ windows, see @ref window_windowed_full_screen. * * By default, newly created windows use the placement recommended by the * window system. To create the window at a specific position, make it @@ -1604,8 +1745,8 @@ GLFWAPI void glfwWindowHint(int target, int hint); * 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. + * As long as at least one full screen window is not iconified, the screensaver + * is prohibited from starting. * * Window systems put limits on window sizes. Very large or very small window * dimensions may be overridden by the window system on creation. Check the @@ -1619,50 +1760,66 @@ GLFWAPI void glfwWindowHint(int target, int hint); * @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 + * @param[in] monitor The monitor to use for full screen mode, or `NULL` for * windowed mode. * @param[in] share The window whose context to share resources with, or `NULL` * to not share resources. * @return The handle of the created window, or `NULL` if an * [error](@ref error_handling) occurred. * - * @remarks __Windows:__ Window creation will fail if the Microsoft GDI - * software OpenGL implementation is the only one available. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM, @ref GLFW_INVALID_VALUE, @ref GLFW_API_UNAVAILABLE, @ref + * GLFW_VERSION_UNAVAILABLE, @ref GLFW_FORMAT_UNAVAILABLE and @ref + * GLFW_PLATFORM_ERROR. * - * @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. + * @remark @win32 Window creation will fail if the Microsoft GDI software + * OpenGL implementation is the only one available. * - * @remarks __Windows:__ The context to share resources with may not be current - * on any other thread. + * @remark @win32 If the executable has an icon resource named `GLFW_ICON,` it + * will be set as the initial icon for the window. If no such icon is present, + * the `IDI_WINLOGO` icon will be used instead. To set a different icon, see + * @ref glfwSetWindowIcon. * - * @remarks __OS X:__ The GLFW window has no icon, as it is not a document + * @remark @win32 The context to share resources with must not be current on + * any other thread. + * + * @remark @osx The GLFW window has no icon, as it is not a document * window, but the dock icon will be the same as the application bundle's icon. * For more information on bundles, see the * [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/) * in the Mac Developer Library. * - * @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 + * @remark @osx The first time a window is created the menu bar is populated + * with common commands like Hide, Quit and About. The About entry opens + * a minimal about dialog with information from the application's bundle. The + * menu bar can be disabled with a * [compile-time option](@ref compile_options_osx). * - * @remarks __X11:__ There is no mechanism for setting the window icon yet. + * @remark @osx On OS X 10.10 and later the window frame will not be rendered + * at full resolution on Retina displays unless the `NSHighResolutionCapable` + * key is enabled in the application bundle's `Info.plist`. For more + * information, see + * [High Resolution Guidelines for OS X](https://developer.apple.com/library/mac/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html) + * in the Mac Developer Library. The GLFW test and example programs use + * a custom `Info.plist` template for this, which can be found as + * `CMake/MacOSXBundleInfo.plist.in` in the source tree. * - * @remarks __X11:__ Some window managers will not respect the placement of + * @remark @x11 Some window managers will not respect the placement of * initially hidden windows. * - * @par Reentrancy - * This function may not be called from a callback. + * @remark @x11 Due to the asynchronous nature of X11, it may take a moment for + * a window to reach its requested state. This means you may not be able to + * query the final size, position or other attributes directly after window + * creation. * - * @par Thread Safety - * This function may only be called from the main thread. + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref window_creation * @sa glfwDestroyWindow * - * @since Added in GLFW 3.0. Replaces `glfwOpenWindow`. + * @since Added in version 3.0. Replaces `glfwOpenWindow`. * * @ingroup window */ @@ -1678,19 +1835,20 @@ GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height, const char* title, G * * @param[in] window The window to destroy. * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * * @note The context of the specified window must not be current on any other * thread when this function is called. * - * @par Reentrancy - * This function may not be called from a callback. + * @reentrancy This function must not be called from a callback. * - * @par Thread Safety - * This function may only be called from the main thread. + * @thread_safety This function must only be called from the main thread. * * @sa @ref window_creation * @sa glfwCreateWindow * - * @since Added in GLFW 3.0. Replaces `glfwCloseWindow`. + * @since Added in version 3.0. Replaces `glfwCloseWindow`. * * @ingroup window */ @@ -1703,12 +1861,14 @@ GLFWAPI void glfwDestroyWindow(GLFWwindow* 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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. * * @sa @ref window_close * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup window */ @@ -1723,12 +1883,14 @@ GLFWAPI int glfwWindowShouldClose(GLFWwindow* window); * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. * * @sa @ref window_close * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup window */ @@ -1742,20 +1904,62 @@ GLFWAPI void glfwSetWindowShouldClose(GLFWwindow* window, int value); * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @osx The window title will not be updated until the next time you + * process events. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref window_title * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Added window handle parameter. + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. * * @ingroup window */ GLFWAPI void glfwSetWindowTitle(GLFWwindow* window, const char* title); +/*! @brief Sets the icon for the specified window. + * + * This function sets the icon of the specified window. If passed an array of + * candidate images, those of or closest to the sizes desired by the system are + * selected. If no images are specified, the window reverts to its default + * icon. + * + * The desired image sizes varies depending on platform and system settings. + * The selected images will be rescaled as needed. Good sizes include 16x16, + * 32x32 and 48x48. + * + * @param[in] window The window whose icon to set. + * @param[in] count The number of images in the specified array, or zero to + * revert to the default window icon. + * @param[in] images The images to create the icon from. This is ignored if + * count is zero. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The specified image data is copied before this function + * returns. + * + * @remark @osx The GLFW window has no icon, as it is not a document + * window, so this function does nothing. The dock icon will be the same as + * the application bundle's icon. For more information on bundles, see the + * [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/) + * in the Mac Developer Library. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_icon + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowIcon(GLFWwindow* window, int count, const GLFWimage* images); + /*! @brief Retrieves the position of the client area of the specified window. * * This function retrieves the position, in screen coordinates, of the @@ -1770,13 +1974,15 @@ GLFWAPI void glfwSetWindowTitle(GLFWwindow* window, const char* title); * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref window_pos * @sa glfwSetWindowPos * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup window */ @@ -1798,16 +2004,16 @@ GLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos); * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref window_pos * @sa glfwGetWindowPos * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Added window handle parameter. + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. * * @ingroup window */ @@ -1828,48 +2034,134 @@ GLFWAPI void glfwSetWindowPos(GLFWwindow* window, int xpos, int ypos); * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref window_size * @sa glfwSetWindowSize * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Added window handle parameter. + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. * * @ingroup window */ GLFWAPI void glfwGetWindowSize(GLFWwindow* window, int* width, int* height); +/*! @brief Sets the size limits of the specified window. + * + * This function sets the size limits of the client area of the specified + * window. If the window is full screen, the size limits only take effect + * once it is made windowed. If the window is not resizable, this function + * does nothing. + * + * The size limits are applied immediately to a windowed mode window and may + * cause it to be resized. + * + * The maximum dimensions must be greater than or equal to the minimum + * dimensions and all must be greater than or equal to zero. + * + * @param[in] window The window to set limits for. + * @param[in] minwidth The minimum width, in screen coordinates, of the client + * area, or `GLFW_DONT_CARE`. + * @param[in] minheight The minimum height, in screen coordinates, of the + * client area, or `GLFW_DONT_CARE`. + * @param[in] maxwidth The maximum width, in screen coordinates, of the client + * area, or `GLFW_DONT_CARE`. + * @param[in] maxheight The maximum height, in screen coordinates, of the + * client area, or `GLFW_DONT_CARE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @remark If you set size limits and an aspect ratio that conflict, the + * results are undefined. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_sizelimits + * @sa glfwSetWindowAspectRatio + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowSizeLimits(GLFWwindow* window, int minwidth, int minheight, int maxwidth, int maxheight); + +/*! @brief Sets the aspect ratio of the specified window. + * + * This function sets the required aspect ratio of the client area of the + * specified window. If the window is full screen, the aspect ratio only takes + * effect once it is made windowed. If the window is not resizable, this + * function does nothing. + * + * The aspect ratio is specified as a numerator and a denominator and both + * values must be greater than zero. For example, the common 16:9 aspect ratio + * is specified as 16 and 9, respectively. + * + * If the numerator and denominator is set to `GLFW_DONT_CARE` then the aspect + * ratio limit is disabled. + * + * The aspect ratio is applied immediately to a windowed mode window and may + * cause it to be resized. + * + * @param[in] window The window to set limits for. + * @param[in] numer The numerator of the desired aspect ratio, or + * `GLFW_DONT_CARE`. + * @param[in] denom The denominator of the desired aspect ratio, or + * `GLFW_DONT_CARE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @remark If you set size limits and an aspect ratio that conflict, the + * results are undefined. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_sizelimits + * @sa glfwSetWindowSizeLimits + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowAspectRatio(GLFWwindow* window, int numer, int denom); + /*! @brief Sets the size of the client area of the specified window. * * This function sets the size, in screen coordinates, of the client area of * the specified window. * - * For full screen windows, this function 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. + * For full screen windows, this function updates the resolution of its desired + * video mode and switches to the video mode closest to it, without affecting + * the window's context. As the context is unaffected, the bit depths of the + * framebuffer remain unchanged. + * + * If you wish to update the refresh rate of the desired video mode in addition + * to its resolution, see @ref glfwSetWindowMonitor. * * The window manager may put limits on what sizes are allowed. GLFW cannot * and should not override these limits. * * @param[in] window The window to resize. - * @param[in] width The desired width of the specified window. - * @param[in] height The desired height of the specified window. + * @param[in] width The desired width, in screen coordinates, of the window + * client area. + * @param[in] height The desired height, in screen coordinates, of the window + * client area. * - * @par Thread Safety - * This function may only be called from the main thread. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref window_size * @sa glfwGetWindowSize + * @sa glfwSetWindowMonitor * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Added window handle parameter. + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. * * @ingroup window */ @@ -1890,13 +2182,15 @@ GLFWAPI void glfwSetWindowSize(GLFWwindow* window, int width, int height); * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref window_fbsize * @sa glfwSetFramebufferSizeCallback * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup window */ @@ -1926,12 +2220,14 @@ GLFWAPI void glfwGetFramebufferSize(GLFWwindow* window, int* width, int* height) * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref window_size * - * @since Added in GLFW 3.1. + * @since Added in version 3.1. * * @ingroup window */ @@ -1948,16 +2244,17 @@ GLFWAPI void glfwGetWindowFrameSize(GLFWwindow* window, int* left, int* top, int * * @param[in] window The window to iconify. * - * @par Thread Safety - * This function may only be called from the main thread. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref window_iconify * @sa glfwRestoreWindow + * @sa glfwMaximizeWindow * - * @since Added in GLFW 2.1. - * - * @par - * __GLFW 3:__ Added window handle parameter. + * @since Added in version 2.1. + * @glfw3 Added window handle parameter. * * @ingroup window */ @@ -1966,27 +2263,54 @@ 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. + * (minimized) or maximized. If the window is already restored, this function + * does nothing. * * If the specified window is a full screen window, the resolution chosen for * the window is restored on the selected monitor. * * @param[in] window The window to restore. * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_iconify + * @sa glfwIconifyWindow + * @sa glfwMaximizeWindow + * + * @since Added in version 2.1. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwRestoreWindow(GLFWwindow* window); + +/*! @brief Maximizes the specified window. + * + * This function maximizes the specified window if it was previously not + * maximized. If the window is already maximized, this function does nothing. + * + * If the specified window is a full screen window, this function does nothing. + * + * @param[in] window The window to maximize. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * * @par Thread Safety * This function may only be called from the main thread. * * @sa @ref window_iconify * @sa glfwIconifyWindow + * @sa glfwRestoreWindow * - * @since Added in GLFW 2.1. - * - * @par - * __GLFW 3:__ Added window handle parameter. + * @since Added in GLFW 3.2. * * @ingroup window */ -GLFWAPI void glfwRestoreWindow(GLFWwindow* window); +GLFWAPI void glfwMaximizeWindow(GLFWwindow* window); /*! @brief Makes the specified window visible. * @@ -1996,13 +2320,15 @@ GLFWAPI void glfwRestoreWindow(GLFWwindow* window); * * @param[in] window The window to make visible. * - * @par Thread Safety - * This function may only be called from the main thread. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref window_hide * @sa glfwHideWindow * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup window */ @@ -2016,18 +2342,48 @@ GLFWAPI void glfwShowWindow(GLFWwindow* window); * * @param[in] window The window to hide. * - * @par Thread Safety - * This function may only be called from the main thread. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref window_hide * @sa glfwShowWindow * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup window */ GLFWAPI void glfwHideWindow(GLFWwindow* window); +/*! @brief Brings the specified window to front and sets input focus. + * + * This function brings the specified window to front and sets input focus. + * The window should already be visible and not iconified. + * + * By default, both windowed and full screen mode windows are focused when + * initially created. Set the [GLFW_FOCUSED](@ref window_hints_wnd) to disable + * this behavior. + * + * __Do not use this function__ to steal focus from other applications unless + * you are certain that is what the user wants. Focus stealing can be + * extremely disruptive. + * + * @param[in] window The window to give input focus. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_focus + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwFocusWindow(GLFWwindow* window); + /*! @brief Returns the monitor that the window uses for full screen mode. * * This function returns the handle of the monitor that the specified window is @@ -2037,17 +2393,68 @@ GLFWAPI void glfwHideWindow(GLFWwindow* window); * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref window_monitor + * @sa glfwSetWindowMonitor * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup window */ GLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* window); +/*! @brief Sets the mode, monitor, video mode and placement of a window. + * + * This function sets the monitor that the window uses for full screen mode or, + * if the monitor is `NULL`, makes it windowed mode. + * + * When setting a monitor, this function updates the width, height and refresh + * rate of the desired video mode and switches to the video mode closest to it. + * The window position is ignored when setting a monitor. + * + * When the monitor is `NULL`, the position, width and height are used to + * place the window client area. The refresh rate is ignored when no monitor + * is specified. + * + * If you only wish to update the resolution of a full screen window or the + * size of a windowed mode window, see @ref glfwSetWindowSize. + * + * When a window transitions from full screen to windowed mode, this function + * restores any previous window settings such as whether it is decorated, + * floating, resizable, has size or aspect ratio limits, etc.. + * + * @param[in] window The window whose monitor, size or video mode to set. + * @param[in] monitor The desired monitor, or `NULL` to set windowed mode. + * @param[in] xpos The desired x-coordinate of the upper-left corner of the + * client area. + * @param[in] ypos The desired y-coordinate of the upper-left corner of the + * client area. + * @param[in] width The desired with, in screen coordinates, of the client area + * or video mode. + * @param[in] height The desired height, in screen coordinates, of the client + * area or video mode. + * @param[in] refreshRate The desired refresh rate, in Hz, of the video mode, + * or `GLFW_DONT_CARE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_monitor + * @sa @ref window_full_screen + * @sa glfwGetWindowMonitor + * @sa glfwSetWindowSize + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowMonitor(GLFWwindow* window, GLFWmonitor* monitor, int xpos, int ypos, int width, int height, int refreshRate); + /*! @brief Returns an attribute of the specified window. * * This function returns the value of an attribute of the specified window or @@ -2059,12 +2466,22 @@ GLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* window); * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @remark Framebuffer related hints are not window attributes. See @ref + * window_attribs_fb for more information. + * + * @remark Zero is a valid value for many window and context related + * attributes so you cannot use a return value of zero as an indication of + * errors. However, this function should not fail as long as it is passed + * valid arguments and the library has been [initialized](@ref intro_init). + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref window_attribs * - * @since Added in GLFW 3.0. Replaces `glfwGetWindowParam` and + * @since Added in version 3.0. Replaces `glfwGetWindowParam` and * `glfwGetGLVersion`. * * @ingroup window @@ -2080,13 +2497,15 @@ GLFWAPI int glfwGetWindowAttrib(GLFWwindow* window, int attrib); * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. * * @sa @ref window_userptr * @sa glfwGetWindowUserPointer * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup window */ @@ -2099,13 +2518,15 @@ GLFWAPI void glfwSetWindowUserPointer(GLFWwindow* window, void* pointer); * * @param[in] window The window whose pointer to return. * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. * * @sa @ref window_userptr * @sa glfwSetWindowUserPointer * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup window */ @@ -2123,12 +2544,13 @@ GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow* window); * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref window_pos * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup window */ @@ -2146,15 +2568,14 @@ GLFWAPI GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* window, GLFWwindow * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref window_size * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Added window handle parameter. Updated callback signature. + * @since Added in version 1.0. + * @glfw3 Added window handle parameter and return value. * * @ingroup window */ @@ -2177,18 +2598,17 @@ GLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwind * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. * - * @par Thread Safety - * This function may only be called from the main thread. + * @remark @osx Selecting Quit from the application menu will trigger the close + * callback for all windows. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref window_close * - * @since Added in GLFW 2.5. - * - * @par - * __GLFW 3:__ Added window handle parameter. Updated callback signature. + * @since Added in version 2.5. + * @glfw3 Added window handle parameter and return value. * * @ingroup window */ @@ -2210,15 +2630,14 @@ GLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* window, GLFWwi * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref window_refresh * - * @since Added in GLFW 2.5. - * - * @par - * __GLFW 3:__ Added window handle parameter. Updated callback signature. + * @since Added in version 2.5. + * @glfw3 Added window handle parameter and return value. * * @ingroup window */ @@ -2240,12 +2659,13 @@ GLFWAPI GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* window, GL * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref window_focus * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup window */ @@ -2262,12 +2682,13 @@ GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* window, GLFWwi * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref window_iconify * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup window */ @@ -2284,12 +2705,13 @@ GLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* window, GL * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref window_fbsize * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup window */ @@ -2313,16 +2735,18 @@ GLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* window * * Event processing is not required for joystick input to work. * - * @par Reentrancy - * This function may not be called from a callback. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. * - * @par Thread Safety - * This function may only be called from the main thread. + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref events * @sa glfwWaitEvents + * @sa glfwWaitEventsTimeout * - * @since Added in GLFW 1.0. + * @since Added in version 1.0. * * @ingroup window */ @@ -2356,21 +2780,69 @@ GLFWAPI void glfwPollEvents(void); * * Event processing is not required for joystick input to work. * - * @par Reentrancy - * This function may not be called from a callback. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. * - * @par Thread Safety - * This function may only be called from the main thread. + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref events * @sa glfwPollEvents + * @sa glfwWaitEventsTimeout * - * @since Added in GLFW 2.5. + * @since Added in version 2.5. * * @ingroup window */ GLFWAPI void glfwWaitEvents(void); +/*! @brief Waits with timeout until events are queued and processes them. + * + * This function puts the calling thread to sleep until at least one event is + * available in the event queue, or until the specified timeout is reached. If + * one or more events are available, it behaves exactly like @ref + * glfwPollEvents, i.e. the events in the queue are processed and the function + * then returns immediately. Processing events will cause the window and input + * callbacks associated with those events to be called. + * + * The timeout value must be a positive finite number. + * + * Since not all events are associated with callbacks, this function may return + * without a callback having been called even if you are monitoring all + * callbacks. + * + * On some platforms, a window move, resize or menu operation will cause event + * processing to block. This is due to how event processing is designed on + * those platforms. You can use the + * [window refresh callback](@ref window_refresh) to redraw the contents of + * your window when necessary during such operations. + * + * On some platforms, certain callbacks may be called outside of a call to one + * of the event processing functions. + * + * If no windows exist, this function returns immediately. For synchronization + * of threads in applications that do not create windows, use your threading + * library of choice. + * + * Event processing is not required for joystick input to work. + * + * @param[in] timeout The maximum amount of time, in seconds, to wait. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref events + * @sa glfwPollEvents + * @sa glfwWaitEvents + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwWaitEventsTimeout(double timeout); + /*! @brief Posts an empty event to the event queue. * * This function posts an empty event from the current thread to the event @@ -2380,13 +2852,15 @@ GLFWAPI void glfwWaitEvents(void); * 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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function may be called from any thread. * * @sa @ref events * @sa glfwWaitEvents * - * @since Added in GLFW 3.1. + * @since Added in version 3.1. * * @ingroup window */ @@ -2402,12 +2876,14 @@ GLFWAPI void glfwPostEmptyEvent(void); * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. * * @sa glfwSetInputMode * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup input */ @@ -2428,37 +2904,96 @@ GLFWAPI int glfwGetInputMode(GLFWwindow* window, int mode); * 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 + * If the mode is `GLFW_STICKY_KEYS`, the value must be either `GLFW_TRUE` to + * enable sticky keys, or `GLFW_FALSE` to disable it. If sticky keys are * enabled, a key press will ensure that @ref glfwGetKey returns `GLFW_PRESS` * the next time it is called even if the key had been released before the * call. This is useful when you are only interested in whether keys have been * pressed but not when or in which order. * * If the mode is `GLFW_STICKY_MOUSE_BUTTONS`, the value must be either - * `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. + * `GLFW_TRUE` to enable sticky mouse buttons, or `GLFW_FALSE` to disable it. + * If sticky mouse buttons are enabled, a mouse button press will ensure that + * @ref glfwGetMouseButton returns `GLFW_PRESS` the next time it is called even + * if the mouse button had been released before the call. This is useful when + * you are only interested in whether mouse buttons have been pressed but not + * when or in which order. * * @param[in] window The window whose input mode to set. * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or * `GLFW_STICKY_MOUSE_BUTTONS`. * @param[in] value The new value of the specified input mode. * - * @par Thread Safety - * This function may only be called from the main thread. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. * * @sa glfwGetInputMode * - * @since Added in GLFW 3.0. Replaces `glfwEnable` and `glfwDisable`. + * @since Added in version 3.0. Replaces `glfwEnable` and `glfwDisable`. * * @ingroup input */ GLFWAPI void glfwSetInputMode(GLFWwindow* window, int mode, int value); +/*! @brief Returns the localized name of the specified printable key. + * + * This function returns the localized name of the specified printable key. + * This is intended for displaying key bindings to the user. + * + * If the key is `GLFW_KEY_UNKNOWN`, the scancode is used instead, otherwise + * the scancode is ignored. If a non-printable key or (if the key is + * `GLFW_KEY_UNKNOWN`) a scancode that maps to a non-printable key is + * specified, this function returns `NULL`. + * + * This behavior allows you to pass in the arguments passed to the + * [key callback](@ref input_key) without modification. + * + * The printable keys are: + * - `GLFW_KEY_APOSTROPHE` + * - `GLFW_KEY_COMMA` + * - `GLFW_KEY_MINUS` + * - `GLFW_KEY_PERIOD` + * - `GLFW_KEY_SLASH` + * - `GLFW_KEY_SEMICOLON` + * - `GLFW_KEY_EQUAL` + * - `GLFW_KEY_LEFT_BRACKET` + * - `GLFW_KEY_RIGHT_BRACKET` + * - `GLFW_KEY_BACKSLASH` + * - `GLFW_KEY_WORLD_1` + * - `GLFW_KEY_WORLD_2` + * - `GLFW_KEY_0` to `GLFW_KEY_9` + * - `GLFW_KEY_A` to `GLFW_KEY_Z` + * - `GLFW_KEY_KP_0` to `GLFW_KEY_KP_9` + * - `GLFW_KEY_KP_DECIMAL` + * - `GLFW_KEY_KP_DIVIDE` + * - `GLFW_KEY_KP_MULTIPLY` + * - `GLFW_KEY_KP_SUBTRACT` + * - `GLFW_KEY_KP_ADD` + * - `GLFW_KEY_KP_EQUAL` + * + * @param[in] key The key to query, or `GLFW_KEY_UNKNOWN`. + * @param[in] scancode The scancode of the key to query. + * @return The localized name of the key, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the next call to @ref + * glfwGetKeyName, or until the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_key_name + * + * @since Added in version 3.2. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetKeyName(int key, int scancode); + /*! @brief Returns the last reported state of a keyboard key for the specified * window. * @@ -2478,20 +3013,22 @@ GLFWAPI void glfwSetInputMode(GLFWwindow* window, int mode, int value); * The [modifier key bit masks](@ref mods) are not key tokens and cannot be * used with this function. * + * __Do not use this function__ to implement [text input](@ref input_char). + * * @param[in] window The desired window. * @param[in] key The desired [keyboard key](@ref keys). `GLFW_KEY_UNKNOWN` is * not a valid key for this function. * @return One of `GLFW_PRESS` or `GLFW_RELEASE`. * - * @par Thread Safety - * This function may only be called from the main thread. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref input_key * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Added window handle parameter. + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. * * @ingroup input */ @@ -2512,15 +3049,15 @@ GLFWAPI int glfwGetKey(GLFWwindow* window, int key); * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref input_mouse_button * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Added window handle parameter. + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. * * @ingroup input */ @@ -2550,13 +3087,15 @@ GLFWAPI int glfwGetMouseButton(GLFWwindow* window, int button); * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref cursor_pos * @sa glfwSetCursorPos * - * @since Added in GLFW 3.0. Replaces `glfwGetMousePos`. + * @since Added in version 3.0. Replaces `glfwGetMousePos`. * * @ingroup input */ @@ -2585,17 +3124,15 @@ GLFWAPI void glfwGetCursorPos(GLFWwindow* window, double* xpos, double* ypos); * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. * - * @par Thread Safety - * This function may only be called from the main thread. + * @thread_safety This function must only be called from the main thread. * * @sa @ref cursor_pos * @sa glfwGetCursorPos * - * @since Added in GLFW 3.0. Replaces `glfwSetMousePos`. + * @since Added in version 3.0. Replaces `glfwSetMousePos`. * * @ingroup input */ @@ -2607,9 +3144,9 @@ GLFWAPI void glfwSetCursorPos(GLFWwindow* window, double xpos, double ypos); * 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 pixels are 32-bit, little-endian, non-premultiplied RGBA, i.e. eight + * bits per channel. They are arranged canonically as packed sequential rows, + * starting from the top-left corner. * * The cursor hotspot is specified in pixels, relative to the upper-left corner * of the cursor image. Like all other coordinate systems in GLFW, the X-axis @@ -2618,24 +3155,24 @@ GLFWAPI void glfwSetCursorPos(GLFWwindow* window, double xpos, double ypos); * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. * - * @par Reentrancy - * This function may not be called from a callback. + * @pointer_lifetime The specified image data is copied before this function + * returns. * - * @par Thread Safety - * This function may only be called from the main thread. + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref cursor_object * @sa glfwDestroyCursor * @sa glfwCreateStandardCursor * - * @since Added in GLFW 3.1. + * @since Added in version 3.1. * * @ingroup input */ @@ -2647,20 +3184,20 @@ GLFWAPI GLFWcursor* glfwCreateCursor(const GLFWimage* image, int xhot, int yhot) * 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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. * - * @par Thread Safety - * This function may only be called from the main thread. + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref cursor_object * @sa glfwCreateCursor * - * @since Added in GLFW 3.1. + * @since Added in version 3.1. * * @ingroup input */ @@ -2674,16 +3211,17 @@ GLFWAPI GLFWcursor* glfwCreateStandardCursor(int shape); * * @param[in] cursor The cursor object to destroy. * - * @par Reentrancy - * This function may not be called from a callback. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. * - * @par Thread Safety - * This function may only be called from the main thread. + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref cursor_object * @sa glfwCreateCursor * - * @since Added in GLFW 3.1. + * @since Added in version 3.1. * * @ingroup input */ @@ -2703,12 +3241,14 @@ GLFWAPI void glfwDestroyCursor(GLFWcursor* cursor); * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref cursor_object * - * @since Added in GLFW 3.1. + * @since Added in version 3.1. * * @ingroup input */ @@ -2744,15 +3284,14 @@ GLFWAPI void glfwSetCursor(GLFWwindow* window, GLFWcursor* cursor); * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref input_key * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Added window handle parameter. Updated callback signature. + * @since Added in version 1.0. + * @glfw3 Added window handle parameter and return value. * * @ingroup input */ @@ -2783,15 +3322,14 @@ GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun cbfun); * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref input_char * - * @since Added in GLFW 2.4. - * - * @par - * __GLFW 3:__ Added window handle parameter. Updated callback signature. + * @since Added in version 2.4. + * @glfw3 Added window handle parameter and return value. * * @ingroup input */ @@ -2818,12 +3356,13 @@ GLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* window, GLFWcharfun cbfun); * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref input_char * - * @since Added in GLFW 3.1. + * @since Added in version 3.1. * * @ingroup input */ @@ -2846,15 +3385,14 @@ GLFWAPI GLFWcharmodsfun glfwSetCharModsCallback(GLFWwindow* window, GLFWcharmods * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref input_mouse_button * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Added window handle parameter. Updated callback signature. + * @since Added in version 1.0. + * @glfw3 Added window handle parameter and return value. * * @ingroup input */ @@ -2873,12 +3411,13 @@ GLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* window, GLFWmo * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref cursor_pos * - * @since Added in GLFW 3.0. Replaces `glfwSetMousePosCallback`. + * @since Added in version 3.0. Replaces `glfwSetMousePosCallback`. * * @ingroup input */ @@ -2896,12 +3435,13 @@ GLFWAPI GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* window, GLFWcursor * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref cursor_enter * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup input */ @@ -2922,12 +3462,13 @@ GLFWAPI GLFWcursorenterfun glfwSetCursorEnterCallback(GLFWwindow* window, GLFWcu * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref scrolling * - * @since Added in GLFW 3.0. Replaces `glfwSetMouseWheelCallback`. + * @since Added in version 3.0. Replaces `glfwSetMouseWheelCallback`. * * @ingroup input */ @@ -2949,12 +3490,13 @@ GLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow* window, GLFWscrollfun cb * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref path_drop * - * @since Added in GLFW 3.1. + * @since Added in version 3.1. * * @ingroup input */ @@ -2965,14 +3507,16 @@ GLFWAPI GLFWdropfun glfwSetDropCallback(GLFWwindow* window, GLFWdropfun cbfun); * 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. + * @return `GLFW_TRUE` if the joystick is present, or `GLFW_FALSE` otherwise. * - * @par Thread Safety - * This function may only be called from the main thread. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref joystick * - * @since Added in GLFW 3.0. Replaces `glfwGetJoystickParam`. + * @since Added in version 3.0. Replaces `glfwGetJoystickParam`. * * @ingroup input */ @@ -2983,22 +3527,28 @@ GLFWAPI int glfwJoystickPresent(int joy); * This function returns the values of all axes of the specified joystick. * Each element in the array is a value between -1.0 and 1.0. * + * Querying a joystick slot with no device present is not an error, but will + * cause this function to return `NULL`. Call @ref glfwJoystickPresent to + * check device presence. + * * @param[in] joy The [joystick](@ref joysticks) to query. * @param[out] count Where to store the number of axis values in the returned * array. This is set to zero if 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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. * - * @par Thread Safety - * This function may only be called from the main thread. + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified joystick is + * disconnected, this function is called again for that joystick or the library + * is terminated. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref joystick_axis * - * @since Added in GLFW 3.0. Replaces `glfwGetJoystickPos`. + * @since Added in version 3.0. Replaces `glfwGetJoystickPos`. * * @ingroup input */ @@ -3009,25 +3559,29 @@ GLFWAPI const float* glfwGetJoystickAxes(int joy, int* count); * This function returns the state of all buttons of the specified joystick. * Each element in the array is either `GLFW_PRESS` or `GLFW_RELEASE`. * + * Querying a joystick slot with no device present is not an error, but will + * cause this function to return `NULL`. Call @ref glfwJoystickPresent to + * check device presence. + * * @param[in] joy The [joystick](@ref joysticks) to query. * @param[out] count Where to store the number of button states in the returned * array. This is set to zero if 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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. * - * @par Thread Safety - * This function may only be called from the main thread. + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified joystick is + * disconnected, this function is called again for that joystick or the library + * is terminated. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref joystick_button * - * @since Added in GLFW 2.2. - * - * @par - * __GLFW 3:__ Changed to return a dynamic array. + * @since Added in version 2.2. + * @glfw3 Changed to return a dynamic array. * * @ingroup input */ @@ -3039,26 +3593,55 @@ GLFWAPI const unsigned char* glfwGetJoystickButtons(int joy, int* count); * The returned string is allocated and freed by GLFW. You should not free it * yourself. * + * Querying a joystick slot with no device present is not an error, but will + * cause this function to return `NULL`. Call @ref glfwJoystickPresent to + * check device presence. + * * @param[in] joy The [joystick](@ref joysticks) to query. * @return The UTF-8 encoded name of the joystick, or `NULL` if the joystick * is not present. * - * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. * - * @par Thread Safety - * This function may only be called from the main thread. + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified joystick is + * disconnected, this function is called again for that joystick or the library + * is terminated. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref joystick_name * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup input */ GLFWAPI const char* glfwGetJoystickName(int joy); +/*! @brief Sets the joystick configuration callback. + * + * This function sets the joystick configuration callback, or removes the + * currently set callback. This is called when a joystick is connected to or + * disconnected from the system. + * + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_event + * + * @since Added in version 3.2. + * + * @ingroup input + */ +GLFWAPI GLFWjoystickfun glfwSetJoystickCallback(GLFWjoystickfun cbfun); + /*! @brief Sets the clipboard to the specified string. * * This function sets the system clipboard to the specified, UTF-8 encoded @@ -3067,16 +3650,18 @@ GLFWAPI const char* glfwGetJoystickName(int joy); * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. * - * @par Thread Safety - * This function may only be called from the main thread. + * @pointer_lifetime The specified string is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. * * @sa @ref clipboard * @sa glfwGetClipboardString * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup input */ @@ -3085,25 +3670,28 @@ 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. + * or is convertible to a UTF-8 encoded string. If the clipboard is empty or + * if its contents cannot be converted, `NULL` is returned and a @ref + * GLFW_FORMAT_UNAVAILABLE error is generated. * * @param[in] window The window that will request the clipboard contents. * @return The contents of the clipboard as a UTF-8 encoded string, or `NULL` * if an [error](@ref error_handling) occurred. * - * @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 + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the next call to @ref * glfwGetClipboardString or @ref glfwSetClipboardString, or until the library * is terminated. * - * @par Thread Safety - * This function may only be called from the main thread. + * @thread_safety This function must only be called from the main thread. * * @sa @ref clipboard * @sa glfwSetClipboardString * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup input */ @@ -3122,12 +3710,15 @@ GLFWAPI const char* glfwGetClipboardString(GLFWwindow* window); * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Reading and + * writing of the internal timer offset is not atomic, so it needs to be + * externally synchronized with calls to @ref glfwSetTime. * * @sa @ref time * - * @since Added in GLFW 1.0. + * @since Added in version 1.0. * * @ingroup input */ @@ -3136,21 +3727,72 @@ 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. + * 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. * - * @par Thread Safety - * This function may only be called from the main thread. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_VALUE. + * + * @remark The upper limit of the timer is calculated as + * floor((264 - 1) / 109) and is due to implementations + * storing nanoseconds in 64 bits. The limit may be increased in the future. + * + * @thread_safety This function may be called from any thread. Reading and + * writing of the internal timer offset is not atomic, so it needs to be + * externally synchronized with calls to @ref glfwGetTime. * * @sa @ref time * - * @since Added in GLFW 2.2. + * @since Added in version 2.2. * * @ingroup input */ GLFWAPI void glfwSetTime(double time); +/*! @brief Returns the current value of the raw timer. + * + * This function returns the current value of the raw timer, measured in + * 1 / frequency seconds. To get the frequency, call @ref + * glfwGetTimerFrequency. + * + * @return The value of the timer, or zero if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref time + * @sa glfwGetTimerFrequency + * + * @since Added in version 3.2. + * + * @ingroup input + */ +GLFWAPI uint64_t glfwGetTimerValue(void); + +/*! @brief Returns the frequency, in Hz, of the raw timer. + * + * This function returns the frequency, in Hz, of the raw timer. + * + * @return The frequency of the timer, in Hz, or zero if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref time + * @sa glfwGetTimerValue + * + * @since Added in version 3.2. + * + * @ingroup input + */ +GLFWAPI uint64_t glfwGetTimerFrequency(void); + /*! @brief Makes the context of the specified window current for the calling * thread. * @@ -3164,16 +3806,22 @@ GLFWAPI void glfwSetTime(double time); * whether a context performs this flush by setting the * [GLFW_CONTEXT_RELEASE_BEHAVIOR](@ref window_hints_ctx) window hint. * + * The specified window must have an OpenGL or OpenGL ES context. Specifying + * a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT + * error. + * * @param[in] window The window whose context to make current, or `NULL` to * detach the current context. * - * @par Thread Safety - * This function may be called from any thread. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function may be called from any thread. * * @sa @ref context_current * @sa glfwGetCurrentContext * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup context */ @@ -3187,13 +3835,14 @@ GLFWAPI void glfwMakeContextCurrent(GLFWwindow* window); * @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. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. * * @sa @ref context_current * @sa glfwMakeContextCurrent * - * @since Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup context */ @@ -3201,22 +3850,33 @@ 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. + * This function swaps the front and back buffers of the specified window when + * rendering with OpenGL or OpenGL ES. If the swap interval is greater than + * zero, the GPU driver waits the specified number of screen updates before + * swapping the buffers. + * + * The specified window must have an OpenGL or OpenGL ES context. Specifying + * a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT + * error. + * + * This function does not apply to Vulkan. If you are rendering with Vulkan, + * see `vkQueuePresentKHR` instead. * * @param[in] window The window whose buffers to swap. * - * @par Thread Safety - * This function may be called from any thread. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @remark __EGL:__ The context of the specified window must be current on the + * calling thread. + * + * @thread_safety This function may be called from any thread. * * @sa @ref buffer_swap * @sa glfwSwapInterval * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Added window handle parameter. + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. * * @ingroup window */ @@ -3224,11 +3884,11 @@ 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_. + * This function sets the swap interval for the current OpenGL or OpenGL ES + * context, i.e. the number of screen updates to wait from the time @ref + * glfwSwapBuffers was called before swapping the buffers and returning. This + * is sometimes called _vertical synchronization_, _vertical retrace + * synchronization_ or just _vsync_. * * Contexts that support either of the `WGL_EXT_swap_control_tear` and * `GLX_EXT_swap_control_tear` extensions also accept negative swap intervals, @@ -3240,25 +3900,30 @@ GLFWAPI void glfwSwapBuffers(GLFWwindow* window); * A context must be current on the calling thread. Calling this function * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. * + * This function does not apply to Vulkan. If you are rendering with Vulkan, + * see the present mode of your swapchain instead. + * * @param[in] interval The minimum number of screen updates to wait for * until the buffers are swapped by @ref glfwSwapBuffers. * - * @note This function is not called during window creation, leaving the swap - * interval set to whatever is the default on that platform. This is done + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_CURRENT_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @remark This function is not called during context creation, leaving the + * swap interval set to whatever is the default on that platform. This is done * because some swap interval extensions used by GLFW do not allow the swap * interval to be reset to zero once it has been set to a non-zero value. * - * @note Some GPU drivers do not honor the requested swap interval, either - * because of user settings that override the request or due to bugs in the - * driver. + * @remark Some GPU drivers do not honor the requested swap interval, either + * because of a user setting that overrides the application's request or due to + * bugs in the driver. * - * @par Thread Safety - * This function may be called from any thread. + * @thread_safety This function may be called from any thread. * * @sa @ref buffer_swap * @sa glfwSwapBuffers * - * @since Added in GLFW 1.0. + * @since Added in version 1.0. * * @ingroup context */ @@ -3268,8 +3933,8 @@ GLFWAPI void glfwSwapInterval(int interval); * * This function returns whether the specified * [API extension](@ref context_glext) is supported by the current OpenGL or - * OpenGL ES context. It searches both for OpenGL and OpenGL ES extension and - * platform-specific context creation API extensions. + * OpenGL ES context. It searches both for client API extension and context + * creation API extensions. * * A context must be current on the calling thread. Calling this function * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. @@ -3279,16 +3944,24 @@ GLFWAPI void glfwSwapInterval(int interval); * 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. + * This function does not apply to Vulkan. If you are using Vulkan, see @ref + * glfwGetRequiredInstanceExtensions, `vkEnumerateInstanceExtensionProperties` + * and `vkEnumerateDeviceExtensionProperties` instead. * - * @par Thread Safety - * This function may be called from any thread. + * @param[in] extension The ASCII encoded name of the extension. + * @return `GLFW_TRUE` if the extension is available, or `GLFW_FALSE` + * otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_CURRENT_CONTEXT, @ref GLFW_INVALID_VALUE and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function may be called from any thread. * * @sa @ref context_glext * @sa glfwGetProcAddress * - * @since Added in GLFW 1.0. + * @since Added in version 1.0. * * @ingroup context */ @@ -3297,36 +3970,243 @@ 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 - * [client API or extension function](@ref context_glext), if it is supported + * This function returns the address of the specified OpenGL or OpenGL ES + * [core or extension function](@ref context_glext), if it is supported * by the current context. * * A context must be current on the calling thread. Calling this function * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. * - * @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. + * This function does not apply to Vulkan. If you are rendering with Vulkan, + * see @ref glfwGetInstanceProcAddress, `vkGetInstanceProcAddr` and + * `vkGetDeviceProcAddr` instead. * - * @note The addresses of a given function is not guaranteed to be the same + * @param[in] procname The ASCII encoded name of the function. + * @return The address of the function, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_CURRENT_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @remark The address of a given function is not guaranteed to be the same * between contexts. * - * @par Pointer Lifetime - * The returned function pointer is valid until the context is destroyed or the - * library is terminated. + * @remark This function may return a non-`NULL` address despite the + * associated version or extension not being available. Always check the + * context version or extension string first. * - * @par Thread Safety - * This function may be called from any thread. + * @pointer_lifetime The returned function pointer is valid until the context + * is destroyed or the library is terminated. + * + * @thread_safety This function may be called from any thread. * * @sa @ref context_glext * @sa glfwExtensionSupported * - * @since Added in GLFW 1.0. + * @since Added in version 1.0. * * @ingroup context */ GLFWAPI GLFWglproc glfwGetProcAddress(const char* procname); +/*! @brief Returns whether the Vulkan loader has been found. + * + * This function returns whether the Vulkan loader has been found. This check + * is performed by @ref glfwInit. + * + * The availability of a Vulkan loader does not by itself guarantee that window + * surface creation or even device creation is possible. Call @ref + * glfwGetRequiredInstanceExtensions to check whether the extensions necessary + * for Vulkan surface creation are available and @ref + * glfwGetPhysicalDevicePresentationSupport to check whether a queue family of + * a physical device supports image presentation. + * + * @return `GLFW_TRUE` if Vulkan is available, or `GLFW_FALSE` otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref vulkan_support + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI int glfwVulkanSupported(void); + +/*! @brief Returns the Vulkan instance extensions required by GLFW. + * + * This function returns an array of names of Vulkan instance extensions required + * by GLFW for creating Vulkan surfaces for GLFW windows. If successful, the + * list will always contains `VK_KHR_surface`, so if you don't require any + * additional extensions you can pass this list directly to the + * `VkInstanceCreateInfo` struct. + * + * If Vulkan is not available on the machine, this function returns `NULL` and + * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported + * to check whether Vulkan is available. + * + * If Vulkan is available but no set of extensions allowing window surface + * creation was found, this function returns `NULL`. You may still use Vulkan + * for off-screen rendering and compute work. + * + * @param[out] count Where to store the number of extensions in the returned + * array. This is set to zero if an error occurred. + * @return An array of ASCII encoded extension names, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_API_UNAVAILABLE. + * + * @remarks Additional extensions may be required by future versions of GLFW. + * You should check if any extensions you wish to enable are already in the + * returned array, as it is an error to specify an extension more than once in + * the `VkInstanceCreateInfo` struct. + * + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is guaranteed to be valid only until the + * library is terminated. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref vulkan_ext + * @sa glfwCreateWindowSurface + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI const char** glfwGetRequiredInstanceExtensions(uint32_t* count); + +#if defined(VK_VERSION_1_0) + +/*! @brief Returns the address of the specified Vulkan instance function. + * + * This function returns the address of the specified Vulkan core or extension + * function for the specified instance. If instance is set to `NULL` it can + * return any function exported from the Vulkan loader, including at least the + * following functions: + * + * - `vkEnumerateInstanceExtensionProperties` + * - `vkEnumerateInstanceLayerProperties` + * - `vkCreateInstance` + * - `vkGetInstanceProcAddr` + * + * If Vulkan is not available on the machine, this function returns `NULL` and + * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported + * to check whether Vulkan is available. + * + * This function is equivalent to calling `vkGetInstanceProcAddr` with + * a platform-specific query of the Vulkan loader as a fallback. + * + * @param[in] instance The Vulkan instance to query, or `NULL` to retrieve + * functions related to instance creation. + * @param[in] procname The ASCII encoded name of the function. + * @return The address of the function, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_API_UNAVAILABLE. + * + * @pointer_lifetime The returned function pointer is valid until the library + * is terminated. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref vulkan_proc + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI GLFWvkproc glfwGetInstanceProcAddress(VkInstance instance, const char* procname); + +/*! @brief Returns whether the specified queue family can present images. + * + * This function returns whether the specified queue family of the specified + * physical device supports presentation to the platform GLFW was built for. + * + * If Vulkan or the required window surface creation instance extensions are + * not available on the machine, or if the specified instance was not created + * with the required extensions, this function returns `GLFW_FALSE` and + * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported + * to check whether Vulkan is available and @ref + * glfwGetRequiredInstanceExtensions to check what instance extensions are + * required. + * + * @param[in] instance The instance that the physical device belongs to. + * @param[in] device The physical device that the queue family belongs to. + * @param[in] queuefamily The index of the queue family to query. + * @return `GLFW_TRUE` if the queue family supports presentation, or + * `GLFW_FALSE` otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_API_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function may be called from any thread. For + * synchronization details of Vulkan objects, see the Vulkan specification. + * + * @sa @ref vulkan_present + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI int glfwGetPhysicalDevicePresentationSupport(VkInstance instance, VkPhysicalDevice device, uint32_t queuefamily); + +/*! @brief Creates a Vulkan surface for the specified window. + * + * This function creates a Vulkan surface for the specified window. + * + * If the Vulkan loader was not found at initialization, this function returns + * `VK_ERROR_INITIALIZATION_FAILED` and generates a @ref GLFW_API_UNAVAILABLE + * error. Call @ref glfwVulkanSupported to check whether the Vulkan loader was + * found. + * + * If the required window surface creation instance extensions are not + * available or if the specified instance was not created with these extensions + * enabled, this function returns `VK_ERROR_EXTENSION_NOT_PRESENT` and + * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref + * glfwGetRequiredInstanceExtensions to check what instance extensions are + * required. + * + * The window surface must be destroyed before the specified Vulkan instance. + * It is the responsibility of the caller to destroy the window surface. GLFW + * does not destroy it for you. Call `vkDestroySurfaceKHR` to destroy the + * surface. + * + * @param[in] instance The Vulkan instance to create the surface in. + * @param[in] window The window to create the surface for. + * @param[in] allocator The allocator to use, or `NULL` to use the default + * allocator. + * @param[out] surface Where to store the handle of the surface. This is set + * to `VK_NULL_HANDLE` if an error occurred. + * @return `VK_SUCCESS` if successful, or a Vulkan error code if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_API_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR. + * + * @remarks If an error occurs before the creation call is made, GLFW returns + * the Vulkan error code most appropriate for the error. Appropriate use of + * @ref glfwVulkanSupported and @ref glfwGetRequiredInstanceExtensions should + * eliminate almost all occurrences of these errors. + * + * @thread_safety This function may be called from any thread. For + * synchronization details of Vulkan objects, see the Vulkan specification. + * + * @sa @ref vulkan_surface + * @sa glfwGetRequiredInstanceExtensions + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI VkResult glfwCreateWindowSurface(VkInstance instance, GLFWwindow* window, const VkAllocationCallbacks* allocator, VkSurfaceKHR* surface); + +#endif /*VK_VERSION_1_0*/ + /************************************************************************* * Global definition cleanup diff --git a/src/external/glfw3/include/GLFW/glfw3native.h b/src/external/glfw3/include/GLFW/glfw3native.h index b3ce7482d..30e1a570f 100644 --- a/src/external/glfw3/include/GLFW/glfw3native.h +++ b/src/external/glfw3/include/GLFW/glfw3native.h @@ -1,9 +1,9 @@ /************************************************************************* - * GLFW 3.1 - www.glfw.org + * GLFW 3.2 - www.glfw.org * A library for OpenGL, window and input *------------------------------------------------------------------------ * Copyright (c) 2002-2006 Marcus Geelnard - * Copyright (c) 2006-2010 Camilla Berglund + * Copyright (c) 2006-2016 Camilla Berglund * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -38,20 +38,30 @@ extern "C" { * Doxygen documentation *************************************************************************/ +/*! @file glfw3native.h + * @brief The header of the native access functions. + * + * This is the header file of the native access functions. See @ref native for + * more information. + */ /*! @defgroup native Native access * * **By using the native access functions you assert that you know what you're * doing and how to fix problems caused by using them. If you don't, you * shouldn't be using them.** * - * Before the inclusion of @ref glfw3native.h, you 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. + * Before the inclusion of @ref glfw3native.h, you may define exactly one + * window system API macro and zero or more context creation API macros. + * + * The chosen backends must match those the library was compiled for. Failure + * to do this will cause a link-time error. * * The available window API macros are: * * `GLFW_EXPOSE_NATIVE_WIN32` * * `GLFW_EXPOSE_NATIVE_COCOA` * * `GLFW_EXPOSE_NATIVE_X11` + * * `GLFW_EXPOSE_NATIVE_WAYLAND` + * * `GLFW_EXPOSE_NATIVE_MIR` * * The available context API macros are: * * `GLFW_EXPOSE_NATIVE_WGL` @@ -86,20 +96,23 @@ extern "C" { #elif defined(GLFW_EXPOSE_NATIVE_X11) #include #include -#else - #error "No window API selected" +#elif defined(GLFW_EXPOSE_NATIVE_WAYLAND) + #include +#elif defined(GLFW_EXPOSE_NATIVE_MIR) + #include #endif #if defined(GLFW_EXPOSE_NATIVE_WGL) /* WGL is declared by windows.h */ -#elif defined(GLFW_EXPOSE_NATIVE_NSGL) +#endif +#if defined(GLFW_EXPOSE_NATIVE_NSGL) /* NSGL is declared by Cocoa.h */ -#elif defined(GLFW_EXPOSE_NATIVE_GLX) +#endif +#if defined(GLFW_EXPOSE_NATIVE_GLX) #include -#elif defined(GLFW_EXPOSE_NATIVE_EGL) +#endif +#if defined(GLFW_EXPOSE_NATIVE_EGL) #include -#else - #error "No context API selected" #endif @@ -114,11 +127,10 @@ extern "C" { * 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. + * @thread_safety This function may be called from any thread. Access is not + * synchronized. * - * @par History - * Added in GLFW 3.1. + * @since Added in version 3.1. * * @ingroup native */ @@ -130,11 +142,10 @@ GLFWAPI const char* glfwGetWin32Adapter(GLFWmonitor* monitor); * `\\.\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. + * @thread_safety This function may be called from any thread. Access is not + * synchronized. * - * @par History - * Added in GLFW 3.1. + * @since Added in version 3.1. * * @ingroup native */ @@ -145,11 +156,10 @@ GLFWAPI const char* glfwGetWin32Monitor(GLFWmonitor* monitor); * @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. + * @thread_safety This function may be called from any thread. Access is not + * synchronized. * - * @par History - * Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup native */ @@ -162,11 +172,10 @@ GLFWAPI HWND glfwGetWin32Window(GLFWwindow* 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. + * @thread_safety This function may be called from any thread. Access is not + * synchronized. * - * @par History - * Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup native */ @@ -179,11 +188,10 @@ GLFWAPI HGLRC glfwGetWGLContext(GLFWwindow* window); * @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. + * @thread_safety This function may be called from any thread. Access is not + * synchronized. * - * @par History - * Added in GLFW 3.1. + * @since Added in version 3.1. * * @ingroup native */ @@ -194,11 +202,10 @@ GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* monitor); * @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. + * @thread_safety This function may be called from any thread. Access is not + * synchronized. * - * @par History - * Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup native */ @@ -211,11 +218,10 @@ GLFWAPI id glfwGetCocoaWindow(GLFWwindow* 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. + * @thread_safety This function may be called from any thread. Access is not + * synchronized. * - * @par History - * Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup native */ @@ -228,11 +234,10 @@ GLFWAPI id glfwGetNSGLContext(GLFWwindow* window); * @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. + * @thread_safety This function may be called from any thread. Access is not + * synchronized. * - * @par History - * Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup native */ @@ -243,11 +248,10 @@ GLFWAPI Display* glfwGetX11Display(void); * @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. + * @thread_safety This function may be called from any thread. Access is not + * synchronized. * - * @par History - * Added in GLFW 3.1. + * @since Added in version 3.1. * * @ingroup native */ @@ -258,11 +262,10 @@ GLFWAPI RRCrtc glfwGetX11Adapter(GLFWmonitor* 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. + * @thread_safety This function may be called from any thread. Access is not + * synchronized. * - * @par History - * Added in GLFW 3.1. + * @since Added in version 3.1. * * @ingroup native */ @@ -273,11 +276,10 @@ GLFWAPI RROutput glfwGetX11Monitor(GLFWmonitor* monitor); * @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. + * @thread_safety This function may be called from any thread. Access is not + * synchronized. * - * @par History - * Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup native */ @@ -290,15 +292,116 @@ GLFWAPI Window glfwGetX11Window(GLFWwindow* 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. + * @thread_safety This function may be called from any thread. Access is not + * synchronized. * - * @par History - * Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup native */ GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window); + +/*! @brief Returns the `GLXWindow` of the specified window. + * + * @return The `GLXWindow` of the specified window, or `None` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI GLXWindow glfwGetGLXWindow(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_WAYLAND) +/*! @brief Returns the `struct wl_display*` used by GLFW. + * + * @return The `struct wl_display*` used by GLFW, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI struct wl_display* glfwGetWaylandDisplay(void); + +/*! @brief Returns the `struct wl_output*` of the specified monitor. + * + * @return The `struct wl_output*` of the specified monitor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI struct wl_output* glfwGetWaylandMonitor(GLFWmonitor* monitor); + +/*! @brief Returns the main `struct wl_surface*` of the specified window. + * + * @return The main `struct wl_surface*` of the specified window, or `NULL` if + * an [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI struct wl_surface* glfwGetWaylandWindow(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_MIR) +/*! @brief Returns the `MirConnection*` used by GLFW. + * + * @return The `MirConnection*` used by GLFW, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI MirConnection* glfwGetMirDisplay(void); + +/*! @brief Returns the Mir output ID of the specified monitor. + * + * @return The Mir output ID of the specified monitor, or zero if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI int glfwGetMirMonitor(GLFWmonitor* monitor); + +/*! @brief Returns the `MirSurface*` of the specified window. + * + * @return The `MirSurface*` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI MirSurface* glfwGetMirWindow(GLFWwindow* window); #endif #if defined(GLFW_EXPOSE_NATIVE_EGL) @@ -307,11 +410,10 @@ GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window); * @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. + * @thread_safety This function may be called from any thread. Access is not + * synchronized. * - * @par History - * Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup native */ @@ -322,11 +424,10 @@ GLFWAPI EGLDisplay glfwGetEGLDisplay(void); * @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. + * @thread_safety This function may be called from any thread. Access is not + * synchronized. * - * @par History - * Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup native */ @@ -337,11 +438,10 @@ GLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* 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. + * @thread_safety This function may be called from any thread. Access is not + * synchronized. * - * @par History - * Added in GLFW 3.0. + * @since Added in version 3.0. * * @ingroup native */ diff --git a/src/external/glfw3/lib/win32/libglfw3.a b/src/external/glfw3/lib/win32/libglfw3.a index fc920396168dc636a940fa20d6859163b6d49936..d50ffa72404f52be965b2c20bab83bed75aec262 100644 GIT binary patch literal 148800 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 literal 83834 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 ac%Fs__b@Ps znnAF59|HpjOI~4M0AU#^1_lt8i(+5^VTC0O3?QuZhJgWuRgD-JKv;bW1B3b$hI$6g zXAEGhcZafUxNa1_lte5Mp2eVXFoP1`xJ+#lQf<_8|-m zAnZ7SfdPb_UobF$uv-uV0|7#Kh}#EXFe zgu@mvFo1Bx7X}6pjt*mB0O8mL3=AL)3K0-a@?u~B;gl5&3?Q7&!N35*nK29uAe_B| zfdPbbe=#tCaDf8@0|*z*V_+z%pU1#Z@(F^=RTvmRxUztO0fei!F))B|odg2|2sflK zFo1B=ItB(1Ze?L$0O9r|1_luB+{VBF!aW=e3?SSW!@vN-6E-j~fbgV03=AMV)q{Zn zgr`qpV5kQXGhZ+;fbbkW1_ltGm&L#U!VC5=Fo5u45e5bjUYf?h0K&`HF))De%3ll& zAiO4pfdPcqZDU{n;SC=c7(jTl3j+fPZ(YQ|0K(h9F))DeE(Zn%5Z=?p5X`Wri-BR^ z3kW`F#J~W;hr1XUK=|kj1_ls5;l{uK!lx!NFo5uxdkhR9eBOqE0faBMF))DezRzmOI6049aI&t4%H(=>-pRMv`6oxS3s1hq z9x^$D5i>0d=SeWSL>w|KY zf`Xw5_MEm^OI(Ff42N8bL>QxrfrT+)Q|?K!Fiuu*XPbP4S!nYwDGA2OX&!vIjCIgq zVVvCO$+p=+Rsv+cAz|}DS{MU1-&B-ioGk0hi_7FZRTf4@|INi}5{#4E{c$PV?!d~( z!Z>+d0Q=^h8ZwNNUk2h*x%r1C3*%&gVD`<-+ER?l=H^7Y)MvA+t{mg!+Ay33D@e0(Rr%*AQG14z9fs4uVPtgJEEp`p zsBA_=41)90o?_0)9UT0VcbTo4%omnF`F{yc^FeN6wA;Ki+=+3reK}5L55BN4GTAar z7UUG4e6x7%*4<1|*G22@CNux&n+qt2*oN<_?o@(H8qX2EtjFxD1APe{w=E z+vbWwS;ooPeYjL^21PBCF~ej*Zt2Z8i`5t>Z=ZluEvW39d~YJ#W}Px&#>syt;Zz7t z2!;%kCvuB#uCI_|oE$$Dr`iLRER0MB43pPaOKiSZCC@l{^>mzSLE*)u&oKERx5#Fz zT5(2Y6T%q~R0=WbZLX|WVVvwe2dB~Cgs8juXrmV66mLlO1+)ZoWBRg;CjyH=7>SW>g{~u0ZWNMv=|!#}yfs2p@5<5VVb3DgpO$hledG8dz=ArY|$N{@{Eo5Qc_Fe)1o zng1C1Hm|;J#yI)zGn@_q8Oy}WFxgR9WV75Y3C77*R_=!s` zD5*{E`^CH2|A!=_65&__sb^%_-2Y3JQHh8a3MkMRnK$45W6r2VI156;ZTk#HMgyFE UL{OV&`y*yX4_qohhA1%s07kStKL7v#