From 834085c90c46ea4663233f667aadae25599b8135 Mon Sep 17 00:00:00 2001 From: ocornut Date: Sat, 14 Mar 2015 10:00:11 +0000 Subject: [PATCH] Examples: Updated to GLFW 3.1 --- .../opengl3_example/opengl3_example.vcxproj | 4 +- .../opengl_example/glfw/include/GLFW/glfw3.h | 1932 +++++++++++++---- .../glfw/include/GLFW/glfw3native.h | 212 +- .../opengl_example/glfw/lib-msvc100/glfw3.lib | Bin 121560 -> 0 bytes .../opengl_example/glfw/lib-msvc110/glfw3.lib | Bin 121720 -> 0 bytes .../glfw/lib-vc2010-32/glfw3.lib | Bin 0 -> 129546 bytes .../opengl_example/opengl_example.vcxproj | 4 +- 7 files changed, 1701 insertions(+), 451 deletions(-) delete mode 100644 examples/opengl_example/glfw/lib-msvc100/glfw3.lib delete mode 100644 examples/opengl_example/glfw/lib-msvc110/glfw3.lib create mode 100644 examples/opengl_example/glfw/lib-vc2010-32/glfw3.lib diff --git a/examples/opengl3_example/opengl3_example.vcxproj b/examples/opengl3_example/opengl3_example.vcxproj index cda336d2..3dd9afdf 100644 --- a/examples/opengl3_example/opengl3_example.vcxproj +++ b/examples/opengl3_example/opengl3_example.vcxproj @@ -54,7 +54,7 @@ true - $(ProjectDir)..\opengl_example\glfw\lib-msvc100;$(ProjectDir)..\opengl_example\glew\lib\Release\Win32;%(AdditionalLibraryDirectories) + $(ProjectDir)..\opengl_example\glfw\lib-vc2010-32;%(AdditionalLibraryDirectories) opengl32.lib;glfw3.lib;%(AdditionalDependencies) Console msvcrt.lib @@ -72,7 +72,7 @@ true true true - $(ProjectDir)..\opengl_example\glfw\lib-msvc100;$(ProjectDir)..\opengl_example\glew\lib\Release\Win32;%(AdditionalLibraryDirectories) + $(ProjectDir)..\opengl_example\glfw\lib-vc2010-32;%(AdditionalLibraryDirectories) opengl32.lib;glfw3.lib;%(AdditionalDependencies) Console diff --git a/examples/opengl_example/glfw/include/GLFW/glfw3.h b/examples/opengl_example/glfw/include/GLFW/glfw3.h index 8b11c2fc..89414491 100644 --- a/examples/opengl_example/glfw/include/GLFW/glfw3.h +++ b/examples/opengl_example/glfw/include/GLFW/glfw3.h @@ -1,5 +1,5 @@ /************************************************************************* - * GLFW 3.0 - www.glfw.org + * GLFW 3.1 - www.glfw.org * A library for OpenGL, window and input *------------------------------------------------------------------------ * Copyright (c) 2002-2006 Marcus Geelnard @@ -38,23 +38,27 @@ extern "C" { * Doxygen documentation *************************************************************************/ -/*! @defgroup clipboard Clipboard support - */ /*! @defgroup context Context handling + * + * This is the reference documentation for context related functions. For more + * information, see the @ref context. */ -/*! @defgroup error Error handling - */ -/*! @defgroup init Initialization and version information +/*! @defgroup init Initialization, version and errors + * + * This is the reference documentation for initialization and termination of + * the library, version management and error handling. For more information, + * see the @ref intro. */ /*! @defgroup input Input handling + * + * This is the reference documentation for input related functions and types. + * For more information, see the @ref input. */ /*! @defgroup monitor Monitor handling * * This is the reference documentation for monitor related functions and types. * For more information, see the @ref monitor. */ -/*! @defgroup time Time input - */ /*! @defgroup window Window handling * * This is the reference documentation for window related functions and types, @@ -140,63 +144,81 @@ extern "C" { /* Include the chosen client API headers. */ #if defined(__APPLE_CC__) - #if defined(GLFW_INCLUDE_GLCOREARB) - #include - #elif !defined(GLFW_INCLUDE_NONE) - #define GL_GLEXT_LEGACY - #include + #if defined(GLFW_INCLUDE_GLCOREARB) + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include #endif - #if defined(GLFW_INCLUDE_GLU) - #include + #elif !defined(GLFW_INCLUDE_NONE) + #if !defined(GLFW_INCLUDE_GLEXT) + #define GL_GLEXT_LEGACY #endif + #include + #endif + #if defined(GLFW_INCLUDE_GLU) + #include + #endif #else - #if defined(GLFW_INCLUDE_GLCOREARB) - #include - #elif defined(GLFW_INCLUDE_ES1) - #include - #elif defined(GLFW_INCLUDE_ES2) - #include - #elif defined(GLFW_INCLUDE_ES3) - #include - #elif !defined(GLFW_INCLUDE_NONE) - #include + #if defined(GLFW_INCLUDE_GLCOREARB) + #include + #elif defined(GLFW_INCLUDE_ES1) + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include #endif - #if defined(GLFW_INCLUDE_GLU) - #include + #elif defined(GLFW_INCLUDE_ES2) + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include #endif + #elif defined(GLFW_INCLUDE_ES3) + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + #elif defined(GLFW_INCLUDE_ES31) + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + #elif !defined(GLFW_INCLUDE_NONE) + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + #endif + #if defined(GLFW_INCLUDE_GLU) + #include + #endif #endif #if defined(GLFW_DLL) && defined(_GLFW_BUILD_DLL) - /* GLFW_DLL is defined by users of GLFW when compiling programs that will link - * to the DLL version of the GLFW library. _GLFW_BUILD_DLL is defined by the - * GLFW configuration header when compiling the DLL version of the library. + /* GLFW_DLL must be defined by applications that are linking against the DLL + * version of the GLFW library. _GLFW_BUILD_DLL is defined by the GLFW + * configuration header when compiling the DLL version of the library. */ #error "You must not have both GLFW_DLL and _GLFW_BUILD_DLL defined" #endif +/* GLFWAPI is used to declare public API functions for export + * from the DLL / shared library / dynamic library. + */ #if defined(_WIN32) && defined(_GLFW_BUILD_DLL) - - /* We are building a Win32 DLL */ + /* We are building GLFW as a Win32 DLL */ #define GLFWAPI __declspec(dllexport) - #elif defined(_WIN32) && defined(GLFW_DLL) - - /* We are calling a Win32 DLL */ + /* We are calling GLFW as a Win32 DLL */ #if defined(__LCC__) #define GLFWAPI extern #else #define GLFWAPI __declspec(dllimport) #endif - #elif defined(__GNUC__) && defined(_GLFW_BUILD_DLL) - + /* We are building GLFW as a shared / dynamic library */ #define GLFWAPI __attribute__((visibility("default"))) - #else - - /* We are either building/calling a static lib or we are non-win32 */ + /* We are building or calling GLFW as a static library */ #define GLFWAPI - #endif /* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */ @@ -220,27 +242,36 @@ extern "C" { * backward-compatible. * @ingroup init */ -#define GLFW_VERSION_MINOR 0 +#define GLFW_VERSION_MINOR 1 /*! @brief The revision number of the GLFW library. * * This is incremented when a bug fix release is made that does not contain any * API changes. * @ingroup init */ -#define GLFW_VERSION_REVISION 3 +#define GLFW_VERSION_REVISION 0 /*! @} */ /*! @name Key and button actions * @{ */ -/*! @brief The key or button was released. +/*! @brief The key or mouse button was released. + * + * The key or mouse button was released. + * * @ingroup input */ #define GLFW_RELEASE 0 -/*! @brief The key or button was pressed. +/*! @brief The key or mouse button was pressed. + * + * The key or mouse button was pressed. + * * @ingroup input */ #define GLFW_PRESS 1 /*! @brief The key was held down until it repeated. + * + * The key was held down until it repeated. + * * @ingroup input */ #define GLFW_REPEAT 2 @@ -248,20 +279,22 @@ extern "C" { /*! @defgroup keys Keyboard keys * - * These key codes are inspired by the *USB HID Usage Tables v1.12* (p. 53-60), - * but re-arranged to map to 7-bit ASCII for printable keys (function keys are - * put in the 256+ range). + * See [key input](@ref input_key) for how these are used. * - * The naming of the key codes follow these rules: - * - The US keyboard layout is used - * - Names of printable alpha-numeric characters are used (e.g. "A", "R", - * "3", etc.) - * - For non-alphanumeric characters, Unicode:ish names are used (e.g. - * "COMMA", "LEFT_SQUARE_BRACKET", etc.). Note that some names do not - * correspond to the Unicode standard (usually for brevity) - * - Keys that lack a clear US mapping are named "WORLD_x" - * - For non-printable keys, custom names are used (e.g. "F4", - * "BACKSPACE", etc.) + * These key codes are inspired by the _USB HID Usage Tables v1.12_ (p. 53-60), + * but re-arranged to map to 7-bit ASCII for printable keys (function keys are + * put in the 256+ range). + * + * The naming of the key codes follow these rules: + * - The US keyboard layout is used + * - Names of printable alpha-numeric characters are used (e.g. "A", "R", + * "3", etc.) + * - For non-alphanumeric characters, Unicode:ish names are used (e.g. + * "COMMA", "LEFT_SQUARE_BRACKET", etc.). Note that some names do not + * correspond to the Unicode standard (usually for brevity) + * - Keys that lack a clear US mapping are named "WORLD_x" + * - For non-printable keys, custom names are used (e.g. "F4", + * "BACKSPACE", etc.) * * @ingroup input * @{ @@ -398,6 +431,9 @@ extern "C" { /*! @} */ /*! @defgroup mods Modifier key flags + * + * See [key input](@ref input_key) for how these are used. + * * @ingroup input * @{ */ @@ -417,6 +453,9 @@ extern "C" { /*! @} */ /*! @defgroup buttons Mouse buttons + * + * See [mouse button input](@ref input_mouse_button) for how these are used. + * * @ingroup input * @{ */ #define GLFW_MOUSE_BUTTON_1 0 @@ -434,6 +473,9 @@ extern "C" { /*! @} */ /*! @defgroup joysticks Joysticks + * + * See [joystick input](@ref joystick) for how these are used. + * * @ingroup input * @{ */ #define GLFW_JOYSTICK_1 0 @@ -456,36 +498,128 @@ extern "C" { /*! @} */ /*! @defgroup errors Error codes - * @ingroup error + * + * See [error handling](@ref error_handling) for how these are used. + * + * @ingroup init * @{ */ /*! @brief GLFW has not been initialized. + * + * This occurs if a GLFW function was called that may not be called unless the + * library is [initialized](@ref intro_init). + * + * @par Analysis + * Application programmer error. Initialize GLFW before calling any function + * that requires initialization. */ #define GLFW_NOT_INITIALIZED 0x00010001 /*! @brief No context is current for this thread. + * + * This occurs if a GLFW function was called that needs and operates on the + * current OpenGL or OpenGL ES context but no context is current on the calling + * thread. One such function is @ref glfwSwapInterval. + * + * @par Analysis + * Application programmer error. Ensure a context is current before calling + * functions that require a current context. */ #define GLFW_NO_CURRENT_CONTEXT 0x00010002 -/*! @brief One of the enum parameters for the function was given an invalid - * enum. +/*! @brief One of the arguments to the function was an invalid enum value. + * + * One of the arguments to the function was an invalid enum value, for example + * requesting [GLFW_RED_BITS](@ref window_hints_fb) with @ref + * glfwGetWindowAttrib. + * + * @par Analysis + * Application programmer error. Fix the offending call. */ #define GLFW_INVALID_ENUM 0x00010003 -/*! @brief One of the parameters for the function was given an invalid value. +/*! @brief One of the arguments to the function was an invalid value. + * + * One of the arguments to the function was an invalid value, for example + * requesting a non-existent OpenGL or OpenGL ES version like 2.7. + * + * Requesting a valid but unavailable OpenGL or OpenGL ES version will instead + * result in a @ref GLFW_VERSION_UNAVAILABLE error. + * + * @par Analysis + * Application programmer error. Fix the offending call. */ #define GLFW_INVALID_VALUE 0x00010004 /*! @brief A memory allocation failed. + * + * A memory allocation failed. + * + * @par Analysis + * A bug in GLFW or the underlying operating system. Report the bug to our + * [issue tracker](https://github.com/glfw/glfw/issues). */ #define GLFW_OUT_OF_MEMORY 0x00010005 /*! @brief GLFW could not find support for the requested client API on the * system. + * + * GLFW could not find support for the requested client API on the system. + * + * @par Analysis + * The installed graphics driver does not support the requested client API, or + * does not support it via the chosen context creation backend. Below are + * a few examples. + * + * @par + * Some pre-installed Windows graphics drivers do not support OpenGL. AMD only + * supports OpenGL ES via EGL, while Nvidia and Intel only supports it via + * a WGL or GLX extension. OS X does not provide OpenGL ES at all. The Mesa + * EGL, OpenGL and OpenGL ES libraries do not interface with the Nvidia binary + * driver. */ #define GLFW_API_UNAVAILABLE 0x00010006 -/*! @brief The requested client API version is not available. +/*! @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. + * + * @par Analysis + * The machine does not support your requirements. If your application is + * sufficiently flexible, downgrade your requirements and try again. + * Otherwise, inform the user that their machine does not match your + * requirements. + * + * @par + * Future invalid OpenGL and OpenGL ES versions, for example OpenGL 4.8 if 5.0 + * comes out before the 4.x series gets that far, also fail with this error and + * not @ref GLFW_INVALID_VALUE, because GLFW cannot know what future versions + * will exist. */ #define GLFW_VERSION_UNAVAILABLE 0x00010007 /*! @brief A platform-specific error occurred that does not match any of the * more specific categories. + * + * A platform-specific error occurred that does not match any of the more + * specific categories. + * + * @par Analysis + * A bug in GLFW or the underlying operating system. Report the bug to our + * [issue tracker](https://github.com/glfw/glfw/issues). */ #define GLFW_PLATFORM_ERROR 0x00010008 -/*! @brief The clipboard did not contain data in the requested format. +/*! @brief The requested format is not supported or available. + * + * If emitted during window creation, the requested pixel format is not + * supported. + * + * If emitted when querying the clipboard, the contents of the clipboard could + * not be converted to the requested format. + * + * @par Analysis + * If emitted during window creation, one or more + * [hard constraints](@ref window_hints_hard) did not match any of the + * available pixel formats. If your application is sufficiently flexible, + * downgrade your requirements and try again. Otherwise, inform the user that + * their machine does not match your requirements. + * + * @par + * If emitted when querying the clipboard, ignore the error or report it to + * the user, as appropriate. */ #define GLFW_FORMAT_UNAVAILABLE 0x00010009 /*! @} */ @@ -495,6 +629,8 @@ extern "C" { #define GLFW_RESIZABLE 0x00020003 #define GLFW_VISIBLE 0x00020004 #define GLFW_DECORATED 0x00020005 +#define GLFW_AUTO_ICONIFY 0x00020006 +#define GLFW_FLOATING 0x00020007 #define GLFW_RED_BITS 0x00021001 #define GLFW_GREEN_BITS 0x00021002 @@ -511,6 +647,7 @@ extern "C" { #define GLFW_SAMPLES 0x0002100D #define GLFW_SRGB_CAPABLE 0x0002100E #define GLFW_REFRESH_RATE 0x0002100F +#define GLFW_DOUBLEBUFFER 0x00021010 #define GLFW_CLIENT_API 0x00022001 #define GLFW_CONTEXT_VERSION_MAJOR 0x00022002 @@ -520,6 +657,7 @@ extern "C" { #define GLFW_OPENGL_FORWARD_COMPAT 0x00022006 #define GLFW_OPENGL_DEBUG_CONTEXT 0x00022007 #define GLFW_OPENGL_PROFILE 0x00022008 +#define GLFW_CONTEXT_RELEASE_BEHAVIOR 0x00022009 #define GLFW_OPENGL_API 0x00030001 #define GLFW_OPENGL_ES_API 0x00030002 @@ -540,9 +678,54 @@ extern "C" { #define GLFW_CURSOR_HIDDEN 0x00034002 #define GLFW_CURSOR_DISABLED 0x00034003 +#define GLFW_ANY_RELEASE_BEHAVIOR 0 +#define GLFW_RELEASE_BEHAVIOR_FLUSH 0x00035001 +#define GLFW_RELEASE_BEHAVIOR_NONE 0x00035002 + +/*! @defgroup shapes Standard cursor shapes + * + * See [standard cursor creation](@ref cursor_standard) for how these are used. + * + * @ingroup input + * @{ */ + +/*! @brief The regular arrow cursor shape. + * + * The regular arrow cursor. + */ +#define GLFW_ARROW_CURSOR 0x00036001 +/*! @brief The text input I-beam cursor shape. + * + * The text input I-beam cursor shape. + */ +#define GLFW_IBEAM_CURSOR 0x00036002 +/*! @brief The crosshair shape. + * + * The crosshair shape. + */ +#define GLFW_CROSSHAIR_CURSOR 0x00036003 +/*! @brief The hand shape. + * + * The hand shape. + */ +#define GLFW_HAND_CURSOR 0x00036004 +/*! @brief The horizontal resize arrow shape. + * + * The horizontal resize arrow shape. + */ +#define GLFW_HRESIZE_CURSOR 0x00036005 +/*! @brief The vertical resize arrow shape. + * + * The vertical resize arrow shape. + */ +#define GLFW_VRESIZE_CURSOR 0x00036006 +/*! @} */ + #define GLFW_CONNECTED 0x00040001 #define GLFW_DISCONNECTED 0x00040002 +#define GLFW_DONT_CARE -1 + /************************************************************************* * GLFW API types @@ -573,6 +756,14 @@ typedef struct GLFWmonitor GLFWmonitor; */ typedef struct GLFWwindow GLFWwindow; +/*! @brief Opaque cursor object. + * + * Opaque cursor object. + * + * @ingroup cursor + */ +typedef struct GLFWcursor GLFWcursor; + /*! @brief The function signature for error callbacks. * * This is the function signature for error callback functions. @@ -582,7 +773,7 @@ typedef struct GLFWwindow GLFWwindow; * * @sa glfwSetErrorCallback * - * @ingroup error + * @ingroup init */ typedef void (* GLFWerrorfun)(int,const char*); @@ -590,7 +781,7 @@ typedef void (* GLFWerrorfun)(int,const char*); * * This is the function signature for window position callback functions. * - * @param[in] window The window that the user moved. + * @param[in] window The window that was moved. * @param[in] xpos The new x-coordinate, in screen coordinates, of the * upper-left corner of the client area of the window. * @param[in] ypos The new y-coordinate, in screen coordinates, of the @@ -606,7 +797,7 @@ typedef void (* GLFWwindowposfun)(GLFWwindow*,int,int); * * This is the function signature for window size callback functions. * - * @param[in] window The window that the user resized. + * @param[in] window The window that was resized. * @param[in] width The new width, in screen coordinates, of the window. * @param[in] height The new height, in screen coordinates, of the window. * @@ -644,9 +835,9 @@ typedef void (* GLFWwindowrefreshfun)(GLFWwindow*); * * This is the function signature for window focus callback functions. * - * @param[in] window The window that was focused or defocused. - * @param[in] focused `GL_TRUE` if the window was focused, or `GL_FALSE` if - * it was defocused. + * @param[in] window The window that gained or lost input focus. + * @param[in] focused `GL_TRUE` if the window was given input focus, or + * `GL_FALSE` if it lost it. * * @sa glfwSetWindowFocusCallback * @@ -706,8 +897,8 @@ 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 of the cursor. - * @param[in] ypos The new y-coordinate of the cursor. + * @param[in] xpos The new x-coordinate, in screen coordinates, of the cursor. + * @param[in] ypos The new y-coordinate, in screen coordinates, of the cursor. * * @sa glfwSetCursorPosCallback * @@ -750,7 +941,7 @@ typedef void (* GLFWscrollfun)(GLFWwindow*,double,double); * @param[in] window The window that received the event. * @param[in] key The [keyboard key](@ref keys) that was pressed or released. * @param[in] scancode The system-specific scancode of the key. - * @param[in] action @ref GLFW_PRESS, @ref GLFW_RELEASE or @ref GLFW_REPEAT. + * @param[in] action `GLFW_PRESS`, `GLFW_RELEASE` or `GLFW_REPEAT`. * @param[in] mods Bit field describing which [modifier keys](@ref mods) were * held down. * @@ -765,7 +956,7 @@ typedef void (* GLFWkeyfun)(GLFWwindow*,int,int,int,int); * This is the function signature for Unicode character callback functions. * * @param[in] window The window that received the event. - * @param[in] character The Unicode code point of the character. + * @param[in] codepoint The Unicode code point of the character. * * @sa glfwSetCharCallback * @@ -773,6 +964,38 @@ typedef void (* GLFWkeyfun)(GLFWwindow*,int,int,int,int); */ typedef void (* GLFWcharfun)(GLFWwindow*,unsigned int); +/*! @brief The function signature for Unicode character with modifiers + * callbacks. + * + * This is the function signature for Unicode character with modifiers callback + * functions. It is called for each input character, regardless of what + * modifier keys are held down. + * + * @param[in] window The window that received the event. + * @param[in] codepoint The Unicode code point of the character. + * @param[in] mods Bit field describing which [modifier keys](@ref mods) were + * held down. + * + * @sa glfwSetCharModsCallback + * + * @ingroup input + */ +typedef void (* GLFWcharmodsfun)(GLFWwindow*,unsigned int,int); + +/*! @brief The function signature for file drop callbacks. + * + * This is the function signature for file drop callbacks. + * + * @param[in] window The window that received the event. + * @param[in] count The number of dropped files. + * @param[in] names The UTF-8 encoded path names of the dropped files. + * + * @sa glfwSetDropCallback + * + * @ingroup input + */ +typedef void (* GLFWdropfun)(GLFWwindow*,int,const char**); + /*! @brief The function signature for monitor configuration callbacks. * * This is the function signature for monitor configuration callback functions. @@ -838,6 +1061,21 @@ typedef struct GLFWgammaramp unsigned int size; } GLFWgammaramp; +/*! @brief Image data. + */ +typedef struct GLFWimage +{ + /*! The width, in pixels, of this image. + */ + int width; + /*! The height, in pixels, of this image. + */ + int height; + /*! The pixel data of this image, arranged left-to-right, top-to-bottom. + */ + unsigned char* pixels; +} GLFWimage; + /************************************************************************* * GLFW API functions @@ -846,56 +1084,70 @@ typedef struct GLFWgammaramp /*! @brief Initializes the GLFW library. * * This function initializes the GLFW library. Before most GLFW functions can - * be used, GLFW must be initialized, and before a program terminates GLFW + * be used, GLFW must be initialized, and before an application terminates GLFW * should be terminated in order to free any resources allocated during or * after initialization. * * If this function fails, it calls @ref glfwTerminate before returning. If it - * succeeds, you should call @ref glfwTerminate before the program exits. + * succeeds, you should call @ref glfwTerminate before the application exits. * * Additional calls to this function after successful initialization but before - * termination will succeed but will do nothing. + * termination will return `GL_TRUE` immediately. * - * @return `GL_TRUE` if successful, or `GL_FALSE` if an error occurred. + * @return `GL_TRUE` if successful, or `GL_FALSE` if an + * [error](@ref error_handling) occurred. * - * @par New in GLFW 3 - * This function no longer registers @ref glfwTerminate with `atexit`. - * - * @note This function may only be called from the main thread. - * - * @note This function may take several seconds to complete on some systems, - * while on other systems it may take only a fraction of a second to complete. - * - * @note **Mac OS X:** This function will change the current directory of the + * @remarks __OS X:__ This function will change the current directory of the * application to the `Contents/Resources` subdirectory of the application's - * bundle, if present. + * bundle, if present. This can be disabled with a + * [compile-time option](@ref compile_options_osx). * + * @remarks __X11:__ If the `LC_CTYPE` category of the current locale is set to + * `"C"` then the environment's locale will be applied to that category. This + * is done because character input will not function when `LC_CTYPE` is set to + * `"C"`. If another locale was set before this function was called, it will + * be left untouched. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref intro_init * @sa glfwTerminate * + * @since Added in GLFW 1.0. + * * @ingroup init */ GLFWAPI int glfwInit(void); /*! @brief Terminates the GLFW library. * - * This function destroys all remaining windows, frees any allocated resources - * and sets the library to an uninitialized state. Once this is called, you - * must again call @ref glfwInit successfully before you will be able to use - * most GLFW functions. + * This function destroys all remaining windows and cursors, restores any + * modified gamma ramps and frees any other allocated resources. Once this + * function is called, you must again call @ref glfwInit successfully before + * you will be able to use most GLFW functions. * * If GLFW has been successfully initialized, this function should be called - * before the program exits. If initialization fails, there is no need to call - * this function, as it is called by @ref glfwInit before it returns failure. + * before the application exits. If initialization fails, there is no need to + * call this function, as it is called by @ref glfwInit before it returns + * failure. * * @remarks This function may be called before @ref glfwInit. * - * @note This function may only be called from the main thread. - * * @warning No window's context may be current on another thread when this * function is called. * + * @par Reentrancy + * This function may not be called from a callback. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref intro_init * @sa glfwInit * + * @since Added in GLFW 1.0. + * * @ingroup init */ GLFWAPI void glfwTerminate(void); @@ -906,46 +1158,55 @@ 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. + * * @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. * - * @remarks This function may be called from any thread. + * @par Thread Safety + * This function may be called from any thread. * + * @sa @ref intro_version * @sa glfwGetVersionString * + * @since Added in GLFW 1.0. + * * @ingroup init */ GLFWAPI void glfwGetVersion(int* major, int* minor, int* rev); /*! @brief Returns a string describing the compile-time configuration. * - * This function returns a static string generated at compile-time according to - * which configuration macros were defined. This is intended for use when - * submitting bug reports, to allow developers to see which code paths are - * enabled in a binary. + * 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. * - * The format of the string is as follows: - * - The version of GLFW - * - The name of the window system API - * - The name of the context creation API - * - Any additional options or APIs + * __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. * - * For example, when compiling GLFW 3.0 with MinGW using the Win32 and WGL - * back ends, the version string may look something like this: - * - * 3.0.0 Win32 WGL MinGW + * This function always succeeds. * * @return The GLFW version string. * * @remarks This function may be called before @ref glfwInit. * - * @remarks This function may be called from any thread. + * @par Pointer Lifetime + * The returned string is static and compile-time generated. * + * @par Thread Safety + * This function may be called from any thread. + * + * @sa @ref intro_version * @sa glfwGetVersion * + * @since Added in GLFW 3.0. + * * @ingroup init */ GLFWAPI const char* glfwGetVersionString(void); @@ -955,23 +1216,31 @@ GLFWAPI const char* glfwGetVersionString(void); * This function sets the error callback, which is called with an error code * and a human-readable description each time a GLFW error occurs. * + * The error callback is called on the thread where the error occurred. If you + * are using GLFW from multiple threads, your error callback needs to be + * written accordingly. + * + * Because the description string may have been generated specifically for that + * error, it is not guaranteed to be valid after the callback has returned. If + * you wish to use it after the callback returns, you need to make a copy. + * + * Once set, the error callback remains set even after the library has been + * terminated. + * * @param[in] cbfun The new callback, or `NULL` to remove the currently set * callback. - * @return The previously set callback, or `NULL` if no callback was set or an - * error occurred. + * @return The previously set callback, or `NULL` if no callback was set. * * @remarks This function may be called before @ref glfwInit. * - * @note The error callback is called by the thread where the error was - * generated. If you are using GLFW from multiple threads, your error callback - * needs to be written accordingly. + * @par Thread Safety + * This function may only be called from the main thread. * - * @note Because the description string provided to the callback may have been - * generated specifically for that error, it is not guaranteed to be valid - * after the callback has returned. If you wish to use it after that, you need - * to make your own copy of it before returning. + * @sa @ref error_handling * - * @ingroup error + * @since Added in GLFW 3.0. + * + * @ingroup init */ GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun cbfun); @@ -980,19 +1249,25 @@ GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun cbfun); * This function returns an array of handles for all currently connected * monitors. * - * @param[out] count Where to store the size of the returned array. This is - * set to zero if an error occurred. - * @return An array of monitor handles, or `NULL` if an error occurred. + * @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. * - * @note The returned array is allocated and freed by GLFW. You should not - * free it yourself. + * @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. * - * @note The returned array is valid only until the monitor configuration - * changes. See @ref glfwSetMonitorCallback to receive notifications of - * configuration changes. + * @par Thread Safety + * This function may only be called from the main thread. * + * @sa @ref monitor_monitors + * @sa @ref monitor_event * @sa glfwGetPrimaryMonitor * + * @since Added in GLFW 3.0. + * * @ingroup monitor */ GLFWAPI GLFWmonitor** glfwGetMonitors(int* count); @@ -1002,10 +1277,17 @@ GLFWAPI GLFWmonitor** glfwGetMonitors(int* count); * This function returns the primary monitor. This is usually the monitor * where elements like the Windows task bar or the OS X menu bar is located. * - * @return The primary monitor, or `NULL` if an error occurred. + * @return The primary monitor, or `NULL` if an [error](@ref error_handling) + * occurred. * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref monitor_monitors * @sa glfwGetMonitors * + * @since Added in GLFW 3.0. + * * @ingroup monitor */ GLFWAPI GLFWmonitor* glfwGetPrimaryMonitor(void); @@ -1015,10 +1297,20 @@ GLFWAPI GLFWmonitor* glfwGetPrimaryMonitor(void); * This function returns the position, in screen coordinates, of the upper-left * corner of the specified monitor. * + * Any or all of the position arguments may be `NULL`. If an error occurs, all + * non-`NULL` position arguments will be set to zero. + * * @param[in] monitor The monitor to query. * @param[out] xpos Where to store the monitor x-coordinate, or `NULL`. * @param[out] ypos Where to store the monitor y-coordinate, or `NULL`. * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref monitor_properties + * + * @since Added in GLFW 3.0. + * * @ingroup monitor */ GLFWAPI void glfwGetMonitorPos(GLFWmonitor* monitor, int* xpos, int* ypos); @@ -1028,31 +1320,55 @@ GLFWAPI void glfwGetMonitorPos(GLFWmonitor* monitor, int* xpos, int* ypos); * This function returns the size, in millimetres, of the display area of the * specified monitor. * - * @param[in] monitor The monitor to query. - * @param[out] width Where to store the width, in mm, of the monitor's display - * area, or `NULL`. - * @param[out] height Where to store the height, in mm, of the monitor's - * display area, or `NULL`. + * Some systems do not provide accurate monitor size information, either + * because the monitor + * [EDID](https://en.wikipedia.org/wiki/Extended_display_identification_data) + * data is incorrect or because the driver does not report it accurately. * - * @note Some operating systems do not provide accurate information, either - * because the monitor's EDID data is incorrect, or because the driver does not - * report it accurately. + * Any or all of the size arguments may be `NULL`. If an error occurs, all + * non-`NULL` size arguments will be set to zero. + * + * @param[in] monitor The monitor to query. + * @param[out] widthMM Where to store the width, in millimetres, of the + * monitor's display area, or `NULL`. + * @param[out] heightMM Where to store the height, in millimetres, of the + * monitor's display area, or `NULL`. + * + * @remarks __Windows:__ The OS calculates the returned physical size from the + * current resolution and system DPI instead of querying the monitor EDID data. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref monitor_properties + * + * @since Added in GLFW 3.0. * * @ingroup monitor */ -GLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* monitor, int* width, int* height); +GLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* monitor, int* widthMM, int* heightMM); /*! @brief Returns the name of the specified monitor. * * This function returns a human-readable name, encoded as UTF-8, of the - * specified monitor. + * specified monitor. The name typically reflects the make and model of the + * monitor and is not guaranteed to be unique among the connected monitors. * * @param[in] monitor The monitor to query. - * @return The UTF-8 encoded name of the monitor, or `NULL` if an error - * occurred. + * @return The UTF-8 encoded name of the monitor, or `NULL` if an + * [error](@ref error_handling) occurred. * - * @note The returned string is allocated and freed by GLFW. You should not - * free it yourself. + * @par Pointer Lifetime + * The returned string is allocated and freed by GLFW. You should not free it + * yourself. It is valid until the specified monitor is disconnected or the + * library is terminated. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref monitor_properties + * + * @since Added in GLFW 3.0. * * @ingroup monitor */ @@ -1066,12 +1382,19 @@ GLFWAPI const char* glfwGetMonitorName(GLFWmonitor* monitor); * * @param[in] cbfun The new callback, or `NULL` to remove the currently set * callback. - * @return The previously set callback, or `NULL` if no callback was set or an - * error occurred. + * @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 + * @bug __X11:__ This callback is not yet called on monitor configuration * changes. * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref monitor_event + * + * @since Added in GLFW 3.0. + * * @ingroup monitor */ GLFWAPI GLFWmonitorfun glfwSetMonitorCallback(GLFWmonitorfun cbfun); @@ -1086,16 +1409,25 @@ GLFWAPI GLFWmonitorfun glfwSetMonitorCallback(GLFWmonitorfun cbfun); * @param[in] monitor The monitor to query. * @param[out] count Where to store the number of video modes in the returned * array. This is set to zero if an error occurred. - * @return An array of video modes, or `NULL` if an error occurred. + * @return An array of video modes, or `NULL` if an + * [error](@ref error_handling) occurred. * - * @note The returned array is allocated and freed by GLFW. You should not - * free it yourself. + * @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. * - * @note The returned array is valid only until this function is called again - * for the specified monitor. + * @par Thread Safety + * This function may only be called from the main thread. * + * @sa @ref monitor_modes * @sa glfwGetVideoMode * + * @since Added in GLFW 1.0. + * + * @par + * __GLFW 3:__ Changed to return an array of modes for a specific monitor. + * * @ingroup monitor */ GLFWAPI const GLFWvidmode* glfwGetVideoModes(GLFWmonitor* monitor, int* count); @@ -1103,17 +1435,26 @@ GLFWAPI const GLFWvidmode* glfwGetVideoModes(GLFWmonitor* monitor, int* count); /*! @brief Returns the current mode of the specified monitor. * * This function returns the current video mode of the specified monitor. If - * you are using a full screen window, the return value will therefore depend - * on whether it is focused. + * you have created a full screen window for that monitor, the return value + * will depend on whether that window is iconified. * * @param[in] monitor The monitor to query. - * @return The current mode of the monitor, or `NULL` if an error occurred. + * @return The current mode of the monitor, or `NULL` if an + * [error](@ref error_handling) occurred. * - * @note The returned struct is allocated and freed by GLFW. You should not - * free it yourself. + * @par Pointer Lifetime + * The returned array is allocated and freed by GLFW. You should not free it + * yourself. It is valid until the specified monitor is disconnected or the + * library is terminated. * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref monitor_modes * @sa glfwGetVideoModes * + * @since Added in GLFW 3.0. Replaces `glfwGetDesktopMode`. + * * @ingroup monitor */ GLFWAPI const GLFWvidmode* glfwGetVideoMode(GLFWmonitor* monitor); @@ -1126,19 +1467,37 @@ GLFWAPI const GLFWvidmode* glfwGetVideoMode(GLFWmonitor* monitor); * @param[in] monitor The monitor whose gamma ramp to set. * @param[in] gamma The desired exponent. * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref monitor_gamma + * + * @since Added in GLFW 3.0. + * * @ingroup monitor */ GLFWAPI void glfwSetGamma(GLFWmonitor* monitor, float gamma); -/*! @brief Retrieves the current gamma ramp for the specified monitor. +/*! @brief Returns the current gamma ramp for the specified monitor. * - * This function retrieves the current gamma ramp of the specified monitor. + * This function returns the current gamma ramp of the specified monitor. * * @param[in] monitor The monitor to query. - * @return The current gamma ramp, or `NULL` if an error occurred. + * @return The current gamma ramp, or `NULL` if an + * [error](@ref error_handling) occurred. * - * @note The value arrays of the returned ramp are allocated and freed by GLFW. - * You should not free them yourself. + * @par Pointer Lifetime + * The returned structure and its arrays are allocated and freed by GLFW. You + * should not free them yourself. They are valid until the specified monitor + * is disconnected, this function is called again for that monitor or the + * library is terminated. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref monitor_gamma + * + * @since Added in GLFW 3.0. * * @ingroup monitor */ @@ -1146,13 +1505,25 @@ GLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* monitor); /*! @brief Sets the current gamma ramp for the specified monitor. * - * This function sets the current gamma ramp for the specified monitor. + * This function sets the current gamma ramp for the specified monitor. The + * original gamma ramp for that monitor is saved by GLFW the first time this + * function is called and is restored by @ref glfwTerminate. * * @param[in] monitor The monitor whose gamma ramp to set. * @param[in] ramp The gamma ramp to use. * * @note Gamma ramp sizes other than 256 are not supported by all hardware. * + * @par Pointer Lifetime + * The specified gamma ramp is copied before this function returns. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref monitor_gamma + * + * @since Added in GLFW 3.0. + * * @ingroup monitor */ GLFWAPI void glfwSetGammaRamp(GLFWmonitor* monitor, const GLFWgammaramp* ramp); @@ -1162,10 +1533,14 @@ GLFWAPI void glfwSetGammaRamp(GLFWmonitor* monitor, const GLFWgammaramp* ramp); * This function resets all window hints to their * [default values](@ref window_hints_values). * - * @note This function may only be called from the main thread. + * @par Thread Safety + * This function may only be called from the main thread. * + * @sa @ref window_hints * @sa glfwWindowHint * + * @since Added in GLFW 3.0. + * * @ingroup window */ GLFWAPI void glfwDefaultWindowHints(void); @@ -1175,52 +1550,70 @@ GLFWAPI void glfwDefaultWindowHints(void); * This function sets hints for the next call to @ref glfwCreateWindow. The * hints, once set, retain their values until changed by a call to @ref * glfwWindowHint or @ref glfwDefaultWindowHints, or until the library is - * terminated with @ref glfwTerminate. + * terminated. * * @param[in] target The [window hint](@ref window_hints) to set. * @param[in] hint The new value of the window hint. * - * @par New in GLFW 3 - * Hints are no longer reset to their default values on window creation. To - * set default hint values, use @ref glfwDefaultWindowHints. - * - * @note This function may only be called from the main thread. + * @par Thread Safety + * This function may only be called from the main thread. * + * @sa @ref window_hints * @sa glfwDefaultWindowHints * + * @since Added in GLFW 3.0. Replaces `glfwOpenWindowHint`. + * * @ingroup window */ GLFWAPI void glfwWindowHint(int target, int hint); /*! @brief Creates a window and its associated context. * - * This function creates a window and its associated context. Most of the - * options controlling how the window and its context should be created are - * specified through @ref glfwWindowHint. + * This function creates a window and its associated OpenGL or OpenGL ES + * context. Most of the options controlling how the window and its context + * should be created are specified with [window hints](@ref window_hints). * * Successful creation does not change which context is current. Before you - * can use the newly created context, you need to make it current using @ref - * glfwMakeContextCurrent. + * can use the newly created context, you need to + * [make it current](@ref context_current). For information about the `share` + * parameter, see @ref context_sharing. * - * Note that the created window and context may differ from what you requested, - * as not all parameters and hints are + * The created window, framebuffer and context may differ from what you + * requested, as not all parameters and hints are * [hard constraints](@ref window_hints_hard). This includes the size of the - * window, especially for full screen windows. To retrieve the actual - * attributes of the created window and context, use queries like @ref + * window, especially for full screen windows. To query the actual attributes + * of the created window, framebuffer and context, use queries like @ref * glfwGetWindowAttrib and @ref glfwGetWindowSize. * - * To create a full screen window, you need to specify the monitor to use. 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 retrieve monitors, see - * @ref monitor_monitors. + * 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. * - * To create the window at a specific position, make it initially invisible - * using the `GLFW_VISIBLE` window hint, set its position and then show it. + * 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. * - * If a full screen window is active, the screensaver is prohibited from + * By default, newly created windows use the placement recommended by the + * window system. To create the window at a specific position, make it + * initially invisible using the [GLFW_VISIBLE](@ref window_hints_wnd) window + * hint, set its [position](@ref window_pos) and then [show](@ref window_hide) + * it. + * + * If a full screen window has input focus, the screensaver is prohibited from * starting. * + * Window systems put limits on window sizes. Very large or very small window + * dimensions may be overridden by the window system on creation. Check the + * actual [size](@ref window_size) after creation. + * + * The [swap interval](@ref buffer_swap) is not set during window creation and + * the initial value may vary depending on driver settings and defaults. + * * @param[in] width The desired width, in screen coordinates, of the window. * This must be greater than zero. * @param[in] height The desired height, in screen coordinates, of the window. @@ -1230,23 +1623,47 @@ GLFWAPI void glfwWindowHint(int target, int hint); * 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 occurred. + * @return The handle of the created window, or `NULL` if an + * [error](@ref error_handling) occurred. * - * @remarks **Windows:** If the executable has an icon resource named + * @remarks __Windows:__ Window creation will fail if the Microsoft GDI + * software OpenGL implementation is the only one available. + * + * @remarks __Windows:__ If the executable has an icon resource named * `GLFW_ICON,` it will be set as the icon for the window. If no such icon is * present, the `IDI_WINLOGO` icon will be used instead. * - * @remarks **Mac OS X:** The GLFW window has no icon, as it is not a document + * @remarks __Windows:__ The context to share resources with may not be current + * on any other thread. + * + * @remarks __OS X:__ The GLFW window has no icon, as it is not a document * window, but the dock icon will be the same as the application bundle's icon. - * Also, the first time a window is opened the menu bar is populated with - * common commands like Hide, Quit and About. The (minimal) about dialog uses - * information from the application's bundle. For more information on bundles, - * see the Bundle Programming Guide provided by Apple. + * 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. * - * @note This function may only be called from the main thread. + * @remarks __OS X:__ The first time a window is created the menu bar is + * populated with common commands like Hide, Quit and About. The About entry + * opens a minimal about dialog with information from the application's bundle. + * The menu bar can be disabled with a + * [compile-time option](@ref compile_options_osx). * + * @remarks __X11:__ There is no mechanism for setting the window icon yet. + * + * @remarks __X11:__ Some window managers will not respect the placement of + * initially hidden windows. + * + * @par Reentrancy + * This function may not be called from a callback. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_creation * @sa glfwDestroyWindow * + * @since Added in GLFW 3.0. Replaces `glfwOpenWindow`. + * * @ingroup window */ GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share); @@ -1256,19 +1673,25 @@ GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height, const char* title, G * This function destroys the specified window and its context. On calling * this function, no further callbacks will be called for that window. * - * @param[in] window The window to destroy. - * - * @note This function may only be called from the main thread. - * - * @note This function may not be called from a callback. - * - * @note If the window's context is current on the main thread, it is + * If the context of the specified window is current on the main thread, it is * detached before being destroyed. * - * @warning The window's context must not be current on any other thread. + * @param[in] window The window to destroy. * + * @note The context of the specified window must not be current on any other + * thread when this function is called. + * + * @par Reentrancy + * This function may not be called from a callback. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_creation * @sa glfwCreateWindow * + * @since Added in GLFW 3.0. Replaces `glfwCloseWindow`. + * * @ingroup window */ GLFWAPI void glfwDestroyWindow(GLFWwindow* window); @@ -1280,7 +1703,12 @@ GLFWAPI void glfwDestroyWindow(GLFWwindow* window); * @param[in] window The window to query. * @return The value of the close flag. * - * @remarks This function may be called from secondary threads. + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @sa @ref window_close + * + * @since Added in GLFW 3.0. * * @ingroup window */ @@ -1295,7 +1723,12 @@ GLFWAPI int glfwWindowShouldClose(GLFWwindow* window); * @param[in] window The window whose flag to change. * @param[in] value The new value. * - * @remarks This function may be called from secondary threads. + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @sa @ref window_close + * + * @since Added in GLFW 3.0. * * @ingroup window */ @@ -1309,7 +1742,15 @@ 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. * - * @note This function may only be called from the main thread. + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_title + * + * @since Added in GLFW 1.0. + * + * @par + * __GLFW 3:__ Added window handle parameter. * * @ingroup window */ @@ -1320,14 +1761,23 @@ GLFWAPI void glfwSetWindowTitle(GLFWwindow* window, const char* title); * This function retrieves the position, in screen coordinates, of the * upper-left corner of the client area of the specified window. * + * Any or all of the position arguments may be `NULL`. If an error occurs, all + * non-`NULL` position arguments will be set to zero. + * * @param[in] window The window to query. * @param[out] xpos Where to store the x-coordinate of the upper-left corner of * the client area, or `NULL`. * @param[out] ypos Where to store the y-coordinate of the upper-left corner of * the client area, or `NULL`. * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_pos * @sa glfwSetWindowPos * + * @since Added in GLFW 3.0. + * * @ingroup window */ GLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos); @@ -1335,31 +1785,30 @@ GLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos); /*! @brief Sets the position of the client area of the specified window. * * This function sets the position, in screen coordinates, of the upper-left - * corner of the client area of the window. + * corner of the client area of the specified windowed mode window. If the + * window is a full screen window, this function does nothing. * - * If the specified window is a full screen window, this function does nothing. + * __Do not use this function__ to move an already visible window unless you + * have very good reasons for doing so, as it will confuse and annoy the user. * - * If you wish to set an initial window position you should create a hidden - * window (using @ref glfwWindowHint and `GLFW_VISIBLE`), set its position and - * then show it. + * The window manager may put limits on what positions are allowed. GLFW + * cannot and should not override these limits. * * @param[in] window The window to query. * @param[in] xpos The x-coordinate of the upper-left corner of the client area. * @param[in] ypos The y-coordinate of the upper-left corner of the client area. * - * @note It is very rarely a good idea to move an already visible window, as it - * will confuse and annoy the user. - * - * @note This function may only be called from the main thread. - * - * @note The window manager may put limits on what positions are allowed. - * - * @bug **X11:** Some window managers ignore the set position of hidden (i.e. - * unmapped) windows, instead placing them where it thinks is appropriate once - * they are shown. + * @par Thread Safety + * This function may only be called from the main thread. * + * @sa @ref window_pos * @sa glfwGetWindowPos * + * @since Added in GLFW 1.0. + * + * @par + * __GLFW 3:__ Added window handle parameter. + * * @ingroup window */ GLFWAPI void glfwSetWindowPos(GLFWwindow* window, int xpos, int ypos); @@ -1367,7 +1816,11 @@ GLFWAPI void glfwSetWindowPos(GLFWwindow* window, int xpos, int ypos); /*! @brief Retrieves the size of the client area of the specified window. * * This function retrieves the size, in screen coordinates, of the client area - * of the specified window. + * of the specified window. If you wish to retrieve the size of the + * framebuffer of the window in pixels, see @ref glfwGetFramebufferSize. + * + * Any or all of the size arguments may be `NULL`. If an error occurs, all + * non-`NULL` size arguments will be set to zero. * * @param[in] window The window whose size to retrieve. * @param[out] width Where to store the width, in screen coordinates, of the @@ -1375,8 +1828,17 @@ 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. + * + * @sa @ref window_size * @sa glfwSetWindowSize * + * @since Added in GLFW 1.0. + * + * @par + * __GLFW 3:__ Added window handle parameter. + * * @ingroup window */ GLFWAPI void glfwGetWindowSize(GLFWwindow* window, int* width, int* height); @@ -1391,16 +1853,24 @@ GLFWAPI void glfwGetWindowSize(GLFWwindow* window, int* width, int* height); * the context is unaffected, the bit depths of the framebuffer remain * unchanged. * + * The window manager may put limits on what sizes are allowed. GLFW cannot + * and should not override these limits. + * * @param[in] window The window to resize. * @param[in] width The desired width of the specified window. * @param[in] height The desired height of the specified window. * - * @note This function may only be called from the main thread. - * - * @note The window manager may put limits on what window sizes are allowed. + * @par Thread Safety + * This function may only be called from the main thread. * + * @sa @ref window_size * @sa glfwGetWindowSize * + * @since Added in GLFW 1.0. + * + * @par + * __GLFW 3:__ Added window handle parameter. + * * @ingroup window */ GLFWAPI void glfwSetWindowSize(GLFWwindow* window, int width, int height); @@ -1408,7 +1878,11 @@ GLFWAPI void glfwSetWindowSize(GLFWwindow* window, int width, int height); /*! @brief Retrieves the size of the framebuffer of the specified window. * * This function retrieves the size, in pixels, of the framebuffer of the - * specified window. + * specified window. If you wish to retrieve the size of the window in screen + * coordinates, see @ref glfwGetWindowSize. + * + * Any or all of the size arguments may be `NULL`. If an error occurs, all + * non-`NULL` size arguments will be set to zero. * * @param[in] window The window whose framebuffer to query. * @param[out] width Where to store the width, in pixels, of the framebuffer, @@ -1416,74 +1890,140 @@ 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. + * + * @sa @ref window_fbsize * @sa glfwSetFramebufferSizeCallback * + * @since Added in GLFW 3.0. + * * @ingroup window */ GLFWAPI void glfwGetFramebufferSize(GLFWwindow* window, int* width, int* height); +/*! @brief Retrieves the size of the frame of the window. + * + * This function retrieves the size, in screen coordinates, of each edge of the + * frame of the specified window. This size includes the title bar, if the + * window has one. The size of the frame may vary depending on the + * [window-related hints](@ref window_hints_wnd) used to create it. + * + * Because this function retrieves the size of each window frame edge and not + * the offset along a particular coordinate axis, the retrieved values will + * always be zero or positive. + * + * Any or all of the size arguments may be `NULL`. If an error occurs, all + * non-`NULL` size arguments will be set to zero. + * + * @param[in] window The window whose frame size to query. + * @param[out] left Where to store the size, in screen coordinates, of the left + * edge of the window frame, or `NULL`. + * @param[out] top Where to store the size, in screen coordinates, of the top + * edge of the window frame, or `NULL`. + * @param[out] right Where to store the size, in screen coordinates, of the + * right edge of the window frame, or `NULL`. + * @param[out] bottom Where to store the size, in screen coordinates, of the + * bottom edge of the window frame, or `NULL`. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_size + * + * @since Added in GLFW 3.1. + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowFrameSize(GLFWwindow* window, int* left, int* top, int* right, int* bottom); + /*! @brief Iconifies the specified window. * - * This function iconifies/minimizes the specified window, if it was previously - * restored. If it is a full screen window, the original monitor resolution is - * restored until the window is restored. If the window is already iconified, - * this function does nothing. + * This function iconifies (minimizes) the specified window if it was + * previously restored. If the window is already iconified, this function does + * nothing. + * + * If the specified window is a full screen window, the original monitor + * resolution is restored until the window is restored. * * @param[in] window The window to iconify. * - * @note This function may only be called from the main thread. + * @par Thread Safety + * This function may only be called from the main thread. * + * @sa @ref window_iconify * @sa glfwRestoreWindow * + * @since Added in GLFW 2.1. + * + * @par + * __GLFW 3:__ Added window handle parameter. + * * @ingroup window */ GLFWAPI void glfwIconifyWindow(GLFWwindow* window); /*! @brief Restores the specified window. * - * This function restores the specified window, if it was previously - * iconified/minimized. If it is a full screen window, the resolution chosen - * for the window is restored on the selected monitor. If the window is - * already restored, this function does nothing. + * This function restores the specified window if it was previously iconified + * (minimized). If the window is already restored, this function does nothing. + * + * If the specified window is a full screen window, the resolution chosen for + * the window is restored on the selected monitor. * * @param[in] window The window to restore. * - * @note This function may only be called from the main thread. + * @par Thread Safety + * This function may only be called from the main thread. * + * @sa @ref window_iconify * @sa glfwIconifyWindow * + * @since Added in GLFW 2.1. + * + * @par + * __GLFW 3:__ Added window handle parameter. + * * @ingroup window */ GLFWAPI void glfwRestoreWindow(GLFWwindow* window); /*! @brief Makes the specified window visible. * - * This function makes the specified window visible, if it was previously + * This function makes the specified window visible if it was previously * hidden. If the window is already visible or is in full screen mode, this * function does nothing. * * @param[in] window The window to make visible. * - * @note This function may only be called from the main thread. + * @par Thread Safety + * This function may only be called from the main thread. * + * @sa @ref window_hide * @sa glfwHideWindow * + * @since Added in GLFW 3.0. + * * @ingroup window */ GLFWAPI void glfwShowWindow(GLFWwindow* window); /*! @brief Hides the specified window. * - * This function hides the specified window, if it was previously visible. If + * This function hides the specified window if it was previously visible. If * the window is already hidden or is in full screen mode, this function does * nothing. * * @param[in] window The window to hide. * - * @note This function may only be called from the main thread. + * @par Thread Safety + * This function may only be called from the main thread. * + * @sa @ref window_hide * @sa glfwShowWindow * + * @since Added in GLFW 3.0. + * * @ingroup window */ GLFWAPI void glfwHideWindow(GLFWwindow* window); @@ -1494,7 +2034,15 @@ GLFWAPI void glfwHideWindow(GLFWwindow* window); * in full screen on. * * @param[in] window The window to query. - * @return The monitor, or `NULL` if the window is in windowed mode. + * @return The monitor, or `NULL` if the window is in windowed mode or an error + * occurred. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_monitor + * + * @since Added in GLFW 3.0. * * @ingroup window */ @@ -1502,13 +2050,22 @@ GLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* window); /*! @brief Returns an attribute of the specified window. * - * This function returns an attribute of the specified window. There are many - * attributes, some related to the window and others to its context. + * This function returns the value of an attribute of the specified window or + * its OpenGL or OpenGL ES context. * * @param[in] window The window to query. * @param[in] attrib The [window attribute](@ref window_attribs) whose value to * return. - * @return The value of the attribute, or zero if an error occurred. + * @return The value of the attribute, or zero if an + * [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_attribs + * + * @since Added in GLFW 3.0. Replaces `glfwGetWindowParam` and + * `glfwGetGLVersion`. * * @ingroup window */ @@ -1523,8 +2080,14 @@ 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. + * + * @sa @ref window_userptr * @sa glfwGetWindowUserPointer * + * @since Added in GLFW 3.0. + * * @ingroup window */ GLFWAPI void glfwSetWindowUserPointer(GLFWwindow* window, void* pointer); @@ -1536,8 +2099,14 @@ 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. + * + * @sa @ref window_userptr * @sa glfwSetWindowUserPointer * + * @since Added in GLFW 3.0. + * * @ingroup window */ GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow* window); @@ -1551,8 +2120,15 @@ GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow* window); * @param[in] window The window whose callback to set. * @param[in] cbfun The new callback, or `NULL` to remove the currently set * callback. - * @return The previously set callback, or `NULL` if no callback was set or an - * error occurred. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_pos + * + * @since Added in GLFW 3.0. * * @ingroup window */ @@ -1567,8 +2143,18 @@ GLFWAPI GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* window, GLFWwindow * @param[in] window The window whose callback to set. * @param[in] cbfun The new callback, or `NULL` to remove the currently set * callback. - * @return The previously set callback, or `NULL` if no callback was set or an - * error occurred. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_size + * + * @since Added in GLFW 1.0. + * + * @par + * __GLFW 3:__ Added window handle parameter. Updated callback signature. * * @ingroup window */ @@ -1588,12 +2174,22 @@ GLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwind * @param[in] window The window whose callback to set. * @param[in] cbfun The new callback, or `NULL` to remove the currently set * callback. - * @return The previously set callback, or `NULL` if no callback was set or an - * error occurred. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). * - * @remarks **Mac OS X:** Selecting Quit from the application menu will + * @remarks __OS X:__ Selecting Quit from the application menu will * trigger the close callback for all windows. * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_close + * + * @since Added in GLFW 2.5. + * + * @par + * __GLFW 3:__ Added window handle parameter. Updated callback signature. + * * @ingroup window */ GLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* window, GLFWwindowclosefun cbfun); @@ -1611,12 +2207,18 @@ GLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* window, GLFWwi * @param[in] window The window whose callback to set. * @param[in] cbfun The new callback, or `NULL` to remove the currently set * callback. - * @return The previously set callback, or `NULL` if no callback was set or an - * error occurred. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). * - * @note On compositing window systems such as Aero, Compiz or Aqua, where the - * window contents are saved off-screen, this callback may be called only very - * infrequently or never at all. + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_refresh + * + * @since Added in GLFW 2.5. + * + * @par + * __GLFW 3:__ Added window handle parameter. Updated callback signature. * * @ingroup window */ @@ -1625,18 +2227,25 @@ GLFWAPI GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* window, GL /*! @brief Sets the focus callback for the specified window. * * This function sets the focus callback of the specified window, which is - * called when the window gains or loses focus. + * called when the window gains or loses input focus. * - * After the focus callback is called for a window that lost focus, synthetic - * key and mouse button release events will be generated for all such that had - * been pressed. For more information, see @ref glfwSetKeyCallback and @ref - * glfwSetMouseButtonCallback. + * After the focus callback is called for a window that lost input focus, + * synthetic key and mouse button release events will be generated for all such + * that had been pressed. For more information, see @ref glfwSetKeyCallback + * and @ref glfwSetMouseButtonCallback. * * @param[in] window The window whose callback to set. * @param[in] cbfun The new callback, or `NULL` to remove the currently set * callback. - * @return The previously set callback, or `NULL` if no callback was set or an - * error occurred. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_focus + * + * @since Added in GLFW 3.0. * * @ingroup window */ @@ -1650,8 +2259,15 @@ GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* window, GLFWwi * @param[in] window The window whose callback to set. * @param[in] cbfun The new callback, or `NULL` to remove the currently set * callback. - * @return The previously set callback, or `NULL` if no callback was set or an - * error occurred. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_iconify + * + * @since Added in GLFW 3.0. * * @ingroup window */ @@ -1665,8 +2281,15 @@ GLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* window, GL * @param[in] window The window whose callback to set. * @param[in] cbfun The new callback, or `NULL` to remove the currently set * callback. - * @return The previously set callback, or `NULL` if no callback was set or an - * error occurred. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_fbsize + * + * @since Added in GLFW 3.0. * * @ingroup window */ @@ -1674,99 +2297,164 @@ GLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* window /*! @brief Processes all pending events. * - * This function processes only those events that have already been received - * and then returns immediately. Processing events will cause the window and - * input callbacks associated with those events to be called. + * This function processes only those events that are already in the event + * queue and then returns immediately. Processing events will cause the window + * and input callbacks associated with those events to be called. * - * This function is not required for joystick input to work. + * 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. * - * @par New in GLFW 3 - * This function is no longer called by @ref glfwSwapBuffers. You need to call - * it or @ref glfwWaitEvents yourself. + * On some platforms, certain events are sent directly to the application + * without going through the event queue, causing callbacks to be called + * outside of a call to one of the event processing functions. * - * @note This function may only be called from the main thread. + * Event processing is not required for joystick input to work. * - * @note This function may not be called from a callback. + * @par Reentrancy + * This function may not be called from a callback. * - * @note On some platforms, certain callbacks may be called outside of a call - * to one of the event processing functions. + * @par Thread Safety + * This function may only be called from the main thread. * + * @sa @ref events * @sa glfwWaitEvents * + * @since Added in GLFW 1.0. + * * @ingroup window */ GLFWAPI void glfwPollEvents(void); -/*! @brief Waits until events are pending and processes them. +/*! @brief Waits until events are queued and processes them. * - * This function puts the calling thread to sleep until at least one event has - * been received. Once one or more events have been received, it behaves as if - * @ref glfwPollEvents was called, i.e. the events are processed and the - * function then returns immediately. Processing events will cause the window - * and input callbacks associated with those events to be called. + * This function puts the calling thread to sleep until at least one event is + * available in the event queue. Once one or more events are available, + * it behaves exactly like @ref glfwPollEvents, i.e. the events in the queue + * are processed and the function then returns immediately. Processing events + * will cause the window and input callbacks associated with those events to be + * called. * * Since not all events are associated with callbacks, this function may return * without a callback having been called even if you are monitoring all * callbacks. * - * This function is not required for joystick input to work. + * 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. * - * @note This function may only be called from the main thread. + * On some platforms, certain callbacks may be called outside of a call to one + * of the event processing functions. * - * @note This function may not be called from a callback. + * 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. * - * @note On some platforms, certain callbacks may be called outside of a call - * to one of the event processing functions. + * Event processing is not required for joystick input to work. * + * @par Reentrancy + * This function may not be called from a callback. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref events * @sa glfwPollEvents * + * @since Added in GLFW 2.5. + * * @ingroup window */ GLFWAPI void glfwWaitEvents(void); +/*! @brief Posts an empty event to the event queue. + * + * This function posts an empty event from the current thread to the event + * queue, causing @ref glfwWaitEvents to return. + * + * If no windows exist, this function returns immediately. For synchronization + * of threads in applications that do not create windows, use your threading + * library of choice. + * + * @par Thread Safety + * This function may be called from any thread. + * + * @sa @ref events + * @sa glfwWaitEvents + * + * @since Added in GLFW 3.1. + * + * @ingroup window + */ +GLFWAPI void glfwPostEmptyEvent(void); + /*! @brief Returns the value of an input option for the specified window. + * + * This function returns the value of an input option for the specified window. + * The mode must be one of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or + * `GLFW_STICKY_MOUSE_BUTTONS`. * * @param[in] window The window to query. * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or * `GLFW_STICKY_MOUSE_BUTTONS`. * + * @par Thread Safety + * This function may only be called from the main thread. + * * @sa glfwSetInputMode * + * @since Added in GLFW 3.0. + * * @ingroup input */ GLFWAPI int glfwGetInputMode(GLFWwindow* window, int mode); /*! @brief Sets an input option for the specified window. + * + * This function sets an input mode option for the specified window. The mode + * must be one of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or + * `GLFW_STICKY_MOUSE_BUTTONS`. + * + * If the mode is `GLFW_CURSOR`, the value must be one of the following cursor + * modes: + * - `GLFW_CURSOR_NORMAL` makes the cursor visible and behaving normally. + * - `GLFW_CURSOR_HIDDEN` makes the cursor invisible when it is over the client + * area of the window but does not restrict the cursor from leaving. + * - `GLFW_CURSOR_DISABLED` hides and grabs the cursor, providing virtual + * and unlimited cursor movement. This is useful for implementing for + * example 3D camera controls. + * + * If the mode is `GLFW_STICKY_KEYS`, the value must be either `GL_TRUE` to + * enable sticky keys, or `GL_FALSE` to disable it. If sticky keys are + * enabled, a key press will ensure that @ref glfwGetKey returns `GLFW_PRESS` + * the next time it is called even if the key had been released before the + * call. This is useful when you are only interested in whether keys have been + * pressed but not when or in which order. + * + * If the mode is `GLFW_STICKY_MOUSE_BUTTONS`, the value must be either + * `GL_TRUE` to enable sticky mouse buttons, or `GL_FALSE` to disable it. If + * sticky mouse buttons are enabled, a mouse button press will ensure that @ref + * glfwGetMouseButton returns `GLFW_PRESS` the next time it is called even if + * the mouse button had been released before the call. This is useful when you + * are only interested in whether mouse buttons have been pressed but not when + * or in which order. + * * @param[in] window The window whose input mode to set. * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or * `GLFW_STICKY_MOUSE_BUTTONS`. * @param[in] value The new value of the specified input mode. * - * If `mode` is `GLFW_CURSOR`, the value must be one of the supported input - * modes: - * - `GLFW_CURSOR_NORMAL` makes the cursor visible and behaving normally. - * - `GLFW_CURSOR_HIDDEN` makes the cursor invisible when it is over the client - * area of the window. - * - `GLFW_CURSOR_DISABLED` disables the cursor and removes any limitations on - * cursor movement. - * - * If `mode` is `GLFW_STICKY_KEYS`, the value must be either `GL_TRUE` to - * enable sticky keys, or `GL_FALSE` to disable it. If sticky keys are - * enabled, a key press will ensure that @ref glfwGetKey returns @ref - * 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 `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 @ref 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. + * @par Thread Safety + * This function may only be called from the main thread. * * @sa glfwGetInputMode * + * @since Added in GLFW 3.0. Replaces `glfwEnable` and `glfwDisable`. + * * @ingroup input */ GLFWAPI void glfwSetInputMode(GLFWwindow* window, int mode, int value); @@ -1776,22 +2464,34 @@ GLFWAPI void glfwSetInputMode(GLFWwindow* window, int mode, int value); * * This function returns the last state reported for the specified key to the * specified window. The returned state is one of `GLFW_PRESS` or - * `GLFW_RELEASE`. The higher-level state `GLFW_REPEAT` is only reported to + * `GLFW_RELEASE`. The higher-level action `GLFW_REPEAT` is only reported to * the key callback. * * If the `GLFW_STICKY_KEYS` input mode is enabled, this function returns - * `GLFW_PRESS` the first time you call this function after a key has been - * pressed, even if the key has already been released. + * `GLFW_PRESS` the first time you call it for a key that was pressed, even if + * that key has already been released. * * The key functions deal with physical keys, with [key tokens](@ref keys) * named after their use on the standard US keyboard layout. If you want to * input text, use the Unicode character callback instead. * + * The [modifier key bit masks](@ref mods) are not key tokens and cannot be + * used with this function. + * * @param[in] window The desired window. - * @param[in] key The desired [keyboard key](@ref keys). + * @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`. * - * @note `GLFW_KEY_UNKNOWN` is not a valid key for this function. + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref input_key + * + * @since Added in GLFW 1.0. + * + * @par + * __GLFW 3:__ Added window handle parameter. * * @ingroup input */ @@ -1801,25 +2501,37 @@ GLFWAPI int glfwGetKey(GLFWwindow* window, int key); * window. * * This function returns the last state reported for the specified mouse button - * to the specified window. + * to the specified window. The returned state is one of `GLFW_PRESS` or + * `GLFW_RELEASE`. * * If the `GLFW_STICKY_MOUSE_BUTTONS` input mode is enabled, this function - * returns `GLFW_PRESS` the first time you call this function after a mouse - * button has been pressed, even if the mouse button has already been released. + * `GLFW_PRESS` the first time you call it for a mouse button that was pressed, + * even if that mouse button has already been released. * * @param[in] window The desired window. * @param[in] button The desired [mouse button](@ref buttons). * @return One of `GLFW_PRESS` or `GLFW_RELEASE`. * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref input_mouse_button + * + * @since Added in GLFW 1.0. + * + * @par + * __GLFW 3:__ Added window handle parameter. + * * @ingroup input */ GLFWAPI int glfwGetMouseButton(GLFWwindow* window, int button); -/*! @brief Retrieves the last reported cursor position, relative to the client - * area of the window. +/*! @brief Retrieves the position of the cursor relative to the client area of + * the window. * - * This function returns the last reported position of the cursor to the - * specified window. + * This function returns the position of the cursor, in screen coordinates, + * relative to the upper-left corner of the client area of the specified + * window. * * If the cursor is disabled (with `GLFW_CURSOR_DISABLED`) then the cursor * position is unbounded and limited only by the minimum and maximum values of @@ -1829,26 +2541,42 @@ GLFWAPI int glfwGetMouseButton(GLFWwindow* window, int button); * `floor` function. Casting directly to an integer type works for positive * coordinates, but fails for negative ones. * + * Any or all of the position arguments may be `NULL`. If an error occurs, all + * non-`NULL` position arguments will be set to zero. + * * @param[in] window The desired window. * @param[out] xpos Where to store the cursor x-coordinate, relative to the * left edge of the client area, or `NULL`. * @param[out] ypos Where to store the cursor y-coordinate, relative to the to * top edge of the client area, or `NULL`. * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref cursor_pos * @sa glfwSetCursorPos * + * @since Added in GLFW 3.0. Replaces `glfwGetMousePos`. + * * @ingroup input */ GLFWAPI void glfwGetCursorPos(GLFWwindow* window, double* xpos, double* ypos); -/*! @brief Sets the position of the cursor, relative to the client area of the window. +/*! @brief Sets the position of the cursor, relative to the client area of the + * window. * - * This function sets the position of the cursor. The specified window must be - * focused. If the window does not have focus when this function is called, it - * fails silently. + * This function sets the position, in screen coordinates, of the cursor + * relative to the upper-left corner of the client area of the specified + * window. The window must have input focus. If the window does not have + * input focus when this function is called, it fails silently. * - * If the cursor is disabled (with `GLFW_CURSOR_DISABLED`) then the cursor - * position is unbounded and limited only by the minimum and maximum values of + * __Do not use this function__ to implement things like camera controls. GLFW + * already provides the `GLFW_CURSOR_DISABLED` cursor mode that hides the + * cursor, transparently re-centers it and provides unconstrained cursor + * motion. See @ref glfwSetInputMode for more information. + * + * If the cursor mode is `GLFW_CURSOR_DISABLED` then the cursor position is + * unconstrained and limited only by the minimum and maximum values of * a `double`. * * @param[in] window The desired window. @@ -1857,15 +2585,138 @@ 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. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref cursor_pos * @sa glfwGetCursorPos * + * @since Added in GLFW 3.0. Replaces `glfwSetMousePos`. + * * @ingroup input */ GLFWAPI void glfwSetCursorPos(GLFWwindow* window, double xpos, double ypos); +/*! @brief Creates a custom cursor. + * + * Creates a new custom cursor image that can be set for a window with @ref + * glfwSetCursor. The cursor can be destroyed with @ref glfwDestroyCursor. + * Any remaining cursors are destroyed by @ref glfwTerminate. + * + * The pixels are 32-bit little-endian RGBA, i.e. eight bits per channel. They + * are arranged canonically as packed sequential rows, starting from the + * top-left corner. + * + * The cursor hotspot is specified in pixels, relative to the upper-left corner + * of the cursor image. Like all other coordinate systems in GLFW, the X-axis + * points to the right and the Y-axis points down. + * + * @param[in] image The desired cursor image. + * @param[in] xhot The desired x-coordinate, in pixels, of the cursor hotspot. + * @param[in] yhot The desired y-coordinate, in pixels, of the cursor hotspot. + * + * @return The handle of the created cursor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @par Pointer Lifetime + * The specified image data is copied before this function returns. + * + * @par Reentrancy + * This function may not be called from a callback. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref cursor_object + * @sa glfwDestroyCursor + * @sa glfwCreateStandardCursor + * + * @since Added in GLFW 3.1. + * + * @ingroup input + */ +GLFWAPI GLFWcursor* glfwCreateCursor(const GLFWimage* image, int xhot, int yhot); + +/*! @brief Creates a cursor with a standard shape. + * + * Returns a cursor with a [standard shape](@ref shapes), that can be set for + * a window with @ref glfwSetCursor. + * + * @param[in] shape One of the [standard shapes](@ref shapes). + * + * @return A new cursor ready to use or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @par Reentrancy + * This function may not be called from a callback. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref cursor_object + * @sa glfwCreateCursor + * + * @since Added in GLFW 3.1. + * + * @ingroup input + */ +GLFWAPI GLFWcursor* glfwCreateStandardCursor(int shape); + +/*! @brief Destroys a cursor. + * + * This function destroys a cursor previously created with @ref + * glfwCreateCursor. Any remaining cursors will be destroyed by @ref + * glfwTerminate. + * + * @param[in] cursor The cursor object to destroy. + * + * @par Reentrancy + * This function may not be called from a callback. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref cursor_object + * @sa glfwCreateCursor + * + * @since Added in GLFW 3.1. + * + * @ingroup input + */ +GLFWAPI void glfwDestroyCursor(GLFWcursor* cursor); + +/*! @brief Sets the cursor for the window. + * + * This function sets the cursor image to be used when the cursor is over the + * client area of the specified window. The set cursor will only be visible + * when the [cursor mode](@ref cursor_mode) of the window is + * `GLFW_CURSOR_NORMAL`. + * + * On some platforms, the set cursor may not be visible unless the window also + * has input focus. + * + * @param[in] window The window to set the cursor for. + * @param[in] cursor The cursor to set, or `NULL` to switch back to the default + * arrow cursor. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref cursor_object + * + * @since Added in GLFW 3.1. + * + * @ingroup input + */ +GLFWAPI void glfwSetCursor(GLFWwindow* window, GLFWcursor* cursor); + /*! @brief Sets the key callback. * - * This function sets the key callback of the specific window, which is called + * This function sets the key callback of the specified window, which is called * when a key is pressed, repeated or released. * * The key functions deal with physical keys, with layout independent @@ -1873,16 +2724,16 @@ GLFWAPI void glfwSetCursorPos(GLFWwindow* window, double xpos, double ypos); * layout. If you want to input text, use the * [character callback](@ref glfwSetCharCallback) instead. * - * When a window loses focus, it will generate synthetic key release events - * for all pressed keys. You can tell these events from user-generated events - * by the fact that the synthetic ones are generated after the window has lost - * focus, i.e. `GLFW_FOCUSED` will be false and the focus callback will have - * already been called. + * When a window loses input focus, it will generate synthetic key release + * events for all pressed keys. You can tell these events from user-generated + * events by the fact that the synthetic ones are generated after the focus + * loss event has been processed, i.e. after the + * [window focus callback](@ref glfwSetWindowFocusCallback) has been called. * * The scancode of a key is specific to that platform or sometimes even to that * machine. Scancodes are intended to allow users to bind keys that don't have * a GLFW key token. Such keys have `key` set to `GLFW_KEY_UNKNOWN`, their - * state is not saved and so it cannot be retrieved with @ref glfwGetKey. + * state is not saved and so it cannot be queried with @ref glfwGetKey. * * Sometimes GLFW needs to generate synthetic key events, in which case the * scancode may be zero. @@ -1890,8 +2741,18 @@ GLFWAPI void glfwSetCursorPos(GLFWwindow* window, double xpos, double ypos); * @param[in] window The window whose callback to set. * @param[in] cbfun The new key callback, or `NULL` to remove the currently * set callback. - * @return The previously set callback, or `NULL` if no callback was set or an - * error occurred. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref input_key + * + * @since Added in GLFW 1.0. + * + * @par + * __GLFW 3:__ Added window handle parameter. Updated callback signature. * * @ingroup input */ @@ -1899,11 +2760,56 @@ GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun cbfun); /*! @brief Sets the Unicode character callback. * - * This function sets the character callback of the specific window, which is + * This function sets the character callback of the specified window, which is * called when a Unicode character is input. * - * The character callback is intended for text input. If you want to know - * whether a specific key was pressed or released, use the + * The character callback is intended for Unicode text input. As it deals with + * characters, it is keyboard layout dependent, whereas the + * [key callback](@ref glfwSetKeyCallback) is not. Characters do not map 1:1 + * to physical keys, as a key may produce zero, one or more characters. If you + * want to know whether a specific physical key was pressed or released, see + * the key callback instead. + * + * The character callback behaves as system text input normally does and will + * not be called if modifier keys are held down that would prevent normal text + * input on that platform, for example a Super (Command) key on OS X or Alt key + * on Windows. There is a + * [character with modifiers callback](@ref glfwSetCharModsCallback) that + * receives these events. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref input_char + * + * @since Added in GLFW 2.4. + * + * @par + * __GLFW 3:__ Added window handle parameter. Updated callback signature. + * + * @ingroup input + */ +GLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* window, GLFWcharfun cbfun); + +/*! @brief Sets the Unicode character with modifiers callback. + * + * This function sets the character with modifiers callback of the specified + * window, which is called when a Unicode character is input regardless of what + * modifier keys are used. + * + * The character with modifiers callback is intended for implementing custom + * Unicode character input. For regular Unicode text input, see the + * [character callback](@ref glfwSetCharCallback). Like the character + * callback, the character with modifiers callback deals with characters and is + * keyboard layout dependent. Characters do not map 1:1 to physical keys, as + * a key may produce zero, one or more characters. If you want to know whether + * a specific physical key was pressed or released, see the * [key callback](@ref glfwSetKeyCallback) instead. * * @param[in] window The window whose callback to set. @@ -1912,26 +2818,43 @@ GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun 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. + * + * @sa @ref input_char + * + * @since Added in GLFW 3.1. + * * @ingroup input */ -GLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* window, GLFWcharfun cbfun); +GLFWAPI GLFWcharmodsfun glfwSetCharModsCallback(GLFWwindow* window, GLFWcharmodsfun cbfun); /*! @brief Sets the mouse button callback. * * This function sets the mouse button callback of the specified window, which * is called when a mouse button is pressed or released. * - * When a window loses focus, it will generate synthetic mouse button release - * events for all pressed mouse buttons. You can tell these events from - * user-generated events by the fact that the synthetic ones are generated - * after the window has lost focus, i.e. `GLFW_FOCUSED` will be false and the - * focus callback will have already been called. + * When a window loses input focus, it will generate synthetic mouse button + * release events for all pressed mouse buttons. You can tell these events + * from user-generated events by the fact that the synthetic ones are generated + * after the focus loss event has been processed, i.e. after the + * [window focus callback](@ref glfwSetWindowFocusCallback) has been called. * * @param[in] window The window whose callback to set. * @param[in] cbfun The new callback, or `NULL` to remove the currently set * callback. - * @return The previously set callback, or `NULL` if no callback was set or an - * error occurred. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref input_mouse_button + * + * @since Added in GLFW 1.0. + * + * @par + * __GLFW 3:__ Added window handle parameter. Updated callback signature. * * @ingroup input */ @@ -1941,13 +2864,21 @@ GLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* window, GLFWmo * * This function sets the cursor position callback of the specified window, * which is called when the cursor is moved. The callback is provided with the - * position relative to the upper-left corner of the client area of the window. + * position, in screen coordinates, relative to the upper-left corner of the + * client area of the window. * * @param[in] window The window whose callback to set. * @param[in] cbfun The new callback, or `NULL` to remove the currently set * callback. - * @return The previously set callback, or `NULL` if no callback was set or an - * error occurred. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref cursor_pos + * + * @since Added in GLFW 3.0. Replaces `glfwSetMousePosCallback`. * * @ingroup input */ @@ -1962,8 +2893,15 @@ GLFWAPI GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* window, GLFWcursor * @param[in] window The window whose callback to set. * @param[in] cbfun The new callback, or `NULL` to remove the currently set * callback. - * @return The previously set callback, or `NULL` if no callback was set or an - * error occurred. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref cursor_enter + * + * @since Added in GLFW 3.0. * * @ingroup input */ @@ -1981,20 +2919,61 @@ GLFWAPI GLFWcursorenterfun glfwSetCursorEnterCallback(GLFWwindow* window, GLFWcu * @param[in] window The window whose callback to set. * @param[in] cbfun The new scroll callback, or `NULL` to remove the currently * set callback. - * @return The previously set callback, or `NULL` if no callback was set or an - * error occurred. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref scrolling + * + * @since Added in GLFW 3.0. Replaces `glfwSetMouseWheelCallback`. * * @ingroup input */ GLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow* window, GLFWscrollfun cbfun); +/*! @brief Sets the file drop callback. + * + * This function sets the file drop callback of the specified window, which is + * called when one or more dragged files are dropped on the window. + * + * Because the path array and its strings may have been generated specifically + * for that event, they are not guaranteed to be valid after the callback has + * returned. If you wish to use them after the callback returns, you need to + * make a deep copy. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new file drop callback, or `NULL` to remove the + * currently set callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref path_drop + * + * @since Added in GLFW 3.1. + * + * @ingroup input + */ +GLFWAPI GLFWdropfun glfwSetDropCallback(GLFWwindow* window, GLFWdropfun cbfun); + /*! @brief Returns whether the specified joystick is present. * * This function returns whether the specified joystick is present. * - * @param[in] joy The joystick to query. + * @param[in] joy The [joystick](@ref joysticks) to query. * @return `GL_TRUE` if the joystick is present, or `GL_FALSE` otherwise. * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref joystick + * + * @since Added in GLFW 3.0. Replaces `glfwGetJoystickParam`. + * * @ingroup input */ GLFWAPI int glfwJoystickPresent(int joy); @@ -2002,17 +2981,24 @@ GLFWAPI int glfwJoystickPresent(int joy); /*! @brief Returns the values of all axes of the specified joystick. * * This function returns the values of all axes of the specified joystick. + * Each element in the array is a value between -1.0 and 1.0. * - * @param[in] joy The joystick to query. - * @param[out] count Where to store the size of the returned array. This is - * set to zero if an error occurred. + * @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. * - * @note The returned array is allocated and freed by GLFW. You should not - * free it yourself. + * @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. * - * @note The returned array is valid only until the next call to @ref - * glfwGetJoystickAxes for that joystick. + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref joystick_axis + * + * @since Added in GLFW 3.0. Replaces `glfwGetJoystickPos`. * * @ingroup input */ @@ -2021,17 +3007,27 @@ GLFWAPI const float* glfwGetJoystickAxes(int joy, int* count); /*! @brief Returns the state of all buttons of the specified joystick. * * This function returns the state of all buttons of the specified joystick. + * Each element in the array is either `GLFW_PRESS` or `GLFW_RELEASE`. * - * @param[in] joy The joystick to query. - * @param[out] count Where to store the size of the returned array. This is - * set to zero if an error occurred. + * @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. * - * @note The returned array is allocated and freed by GLFW. You should not - * free it yourself. + * @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. * - * @note The returned array is valid only until the next call to @ref - * glfwGetJoystickButtons for that joystick. + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref joystick_button + * + * @since Added in GLFW 2.2. + * + * @par + * __GLFW 3:__ Changed to return a dynamic array. * * @ingroup input */ @@ -2040,16 +3036,24 @@ GLFWAPI const unsigned char* glfwGetJoystickButtons(int joy, int* count); /*! @brief Returns the name of the specified joystick. * * This function returns the name, encoded as UTF-8, of the specified joystick. + * The returned string is allocated and freed by GLFW. You should not free it + * yourself. * - * @param[in] joy The joystick to query. + * @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. * - * @note The returned string is allocated and freed by GLFW. You should not - * free it yourself. + * @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. * - * @note The returned string is valid only until the next call to @ref - * glfwGetJoystickName for that joystick. + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref joystick_name + * + * @since Added in GLFW 3.0. * * @ingroup input */ @@ -2058,40 +3062,50 @@ GLFWAPI const char* glfwGetJoystickName(int joy); /*! @brief Sets the clipboard to the specified string. * * This function sets the system clipboard to the specified, UTF-8 encoded - * string. The string is copied before returning, so you don't have to retain - * it afterwards. + * string. * * @param[in] window The window that will own the clipboard contents. * @param[in] string A UTF-8 encoded string. * - * @note This function may only be called from the main thread. + * @par Pointer Lifetime + * The specified string is copied before this function returns. * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref clipboard * @sa glfwGetClipboardString * - * @ingroup clipboard + * @since Added in GLFW 3.0. + * + * @ingroup input */ GLFWAPI void glfwSetClipboardString(GLFWwindow* window, const char* string); -/*! @brief Retrieves the contents of the clipboard as a string. +/*! @brief Returns the contents of the clipboard as a string. * * This function returns the contents of the system clipboard, if it contains * or is convertible to a UTF-8 encoded string. * * @param[in] window The window that will request the clipboard contents. * @return The contents of the clipboard as a UTF-8 encoded string, or `NULL` - * if an error occurred. + * if an [error](@ref error_handling) occurred. * - * @note This function may only be called from the main thread. + * @par Pointer Lifetime + * The returned string is allocated and freed by GLFW. You should not free it + * yourself. It is valid until the next call to @ref + * glfwGetClipboardString or @ref glfwSetClipboardString, or until the library + * is terminated. * - * @note The returned string is allocated and freed by GLFW. You should not - * free it yourself. - * - * @note The returned string is valid only until the next call to @ref - * glfwGetClipboardString or @ref glfwSetClipboardString. + * @par Thread Safety + * This function may only be called from the main thread. * + * @sa @ref clipboard * @sa glfwSetClipboardString * - * @ingroup clipboard + * @since Added in GLFW 3.0. + * + * @ingroup input */ GLFWAPI const char* glfwGetClipboardString(GLFWwindow* window); @@ -2101,15 +3115,21 @@ GLFWAPI const char* glfwGetClipboardString(GLFWwindow* window); * been set using @ref glfwSetTime, the timer measures time elapsed since GLFW * was initialized. * - * @return The current value, in seconds, or zero if an error occurred. + * The resolution of the timer is system dependent, but is usually on the order + * of a few micro- or nanoseconds. It uses the highest-resolution monotonic + * time source on each supported platform. * - * @remarks This function may be called from secondary threads. + * @return The current value, in seconds, or zero if an + * [error](@ref error_handling) occurred. * - * @note The resolution of the timer is system dependent, but is usually on the - * order of a few micro- or nanoseconds. It uses the highest-resolution - * monotonic time source on each supported platform. + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. * - * @ingroup time + * @sa @ref time + * + * @since Added in GLFW 1.0. + * + * @ingroup input */ GLFWAPI double glfwGetTime(void); @@ -2120,44 +3140,61 @@ GLFWAPI double glfwGetTime(void); * * @param[in] time The new value, in seconds. * - * @note The resolution of the timer is system dependent, but is usually on the - * order of a few micro- or nanoseconds. It uses the highest-resolution - * monotonic time source on each supported platform. + * @par Thread Safety + * This function may only be called from the main thread. * - * @ingroup time + * @sa @ref time + * + * @since Added in GLFW 2.2. + * + * @ingroup input */ GLFWAPI void glfwSetTime(double time); /*! @brief Makes the context of the specified window current for the calling * thread. * - * This function makes the context of the specified window current on the - * calling thread. A context can only be made current on a single thread at - * a time and each thread can have only a single current context at a time. + * This function makes the OpenGL or OpenGL ES context of the specified window + * current on the calling thread. A context can only be made current on + * a single thread at a time and each thread can have only a single current + * context at a time. + * + * By default, making a context non-current implicitly forces a pipeline flush. + * On machines that support `GL_KHR_context_flush_control`, you can control + * whether a context performs this flush by setting the + * [GLFW_CONTEXT_RELEASE_BEHAVIOR](@ref window_hints_ctx) window hint. * * @param[in] window The window whose context to make current, or `NULL` to * detach the current context. * - * @remarks This function may be called from secondary threads. + * @par Thread Safety + * This function may be called from any thread. * + * @sa @ref context_current * @sa glfwGetCurrentContext * + * @since Added in GLFW 3.0. + * * @ingroup context */ GLFWAPI void glfwMakeContextCurrent(GLFWwindow* window); /*! @brief Returns the window whose context is current on the calling thread. * - * This function returns the window whose context is current on the calling - * thread. + * This function returns the window whose OpenGL or OpenGL ES context is + * current on the calling thread. * * @return The window whose context is current, or `NULL` if no window's * context is current. * - * @remarks This function may be called from secondary threads. + * @par Thread Safety + * This function may be called from any thread. * + * @sa @ref context_current * @sa glfwMakeContextCurrent * + * @since Added in GLFW 3.0. + * * @ingroup context */ GLFWAPI GLFWwindow* glfwGetCurrentContext(void); @@ -2170,24 +3207,28 @@ GLFWAPI GLFWwindow* glfwGetCurrentContext(void); * * @param[in] window The window whose buffers to swap. * - * @remarks This function may be called from secondary threads. - * - * @par New in GLFW 3 - * This function no longer calls @ref glfwPollEvents. You need to call it or - * @ref glfwWaitEvents yourself. + * @par Thread Safety + * This function may be called from any thread. * + * @sa @ref buffer_swap * @sa glfwSwapInterval * - * @ingroup context + * @since Added in GLFW 1.0. + * + * @par + * __GLFW 3:__ Added window handle parameter. + * + * @ingroup window */ GLFWAPI void glfwSwapBuffers(GLFWwindow* window); /*! @brief Sets the swap interval for the current context. * * This function sets the swap interval for the current context, i.e. the - * number of screen updates to wait before swapping the buffers of a window and - * returning from @ref glfwSwapBuffers. This is sometimes called 'vertical - * synchronization', 'vertical retrace synchronization' or 'vsync'. + * 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, @@ -2196,17 +3237,29 @@ GLFWAPI void glfwSwapBuffers(GLFWwindow* window); * glfwExtensionSupported. For more information about swap tearing, see the * extension specifications. * + * A context must be current on the calling thread. Calling this function + * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. + * * @param[in] interval The minimum number of screen updates to wait for * until the buffers are swapped by @ref glfwSwapBuffers. * - * @remarks This function may be called from secondary threads. + * @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 + * 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. * + * @par Thread Safety + * This function may be called from any thread. + * + * @sa @ref buffer_swap * @sa glfwSwapBuffers * + * @since Added in GLFW 1.0. + * * @ingroup context */ GLFWAPI void glfwSwapInterval(int interval); @@ -2214,19 +3267,28 @@ GLFWAPI void glfwSwapInterval(int interval); /*! @brief Returns whether the specified extension is available. * * This function returns whether the specified - * [OpenGL or context creation API extension](@ref context_glext) is supported - * by the current context. For example, on Windows both the OpenGL and WGL - * extension strings are checked. + * [API extension](@ref context_glext) is supported by the current OpenGL or + * OpenGL ES context. It searches both for OpenGL and OpenGL ES extension and + * platform-specific context creation API extensions. + * + * A context must be current on the calling thread. Calling this function + * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. + * + * As this functions retrieves and searches one or more extension strings each + * call, it is recommended that you cache its results if it is going to be used + * frequently. The extension strings will not change during the lifetime of + * a context, so there is no danger in doing this. * * @param[in] extension The ASCII encoded name of the extension. * @return `GL_TRUE` if the extension is available, or `GL_FALSE` otherwise. * - * @remarks This function may be called from secondary threads. + * @par Thread Safety + * This function may be called from any thread. * - * @note As this functions searches one or more extension strings on each call, - * it is recommended that you cache its results if it's going to be used - * frequently. The extension strings will not change during the lifetime of - * a context, so there is no danger in doing this. + * @sa @ref context_glext + * @sa glfwGetProcAddress + * + * @since Added in GLFW 1.0. * * @ingroup context */ @@ -2239,15 +3301,27 @@ GLFWAPI int glfwExtensionSupported(const char* extension); * [client API 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. + * unavailable or an [error](@ref error_handling) occurred. * - * @remarks This function may be called from secondary threads. + * @note The addresses of a given function is not guaranteed to be the same + * between contexts. * - * @note The addresses of these functions are not guaranteed to be the same for - * all contexts, especially if they use different client APIs or even different - * context creation hints. + * @par Pointer Lifetime + * The returned function pointer is valid until the context is destroyed or the + * library is terminated. + * + * @par Thread Safety + * This function may be called from any thread. + * + * @sa @ref context_glext + * @sa glfwExtensionSupported + * + * @since Added in GLFW 1.0. * * @ingroup context */ diff --git a/examples/opengl_example/glfw/include/GLFW/glfw3native.h b/examples/opengl_example/glfw/include/GLFW/glfw3native.h index d570f587..b3ce7482 100644 --- a/examples/opengl_example/glfw/include/GLFW/glfw3native.h +++ b/examples/opengl_example/glfw/include/GLFW/glfw3native.h @@ -1,5 +1,5 @@ /************************************************************************* - * GLFW 3.0 - www.glfw.org + * GLFW 3.1 - www.glfw.org * A library for OpenGL, window and input *------------------------------------------------------------------------ * Copyright (c) 2002-2006 Marcus Geelnard @@ -40,13 +40,13 @@ extern "C" { /*! @defgroup native Native access * - * **By using the native API, you assert that you know what you're doing and - * how to fix problems caused by using it. If you don't, you shouldn't be - * using it.** + * **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 API macro and exactly one context API macro. Failure to do this - * will cause a compile-time error. + * window system API macro and exactly one context creation API macro. Failure + * to do this will cause a compile-time error. * * The available window API macros are: * * `GLFW_EXPOSE_NATIVE_WIN32` @@ -71,8 +71,13 @@ extern "C" { *************************************************************************/ #if defined(GLFW_EXPOSE_NATIVE_WIN32) + // This is a workaround for the fact that glfw3.h needs to export APIENTRY (for + // example to allow applications to correctly declare a GL_ARB_debug_output + // callback) but windows.h assumes no one will define APIENTRY before it does + #undef APIENTRY #include #elif defined(GLFW_EXPOSE_NATIVE_COCOA) + #include #if defined(__OBJC__) #import #else @@ -80,8 +85,9 @@ extern "C" { #endif #elif defined(GLFW_EXPOSE_NATIVE_X11) #include + #include #else - #error "No window API specified" + #error "No window API selected" #endif #if defined(GLFW_EXPOSE_NATIVE_WGL) @@ -93,7 +99,7 @@ extern "C" { #elif defined(GLFW_EXPOSE_NATIVE_EGL) #include #else - #error "No context API specified" + #error "No context API selected" #endif @@ -102,8 +108,49 @@ extern "C" { *************************************************************************/ #if defined(GLFW_EXPOSE_NATIVE_WIN32) +/*! @brief Returns the adapter device name of the specified monitor. + * + * @return The UTF-8 encoded adapter device name (for example `\\.\DISPLAY1`) + * of the specified monitor, or `NULL` if an [error](@ref error_handling) + * occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.1. + * + * @ingroup native + */ +GLFWAPI const char* glfwGetWin32Adapter(GLFWmonitor* monitor); + +/*! @brief Returns the display device name of the specified monitor. + * + * @return The UTF-8 encoded display device name (for example + * `\\.\DISPLAY1\Monitor0`) of the specified monitor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.1. + * + * @ingroup native + */ +GLFWAPI const char* glfwGetWin32Monitor(GLFWmonitor* monitor); + /*! @brief Returns the `HWND` of the specified window. - * @return The `HWND` of the specified window. + * + * @return The `HWND` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.0. + * * @ingroup native */ GLFWAPI HWND glfwGetWin32Window(GLFWwindow* window); @@ -111,15 +158,48 @@ GLFWAPI HWND glfwGetWin32Window(GLFWwindow* window); #if defined(GLFW_EXPOSE_NATIVE_WGL) /*! @brief Returns the `HGLRC` of the specified window. - * @return The `HGLRC` of the specified window. + * + * @return The `HGLRC` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.0. + * * @ingroup native */ GLFWAPI HGLRC glfwGetWGLContext(GLFWwindow* window); #endif #if defined(GLFW_EXPOSE_NATIVE_COCOA) +/*! @brief Returns the `CGDirectDisplayID` of the specified monitor. + * + * @return The `CGDirectDisplayID` of the specified monitor, or + * `kCGNullDirectDisplay` if an [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.1. + * + * @ingroup native + */ +GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* monitor); + /*! @brief Returns the `NSWindow` of the specified window. - * @return The `NSWindow` of the specified window. + * + * @return The `NSWindow` of the specified window, or `nil` if an + * [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.0. + * * @ingroup native */ GLFWAPI id glfwGetCocoaWindow(GLFWwindow* window); @@ -127,7 +207,16 @@ GLFWAPI id glfwGetCocoaWindow(GLFWwindow* window); #if defined(GLFW_EXPOSE_NATIVE_NSGL) /*! @brief Returns the `NSOpenGLContext` of the specified window. - * @return The `NSOpenGLContext` of the specified window. + * + * @return The `NSOpenGLContext` of the specified window, or `nil` if an + * [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.0. + * * @ingroup native */ GLFWAPI id glfwGetNSGLContext(GLFWwindow* window); @@ -135,12 +224,61 @@ GLFWAPI id glfwGetNSGLContext(GLFWwindow* window); #if defined(GLFW_EXPOSE_NATIVE_X11) /*! @brief Returns the `Display` used by GLFW. - * @return The `Display` used by GLFW. + * + * @return The `Display` used by GLFW, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.0. + * * @ingroup native */ GLFWAPI Display* glfwGetX11Display(void); + +/*! @brief Returns the `RRCrtc` of the specified monitor. + * + * @return The `RRCrtc` of the specified monitor, or `None` if an + * [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.1. + * + * @ingroup native + */ +GLFWAPI RRCrtc glfwGetX11Adapter(GLFWmonitor* monitor); + +/*! @brief Returns the `RROutput` of the specified monitor. + * + * @return The `RROutput` of the specified monitor, or `None` if an + * [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.1. + * + * @ingroup native + */ +GLFWAPI RROutput glfwGetX11Monitor(GLFWmonitor* monitor); + /*! @brief Returns the `Window` of the specified window. - * @return The `Window` of the specified window. + * + * @return The `Window` of the specified window, or `None` if an + * [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.0. + * * @ingroup native */ GLFWAPI Window glfwGetX11Window(GLFWwindow* window); @@ -148,7 +286,16 @@ GLFWAPI Window glfwGetX11Window(GLFWwindow* window); #if defined(GLFW_EXPOSE_NATIVE_GLX) /*! @brief Returns the `GLXContext` of the specified window. - * @return The `GLXContext` of the specified window. + * + * @return The `GLXContext` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.0. + * * @ingroup native */ GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window); @@ -156,17 +303,46 @@ GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window); #if defined(GLFW_EXPOSE_NATIVE_EGL) /*! @brief Returns the `EGLDisplay` used by GLFW. - * @return The `EGLDisplay` used by GLFW. + * + * @return The `EGLDisplay` used by GLFW, or `EGL_NO_DISPLAY` if an + * [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.0. + * * @ingroup native */ GLFWAPI EGLDisplay glfwGetEGLDisplay(void); + /*! @brief Returns the `EGLContext` of the specified window. - * @return The `EGLContext` of the specified window. + * + * @return The `EGLContext` of the specified window, or `EGL_NO_CONTEXT` if an + * [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.0. + * * @ingroup native */ GLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* window); + /*! @brief Returns the `EGLSurface` of the specified window. - * @return The `EGLSurface` of the specified window. + * + * @return The `EGLSurface` of the specified window, or `EGL_NO_SURFACE` if an + * [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.0. + * * @ingroup native */ GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* window); diff --git a/examples/opengl_example/glfw/lib-msvc100/glfw3.lib b/examples/opengl_example/glfw/lib-msvc100/glfw3.lib deleted file mode 100644 index 777b5b6cefdb2719f3ed19d69db00c92e30b5a83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121560 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 Od(k0V?c>UJAo#z??x9ft diff --git a/examples/opengl_example/glfw/lib-msvc110/glfw3.lib b/examples/opengl_example/glfw/lib-msvc110/glfw3.lib deleted file mode 100644 index c5c9cbae9dc033ef0cf48652aefe05ee324c5105..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121720 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 aU_IiI0n~nyC9BpQgHHDSSoY@r*#8fJe)rq} diff --git a/examples/opengl_example/glfw/lib-vc2010-32/glfw3.lib b/examples/opengl_example/glfw/lib-vc2010-32/glfw3.lib new file mode 100644 index 0000000000000000000000000000000000000000..014458efed8cff308e876c22c2e4832c705079eb GIT binary patch literal 129546 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 L?xao99RL3TeG$IW literal 0 HcmV?d00001 diff --git a/examples/opengl_example/opengl_example.vcxproj b/examples/opengl_example/opengl_example.vcxproj index 6dc90454..c92d0acc 100644 --- a/examples/opengl_example/opengl_example.vcxproj +++ b/examples/opengl_example/opengl_example.vcxproj @@ -54,7 +54,7 @@ true - $(ProjectDir)\glfw\lib-msvc100;$(ProjectDir)\glew\lib\Release\Win32;%(AdditionalLibraryDirectories) + $(ProjectDir)\glfw\lib-vc2010-32;%(AdditionalLibraryDirectories) opengl32.lib;glfw3.lib;%(AdditionalDependencies) Console msvcrt.lib @@ -72,7 +72,7 @@ true true true - $(ProjectDir)\glfw\lib-msvc100;$(ProjectDir)\glew\lib\Release\Win32;%(AdditionalLibraryDirectories) + $(ProjectDir)\glfw\lib-vc2010-32;%(AdditionalLibraryDirectories) opengl32.lib;glfw3.lib;%(AdditionalDependencies) Console