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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 PI=+fj6()rk@kRU}MzlOX