diff --git a/examples/gears.c b/examples/gears.c
index 63f973d2..b056251a 100644
--- a/examples/gears.c
+++ b/examples/gears.c
@@ -359,8 +359,6 @@ int main(int argc, char *argv[])
glfwGetWindowSize(window, &width, &height);
reshape(window, width, height);
- glfwSetInputMode( window, GLFW_KEY_REPEAT, GL_TRUE );
-
// Parse command-line options
init(argc, argv);
diff --git a/examples/wave.c b/examples/wave.c
index c04bfb2d..7b4b4c32 100644
--- a/examples/wave.c
+++ b/examples/wave.c
@@ -419,8 +419,6 @@ int main(int argc, char* argv[])
glfwGetWindowSize(window, &width, &height);
window_size_callback(window, width, height);
- glfwSetInputMode(window, GLFW_KEY_REPEAT, GL_TRUE);
-
// Initialize OpenGL
init_opengl();
diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h
index 6e8340be..ade6d9e5 100644
--- a/include/GL/glfw3.h
+++ b/include/GL/glfw3.h
@@ -35,13 +35,48 @@ extern "C" {
#endif
+/*************************************************************************
+ * Doxygen documentation
+ *************************************************************************/
+
+/*! @mainpage notitle
+ *
+ * @section intro Introduction
+ *
+ * This is the reference documentation for the GLFW library.
+ */
+
+/*! @defgroup clipboard Clipboard support
+ */
+/*! @defgroup error Error handling
+ */
+/*! @defgroup gamma Gamma ramp support
+ */
+/*! @defgroup init Initialization and version information
+ */
+/*! @defgroup input Input handling
+ */
+/*! @defgroup opengl OpenGL support
+ */
+/*! @defgroup time Time input
+ */
+/*! @defgroup window Window handling
+ *
+ * The primary purpose of GLFW is to provide a simple interface to OpenGL
+ * context creation and window management. GLFW supports multiple windows,
+ * which can be either a normal desktop window or a fullscreen window.
+ */
+/*! @defgroup monitor Monitor handling
+ */
+
+
/*************************************************************************
* Global definitions
*************************************************************************/
/* ------------------- BEGIN SYSTEM/COMPILER SPECIFIC -------------------- */
-/* Please report any probles that you find with your compiler, which may
+/* Please report any problems that you find with your compiler, which may
* be solved in this section! There are several compilers that I have not
* been able to test this file with yet.
*
@@ -166,18 +201,46 @@ extern "C" {
* GLFW version
*************************************************************************/
+/*! @name GLFW version macros
+ * @{ */
+/*! @brief The major version number of the GLFW library.
+ *
+ * This is incremented when the API is changed in non-compatible ways.
+ * @ingroup init
+ */
#define GLFW_VERSION_MAJOR 3
+/*! @brief The minor version number of the GLFW library.
+ *
+ * This is incremented when features are added to the API but it remains
+ * backward-compatible.
+ * @ingroup init
+ */
#define GLFW_VERSION_MINOR 0
+/*! @brief The revision number of the GLFW library.
+ *
+ * This is incremented when a bug fix release is made that does not contain any
+ * API changes.
+ * @ingroup init
+ */
#define GLFW_VERSION_REVISION 0
+/*! @} */
/*************************************************************************
* Input handling definitions
*************************************************************************/
-/* Key and button state/action definitions */
+/*! @name Key and button actions
+ * @{ */
+/*! @brief The key or button was released.
+ * @ingroup input
+ */
#define GLFW_RELEASE 0
+/*! @brief The key or button was pressed.
+ * @ingroup input
+ */
#define GLFW_PRESS 1
+/*! @} */
/* Keyboard raw key codes.
* These key codes are inspired by the USB HID Usage Tables v1.12 (p. 53-60),
@@ -195,6 +258,11 @@ extern "C" {
* "BACKSPACE", etc).
*/
+/*! @defgroup keys Keyboard keys
+ * @ingroup input
+ * @{
+ */
+
/* Printable keys */
#define GLFW_KEY_SPACE 32
#define GLFW_KEY_APOSTROPHE 39 /* ' */
@@ -335,7 +403,11 @@ extern "C" {
#define GLFW_KEY_RALT GLFW_KEY_RIGHT_ALT
#define GLFW_KEY_RSUPER GLFW_KEY_RIGHT_SUPER
-/* Mouse button definitions */
+/*! @} */
+
+/*! @defgroup buttons Mouse buttons
+ * @ingroup input
+ * @{ */
#define GLFW_MOUSE_BUTTON_1 0
#define GLFW_MOUSE_BUTTON_2 1
#define GLFW_MOUSE_BUTTON_3 2
@@ -345,13 +417,14 @@ extern "C" {
#define GLFW_MOUSE_BUTTON_7 6
#define GLFW_MOUSE_BUTTON_8 7
#define GLFW_MOUSE_BUTTON_LAST GLFW_MOUSE_BUTTON_8
-
-/* Mouse button aliases */
#define GLFW_MOUSE_BUTTON_LEFT GLFW_MOUSE_BUTTON_1
#define GLFW_MOUSE_BUTTON_RIGHT GLFW_MOUSE_BUTTON_2
#define GLFW_MOUSE_BUTTON_MIDDLE GLFW_MOUSE_BUTTON_3
+/*! @} */
-/* Joystick identifiers */
+/*! @defgroup joysticks Joysticks
+ * @ingroup input
+ * @{ */
#define GLFW_JOYSTICK_1 0
#define GLFW_JOYSTICK_2 1
#define GLFW_JOYSTICK_3 2
@@ -369,40 +442,88 @@ extern "C" {
#define GLFW_JOYSTICK_15 14
#define GLFW_JOYSTICK_16 15
#define GLFW_JOYSTICK_LAST GLFW_JOYSTICK_16
+/*! @} */
/*************************************************************************
* Other definitions
*************************************************************************/
-/* glfwCreateWindow modes */
+/*! @brief A regular, overlapped window.
+ * @ingroup window
+ */
#define GLFW_WINDOWED 0x00010001
+/*! @brief A fullscreen window that may changed the monitor's resolution.
+ * @ingroup window
+ */
#define GLFW_FULLSCREEN 0x00010002
-/* glfwGetWindowParam tokens */
-#define GLFW_ACTIVE 0x00020001
+/*! @defgroup paramhints Window parameters and hints
+ * @ingroup window
+ * @{ */
+
+/*! @brief @c GL_TRUE if the window has focus, or @c GL_FALSE otherwise.
+ */
+#define GLFW_FOCUSED 0x00020001
+/*! @brief @c GL_TRUE if the window is iconified, or @c GL_FALSE otherwise.
+ */
#define GLFW_ICONIFIED 0x00020002
+/*! @brief @c GL_TRUE if the window has been requested to close, or @c GL_FALSE
+ * otherwise.
+ */
#define GLFW_CLOSE_REQUESTED 0x00020003
+/*! @brief The OpenGL API version revision.
+ */
#define GLFW_OPENGL_REVISION 0x00020004
-/* glfwWindowHint tokens */
+/*! @brief The bit depth of the red component of the color buffer.
+ */
#define GLFW_RED_BITS 0x00021000
+/*! @brief The bit depth of the green component of the color buffer.
+ */
#define GLFW_GREEN_BITS 0x00021001
+/*! @brief The bit depth of the blue component of the color buffer.
+ */
#define GLFW_BLUE_BITS 0x00021002
+/*! @brief The bit depth of the alpha component of the color buffer.
+ */
#define GLFW_ALPHA_BITS 0x00021003
+/*! @brief The bit depth of the depth buffer of the default framebuffer.
+ */
#define GLFW_DEPTH_BITS 0x00021004
+/*! @brief The bit depth of the stencil buffer of the default framebuffer.
+ */
#define GLFW_STENCIL_BITS 0x00021005
+/*! @brief The monitor refresh rate.
+ */
#define GLFW_REFRESH_RATE 0x00021006
+/*! @brief The bit depth of the red component of the accumulation buffer.
+ */
#define GLFW_ACCUM_RED_BITS 0x00021007
+/*! @brief The bit depth of the red component of the accumulation buffer.
+ */
#define GLFW_ACCUM_GREEN_BITS 0x00021008
+/*! @brief The bit depth of the red component of the accumulation buffer.
+ */
#define GLFW_ACCUM_BLUE_BITS 0x00021009
+/*! @brief The bit depth of the red component of the accumulation buffer.
+ */
#define GLFW_ACCUM_ALPHA_BITS 0x0002100A
+/*! @brief The number of auxiliary buffers.
+ */
#define GLFW_AUX_BUFFERS 0x0002100B
+/*! @brief @c GL_TRUE for stereo rendering, or @c GL_FALSE otherwise.
+ */
#define GLFW_STEREO 0x0002100C
+/*! @brief The number of samples used for default framebuffer multisampling.
+ */
#define GLFW_FSAA_SAMPLES 0x0002100E
+/*! @brief @c GL_TRUE if the framebuffer should be sRGB capable, or @c GL_FALSE
+ * otherwise.
+ */
+#define GLFW_SRGB_CAPABLE 0x0002100F
-/* The following constants are used with both glfwGetWindowParam
- * and glfwWindowHint
+/*! @brief The @link clients client API @endlink to create a context for.
*/
#define GLFW_CLIENT_API 0x00022000
#define GLFW_OPENGL_VERSION_MAJOR 0x00022001
@@ -411,81 +532,284 @@ extern "C" {
#define GLFW_OPENGL_DEBUG_CONTEXT 0x00022004
#define GLFW_OPENGL_PROFILE 0x00022005
#define GLFW_OPENGL_ROBUSTNESS 0x00022006
+/*! @brief @c GL_TRUE if the window is resizable, or @c GL_FALSE otherwise.
+ */
#define GLFW_RESIZABLE 0x00022007
+/*! @brief @c GL_TRUE if the window is visible, or @c GL_FALSE otherwise.
+ */
#define GLFW_VISIBLE 0x00022008
+/*! @brief The x-coordinate, in pixels, of the upper-left corner of the
+ * client area of the window.
+ */
+#define GLFW_POSITION_X 0x00022009
+/*! @brief The y-coordinate, in pixels, of the upper-left corner of the
+ * client area of the window.
+ */
+#define GLFW_POSITION_Y 0x0002200A
-/* GLFW_CLIENT_API tokens */
+/*! @} */
+
+/*! @name Client APIs
+ * @{ */
+/*! @brief The OpenGL API.
+ * @ingroup opengl
+ */
#define GLFW_OPENGL_API 0x00000001
+/*! @brief The OpenGL ES API.
+ * @ingroup opengl
+ */
#define GLFW_OPENGL_ES_API 0x00000002
+/*! @} */
-/* GLFW_OPENGL_ROBUSTNESS mode tokens */
+/*! @name OpenGL robustness strategies
+ * @{ */
+/*! @brief No robustness strategy is used.
+ *
+ * This is the default.
+ * @ingroup opengl
+ */
#define GLFW_OPENGL_NO_ROBUSTNESS 0x00000000
+/*! @brief
+ * @ingroup opengl
+ */
#define GLFW_OPENGL_NO_RESET_NOTIFICATION 0x00000001
+/*! @brief
+ * @ingroup opengl
+ */
#define GLFW_OPENGL_LOSE_CONTEXT_ON_RESET 0x00000002
+/*! @} */
-/* GLFW_OPENGL_PROFILE bit tokens */
+/*! @name OpenGL profiles
+ * @{ */
+/*! @brief No OpenGL profile.
+ * @ingroup opengl
+ */
#define GLFW_OPENGL_NO_PROFILE 0x00000000
+/*! @brief The OpenGL core profile.
+ * @ingroup opengl
+ */
#define GLFW_OPENGL_CORE_PROFILE 0x00000001
+/*! @brief The OpenGL compatibility profile.
+ * @ingroup opengl
+ */
#define GLFW_OPENGL_COMPAT_PROFILE 0x00000002
+/*! @} */
-/* glfwGetInputMode/glfwSetInputMode tokens */
+/*! @name Input modes
+ * @{ */
+/*! @brief The behaviour of the cursor.
+ * @ingroup input
+ */
#define GLFW_CURSOR_MODE 0x00030001
+/*! @brief Whether the @ref glfwGetKey function uses sticky state.
+ * @ingroup input
+ */
#define GLFW_STICKY_KEYS 0x00030002
+/*! @brief Whether the @ref glfwGetMouseButton function uses sticky state.
+ * @ingroup input
+ */
#define GLFW_STICKY_MOUSE_BUTTONS 0x00030003
-#define GLFW_SYSTEM_KEYS 0x00030004
-#define GLFW_KEY_REPEAT 0x00030005
+/*! @} */
-/* GLFW_CURSOR_MODE values */
+/*! @name Cursor modes
+ * @{ */
+/*! @brief The cursor is visible and behaves normally.
+ * @ingroup input
+ */
#define GLFW_CURSOR_NORMAL 0x00040001
+/*! @brief The cursor is hidden when over the client area of the window.
+ * @ingroup input
+ */
#define GLFW_CURSOR_HIDDEN 0x00040002
+/*! @brief The cursor is disabled and cursor movement is unbounded.
+ * @ingroup input
+ */
#define GLFW_CURSOR_CAPTURED 0x00040003
+/*! @} */
-/* glfwGetJoystickParam tokens */
+/*! @name Joystick parameters
+ * @{ */
+/*! @brief @c GL_TRUE if the joystick is present, or @c GL_FALSE otherwise.
+ * @ingroup input
+ */
#define GLFW_PRESENT 0x00050001
+/*! @brief The number of axes on the specified joystick, or zero if the joystick
+ * is not present.
+ * @ingroup input
+ */
#define GLFW_AXES 0x00050002
+/*! @brief The number of buttons on the specified joystick, or zero if the
+ * joystick is not present.
+ * @ingroup input
+ */
#define GLFW_BUTTONS 0x00050003
+/*! @} */
-/* glfwGetError/glfwErrorString tokens */
+/*! @defgroup errors Error codes
+ * @ingroup error
+ * @{ */
+/*! @brief No error has occurred.
+ */
#define GLFW_NO_ERROR 0
+/*! @brief GLFW has not been initialized.
+ */
#define GLFW_NOT_INITIALIZED 0x00070001
+/*! @brief No context is current for this thread.
+ */
#define GLFW_NO_CURRENT_CONTEXT 0x00070002
+/*! @brief One of the enum parameters for the function was given an invalid
+ * enum.
+ */
#define GLFW_INVALID_ENUM 0x00070003
+/*! @brief One of the parameters for the function was given an invalid value.
+ */
#define GLFW_INVALID_VALUE 0x00070004
+/*! @brief A memory allocation failed.
+ */
#define GLFW_OUT_OF_MEMORY 0x00070005
-#define GLFW_OPENGL_UNAVAILABLE 0x00070006
+/*! @brief GLFW could not find support for the requested client API on the
+ * system.
+ */
+#define GLFW_API_UNAVAILABLE 0x00070006
+/*! @brief The requested OpenGL or GLES version is not available.
+ */
#define GLFW_VERSION_UNAVAILABLE 0x00070007
+/*! @brief A platform-specific error occurred that does not match any of the
+ * more specific categories.
+ */
#define GLFW_PLATFORM_ERROR 0x00070008
-#define GLFW_WINDOW_NOT_ACTIVE 0x00070009
-#define GLFW_FORMAT_UNAVAILABLE 0x0007000A
+/*! @brief The clipboard did not contain data in the requested format.
+ */
+#define GLFW_FORMAT_UNAVAILABLE 0x00070009
+/*! @} */
-/* Gamma ramps */
+/*! @brief The number of entries in the gamma ramp.
+ * @ingroup gamma
+ */
#define GLFW_GAMMA_RAMP_SIZE 256
+
/*************************************************************************
* Typedefs
*************************************************************************/
-/* OpenGL function pointer type */
+/*! @brief OpenGL function pointer type.
+ * @ingroup opengl
+ */
typedef void (*GLFWglproc)(void);
-/* Window handle type */
+/*! @brief Window handle type.
+ * @ingroup window
+ */
typedef void* GLFWwindow;
-/* Function pointer types */
+/*! @brief The function signature for error callbacks.
+ * @param[in] error An @link errors error code @endlink.
+ * @param[in] description A UTF-8 encoded string describing the error.
+ * @ingroup error
+ */
typedef void (* GLFWerrorfun)(int,const char*);
+
+/*! @brief The function signature for window position callbacks.
+ * @param[in] window The window that the user moved.
+ * @param[in] x The new x-coordinate, in pixels, of the upper-left corner of
+ * the client area of the window.
+ * @param[in] y The new y-coordinate, in pixels, of the upper-left corner of
+ * the client area of the window.
+ * @ingroup window
+ */
+typedef void (* GLFWwindowposfun)(GLFWwindow,int,int);
+
+/*! @brief The function signature for window resize callbacks.
+ * @param[in] window The window that the user resized.
+ * @param[in] width The new width, in pixels, of the window.
+ * @param[in] height The new height, in pixels, of the window.
+ * @ingroup window
+ */
typedef void (* GLFWwindowsizefun)(GLFWwindow,int,int);
-typedef int (* GLFWwindowclosefun)(GLFWwindow);
+
+/*! @brief The function signature for window close callbacks.
+ * @param[in] window The window that the user attempted to close.
+ * @return @c GL_TRUE to allow the window to be closed, or @c GL_FALSE to
+ * ignore the attempt.
+ * @ingroup window
+ */
+typedef int (* GLFWwindowclosefun)(GLFWwindow);
+
+/*! @brief The function signature for window content refresh callbacks.
+ * @param[in] window The window whose content needs to be refreshed.
+ * @ingroup window
+ */
typedef void (* GLFWwindowrefreshfun)(GLFWwindow);
+
+/*! @brief The function signature for window focus/defocus callbacks.
+ * @param[in] window The window that was focused or defocused.
+ * @param[in] focused @c GL_TRUE if the window was focused, or @c GL_FALSE if
+ * it was defocused.
+ * @ingroup window
+ */
typedef void (* GLFWwindowfocusfun)(GLFWwindow,int);
+
+/*! @brief The function signature for window iconify/restore callbacks.
+ * @param[in] window The window that was iconified or restored.
+ * @param[in] iconified @c GL_TRUE if the window was iconified, or @c GL_FALSE
+ * if it was restored.
+ * @ingroup window
+ */
typedef void (* GLFWwindowiconifyfun)(GLFWwindow,int);
+
+/*! @brief The function signature for mouse button callbacks.
+ * @param[in] window The window that received the event.
+ * @param[in] button The @link buttons mouse button @endlink that was pressed
+ * or released.
+ * @param[in] action @ref GLFW_PRESS or @ref GLFW_RELEASE.
+ * @ingroup input
+ */
typedef void (* GLFWmousebuttonfun)(GLFWwindow,int,int);
+
+/*! @brief The function signature for cursor position callbacks.
+ * @param[in] window The window that received the event.
+ * @param[in] x The new x-coordinate of the cursor.
+ * @param[in] y The new y-coordinate of the cursor.
+ * @ingroup input
+ */
typedef void (* GLFWcursorposfun)(GLFWwindow,int,int);
+
+/*! @brief The function signature for cursor enter/exit callbacks.
+ * @param[in] window The window that received the event.
+ * @param[in] entered @c GL_TRUE if the cursor entered the window's client
+ * area, or @c GL_FALSE if it left it.
+ * @ingroup input
+ */
typedef void (* GLFWcursorenterfun)(GLFWwindow,int);
+
+/*! @brief The function signature for scroll callbacks.
+ * @param[in] window The window that received the event.
+ * @param[in] x The scroll offset along the x-axis.
+ * @param[in] y The scroll offset along the y-axis.
+ * @ingroup input
+ */
typedef void (* GLFWscrollfun)(GLFWwindow,double,double);
+
+/*! @brief The function signature for keyboard key callbacks.
+ * @param[in] window The window that received the event.
+ * @param[in] key The @link keys keyboard key @endlink that was pressed or
+ * released.
+ * @param[in] action @ref GLFW_PRESS or @ref GLFW_RELEASE.
+ * @ingroup input
+ */
typedef void (* GLFWkeyfun)(GLFWwindow,int,int);
+
+/*! @brief The function signature for Unicode character callbacks.
+ * @param[in] window The window that received the event.
+ * @param[in] character The Unicode code point of the character.
+ * @ingroup input
+ */
typedef void (* GLFWcharfun)(GLFWwindow,int);
-/* The video mode structure used by glfwGetVideoModes */
+/* @brief Video mode type.
+ * @ingroup monitor
+ */
typedef struct
{
int width;
@@ -495,7 +819,9 @@ typedef struct
int greenBits;
} GLFWvidmode;
-/* Gamma ramp */
+/*! @brief Gamma ramp.
+ * @ingroup gamma
+ */
typedef struct
{
unsigned short red[GLFW_GAMMA_RAMP_SIZE];
@@ -508,90 +834,822 @@ typedef struct
* Prototypes
*************************************************************************/
-/* Initialization, termination and version querying */
-GLFWAPI int glfwInit(void);
+/*! @brief Initializes the GLFW library.
+ *
+ * Before most GLFW functions can be used, GLFW must be initialized, and before
+ * a program terminates GLFW should be terminated in order to free allocated
+ * resources, memory, etc.
+ *
+ * @return @c GL_TRUE if successful, or @c GL_FALSE if an error occurred.
+ * @ingroup init
+ *
+ * @remarks Additional calls to this function after successful initialization
+ * but before termination will succeed but will do nothing.
+ *
+ * @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 On Mac OS X, this function will change the current directory of the
+ * application to the @c Contents/Resources subdirectory of the application's
+ * bundle, if present.
+ *
+ * @sa glfwTerminate
+ */
+GLFWAPI int glfwInit(void);
+
+/*! @brief Terminates the GLFW library.
+ * @ingroup init
+ *
+ * @remarks This function may be called before @ref glfwInit.
+ *
+ * @note This function may only be called from the main thread.
+ *
+ * @note This function closes all GLFW windows.
+ *
+ * @note This function should be called before the program exits.
+ *
+ * @warning No window's context may be current on another thread when this
+ * function is called.
+ *
+ * @sa glfwInit
+ */
GLFWAPI void glfwTerminate(void);
+
+/*! @brief Retrieves the version of the GLFW library.
+ * @param[out] major Where to store the major version number, or @c NULL.
+ * @param[out] minor Where to store the minor version number, or @c NULL.
+ * @param[out] rev Where to store the revision number, or @c NULL.
+ * @ingroup init
+ *
+ * @remarks This function may be called before @ref glfwInit.
+ *
+ * @remarks This function may be called from secondary threads.
+ *
+ * @sa glfwGetVersionString
+ */
GLFWAPI void glfwGetVersion(int* major, int* minor, int* rev);
+
+/*! @brief Returns the version string of the GLFW library.
+ *
+ * The version string contains information about what compile-time options were
+ * enabled when the library was built.
+ *
+ * @return The GLFW version string.
+ * @ingroup init
+ *
+ * @remarks This function may be called before @ref glfwInit.
+ *
+ * @remarks This function may be called from secondary threads.
+ *
+ * @sa glfwGetVersion
+ */
GLFWAPI const char* glfwGetVersionString(void);
-/* Error handling */
+/*! @brief Retrieves the latest error.
+ * @return The latest @link errors error code @endlink.
+ * @ingroup error
+ *
+ * @remarks This function may be called before @ref glfwInit.
+ */
GLFWAPI int glfwGetError(void);
+
+/*! @brief Retrieves a generic, human readable description of the specified error.
+ * @param[in] error The @link errors error code @endlink to be described.
+ * @return A UTF-8 encoded string describing the error.
+ * @ingroup error
+ *
+ * @remarks This function may be called before @ref glfwInit.
+ *
+ * @remarks This function may be called from secondary threads.
+ */
GLFWAPI const char* glfwErrorString(int error);
+
+/*! @brief Sets the error callback.
+ * @param[in] cbfun The new callback, or @c NULL to remove the currently set
+ * callback.
+ * @ingroup error
+ *
+ * @remarks This function may be called before @ref glfwInit.
+ *
+ * @remarks The error callback is the preferred error retrieval mechanism, as
+ * it may be provided with a more specific error description than the generic
+ * one returned by @ref glfwErrorString.
+ *
+ * @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.
+ */
GLFWAPI void glfwSetErrorCallback(GLFWerrorfun cbfun);
-/* Video mode functions */
+/*! @brief This function will be replaced when the @c multi-monitor branch is
+ * merged.
+ * @ingroup monitor
+ */
GLFWAPI GLFWvidmode* glfwGetVideoModes(int* count);
+
+/*! @brief This function will be replaced when the @c multi-monitor branch is
+ * merged.
+ * @ingroup monitor
+ */
GLFWAPI void glfwGetDesktopMode(GLFWvidmode* mode);
-/* Gamma ramp functions */
+/*! @brief Sets the system gamma ramp to one generated from the specified
+ * exponent.
+ * @param[in] gamma The desired exponent.
+ * @ingroup gamma
+ */
GLFWAPI void glfwSetGamma(float gamma);
+
+/*! @brief Retrieves the current system gamma ramp.
+ * @param[out] ramp Where to store the gamma ramp.
+ * @ingroup gamma
+ */
GLFWAPI void glfwGetGammaRamp(GLFWgammaramp* ramp);
+
+/*! @brief Sets the system gamma ramp to the one specified.
+ * @param[in] ramp The gamma ramp to use.
+ * @ingroup gamma
+ */
GLFWAPI void glfwSetGammaRamp(const GLFWgammaramp* ramp);
-/* Window handling */
+/*! @brief Resets all window hints to their default values
+ *
+ * The @ref GLFW_RED_BITS, @ref GLFW_GREEN_BITS, @ref GLFW_BLUE_BITS, @ref
+ * GLFW_ALPHA_BITS and @ref GLFW_STENCIL_BITS hints are set to 8.
+ *
+ * The @ref GLFW_DEPTH_BITS hint is set to 24.
+ *
+ * The @ref GLFW_VISIBLE and @ref GLFW_RESIZABLE hints are set to 1.
+ *
+ * The @ref GLFW_CLIENT_API hint is set to @ref GLFW_OPENGL_API.
+ *
+ * The @ref GLFW_OPENGL_VERSION_MAJOR and @ref GLFW_OPENGL_VERSION_MINOR hints
+ * are set to 1 and 0, respectively.
+ *
+ * All other hints are set to 0.
+ *
+ * @ingroup window
+ *
+ * @note This function may only be called from the main thread.
+ *
+ * @sa glfwWindowHint
+ */
GLFWAPI void glfwDefaultWindowHints(void);
+
+/*! @brief Sets the specified window hint to the desired value.
+ * @param[in] target The window hint to set.
+ * @param[in] target The new value of the window hint.
+ * @ingroup window
+ *
+ * The @ref GLFW_RED_BITS, @ref GLFW_GREEN_BITS, @ref GLFW_BLUE_BITS, @ref
+ * GLFW_ALPHA_BITS, @ref GLFW_DEPTH_BITS and @ref GLFW_STENCIL_BITS hints
+ * specify the desired bit depths of the various components of the default
+ * framebuffer.
+ *
+ * The @ref GLFW_REFRESH_RATE hint specifies the desired monitor refresh rate
+ * for fullscreen windows.
+ *
+ * The @ref GLFW_ACCUM_RED_BITS, @ref GLFW_ACCUM_GREEN_BITS, @ref
+ * GLFW_ACCUM_BLUE_BITS and @ref GLFW_ACCUM_ALPHA_BITS hints specify the
+ * desired bit depths of the various components of the accumulation buffer.
+ *
+ * The @ref GLFW_AUX_BUFFERS hint specifies the desired number of auxiliary
+ * buffers.
+ *
+ * The @ref GLFW_STEREO hint specifies whether to use stereoscopic rendering.
+ *
+ * The @ref GLFW_FSAA_SAMPLES hint specifies the desired number of samples to
+ * use for multisampling.
+ *
+ * The @ref GLFW_SRGB_CAPABLE hint specifies whether the framebuffer should be
+ * sRGB capable.
+ *
+ * The @ref GLFW_CLIENT_API hint specifies which client API to create the
+ * context for. Possible values are @ref GLFW_OPENGL_API and @ref
+ * GLFW_OPENGL_ES_API.
+ *
+ * The @ref GLFW_OPENGL_VERSION_MAJOR and @ref GLFW_OPENGL_VERSION_MINOR hints
+ * specify the OpenGL version that the created context must be compatible with.
+ *
+ * These hints are @em not hard constraints, as they don't have to match
+ * exactly, but @ref glfwCreateWindow will still fail if the resulting OpenGL
+ * version is less than the one requested with hints. It is therefore
+ * perfectly safe to use the default of version 1.0 for legacy code and you
+ * will still get backwards-compatible contexts of version 3.0 and above when
+ * available.
+ *
+ * The @ref GLFW_OPENGL_FORWARD_COMPAT hint specifies whether the OpenGL
+ * context should be forward-compatible.
+ *
+ * The @ref GLFW_OPENGL_DEBUG_CONTEXT hint specifies whether to create a debug
+ * OpenGL context.
+ *
+ * The @ref GLFW_OPENGL_PROFILE hint specifies which OpenGL profile to create
+ * the context for. Possible values are @ref GLFW_OPENGL_NO_PROFILE, @ref
+ * GLFW_OPENGL_CORE_PROFILE and @ref GLFW_OPENGL_COMPAT_PROFILE.
+ *
+ * The @ref GLFW_OPENGL_ROBUSTNESS hint specifies the robustness strategy to be
+ * used by the OpenGL context.
+ *
+ * The @ref GLFW_RESIZABLE hint specifies whether the window will be resizable
+ * by the user. The window will still be resizable using the @ref
+ * glfwSetWindowSize function. This hint is ignored for fullscreen windows.
+ *
+ * The @ref GLFW_VISIBLE hint specifies whether the window will be initially
+ * visible. This hint is ignored for fullscreen windows.
+ *
+ * The @ref GLFW_POSITION_X and @ref GLFW_POSITION_Y hints specify the initial
+ * position of the window. These hints are ignored for fullscreen windows.
+ *
+ * Some window hints are hard constraints. These must match the available
+ * capabilities @em exactly for window and context creation to succeed. Hints
+ * that are not hard constraints are matched as closely as possible, but the
+ * resulting window and context may differ from what these hints requested. To
+ * find out the actual properties of the created window and context, use the
+ * @ref glfwGetWindowParam function.
+ *
+ * The following window hints are hard constraints:
+ * @arg @ref GLFW_STEREO
+ * @arg @ref GLFW_CLIENT_API
+ * @arg @ref GLFW_OPENGL_FORWARD_COMPAT
+ * @arg @ref GLFW_OPENGL_PROFILE
+ *
+ * @note This function may only be called from the main thread.
+ *
+ * @sa glfwDefaultWindowHints
+ */
GLFWAPI void glfwWindowHint(int target, int hint);
+
+/*! @brief Creates a window and its associated context.
+ *
+ * @param[in] width The desired width, in pixels, of the window. This must be
+ * greater than zero.
+ * @param[in] height The desired height, in pixels, of the window. This must
+ * be greater than zero.
+ * @param[in] mode One of @ref GLFW_WINDOWED or @ref GLFW_FULLSCREEN.
+ * @param[in] title The initial, UTF-8 encoded window title.
+ * @param[in] share The window whose context to share resources with, or @c
+ * NULL to not share resources.
+ * @return The handle of the created window, or @c NULL if an error occurred.
+ * @ingroup window
+ *
+ * @remarks Most of the options for how the window and its context should be
+ * created are specified via the @ref glfwWindowHint function.
+ *
+ * @remarks This function does not change which context is current. Before you
+ * can use the newly created context, you need to make it current using @ref
+ * glfwMakeContextCurrent.
+ *
+ * @remarks For fullscreen windows the initial cursor mode is @ref
+ * GLFW_CURSOR_CAPTURED and the screensaver is prohibited from starting. For
+ * regular windows the initial cursor mode is @ref GLFW_CURSOR_NORMAL and the
+ * screensaver is allowed to start.
+ *
+ * @remarks In order to determine the actual properties of an opened window,
+ * use @ref glfwGetWindowParam and @ref glfwGetWindowSize.
+ *
+ * @remarks On Microsoft Windows, if the executable has an icon resource named
+ * @c GLFW_ICON, it will be set as the icon for the window. If no such icon is
+ * present, the @c IDI_WINLOGO icon will be used instead.
+ *
+ * @remarks On Mac OS X the GLFW window has no icon, but programs using GLFW
+ * will use 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.
+ *
+ * @note This function may only be called from the main thread.
+ *
+ * @sa glfwDestroyWindow
+ */
GLFWAPI GLFWwindow glfwCreateWindow(int width, int height, int mode, const char* title, GLFWwindow share);
+
+/*! @brief Destroys the specified window and its context.
+ * @param[in] window The window to destroy.
+ * @ingroup window
+ *
+ * @note This function may only be called from the main thread.
+ *
+ * @note If the window's context 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.
+ *
+ * @sa glfwCreateWindow
+ */
GLFWAPI void glfwDestroyWindow(GLFWwindow window);
+
+/*! @brief Sets the title of the specified window.
+ * @param[in] window The window whose title to change.
+ * @param[in] title The UTF-8 encoded window title.
+ * @ingroup window
+ *
+ * @note This function may only be called from the main thread.
+ */
GLFWAPI void glfwSetWindowTitle(GLFWwindow window, const char* title);
+
+/*! @brief Retrieves the size of the client area of the specified window.
+ * @param[in] window The window whose size to retrieve.
+ * @param[out] width The width of the client area.
+ * @param[out] height The height of the client area.
+ * @ingroup window
+ *
+ * @sa glfwSetWindowSize
+ */
GLFWAPI void glfwGetWindowSize(GLFWwindow window, int* width, int* height);
+
+/*! @brief Sets the size of the client area of the specified window.
+ * @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.
+ * @ingroup 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.
+ *
+ * @note For fullscreen windows, this function selects and switches to the
+ * resolution closest to the specified size, without destroying the window's
+ * context.
+ *
+ * @sa glfwGetWindowSize
+ */
GLFWAPI void glfwSetWindowSize(GLFWwindow window, int width, int height);
-GLFWAPI void glfwGetWindowPos(GLFWwindow window, int* xpos, int* ypos);
-GLFWAPI void glfwSetWindowPos(GLFWwindow window, int xpos, int ypos);
+
+/*! @brief Iconifies the specified window.
+ * @param[in] window The window to iconify.
+ * @ingroup window
+ *
+ * @remarks If the window is already iconified, this function does nothing.
+ *
+ * @note This function may only be called from the main thread.
+ *
+ * @sa glfwRestoreWindow
+ */
GLFWAPI void glfwIconifyWindow(GLFWwindow window);
+
+/*! @brief Restores the specified window.
+ * @param[in] window The window to restore.
+ * @ingroup window
+ *
+ * @remarks If the window is already restored, this function does nothing.
+ *
+ * @note This function may only be called from the main thread.
+ *
+ * @sa glfwIconifyWindow
+ */
GLFWAPI void glfwRestoreWindow(GLFWwindow window);
+
+/*! @brief Makes the specified window visible.
+ * @param[in] window The window to make visible.
+ * @ingroup window
+ *
+ * @remarks If the window is already visible or is in fullscreen mode, this
+ * function does nothing.
+ *
+ * @note This function may only be called from the main thread.
+ *
+ * @sa glfwHideWindow
+ */
GLFWAPI void glfwShowWindow(GLFWwindow window);
+
+/*! @brief Hides the specified window.
+ * @param[in] window The window to hide.
+ * @ingroup window
+ *
+ * @remarks If the window is already hidden or is in fullscreen mode, this
+ * function does nothing.
+ *
+ * @note This function may only be called from the main thread.
+ *
+ * @sa glfwShowWindow
+ */
GLFWAPI void glfwHideWindow(GLFWwindow window);
-GLFWAPI int glfwGetWindowParam(GLFWwindow window, int param);
+
+/*! @brief Returns a property of the specified window.
+ * @param[in] window The window to query.
+ * @param[in] param The property whose value to return.
+ * @ingroup window
+ *
+ * The @ref GLFW_FOCUSED property indicates whether the window is focused.
+ *
+ * The @ref GLFW_ICONIFIED property indicates whether the window is iconified.
+ *
+ * The @ref GLFW_VISIBLE property indicates whether the window is visible.
+ *
+ * The @ref GLFW_RESIZABLE property indicates whether the window is resizable
+ * by the user.
+ *
+ * The @ref GLFW_CLOSE_REQUESTED property indicates whether the window has been
+ * requested by the user to close.
+ *
+ * The @ref GLFW_REFRESH_RATE property will be replaced when the @c
+ * multi-monitor branch is merged.
+ *
+ * The @ref GLFW_POSITION_X and @ref GLFW_POSITION_Y properties indicate the
+ * screen position, in pixels, of the upper-left corner of the window's client
+ * area.
+ *
+ * The @ref GLFW_CLIENT_API property indicates the client API provided by the
+ * window's context.
+ *
+ * The @ref GLFW_OPENGL_VERSION_MAJOR, @ref GLFW_OPENGL_VERSION_MINOR and @ref
+ * GLFW_OPENGL_REVISION properties indicate the API version of the window's
+ * context.
+ *
+ * The @ref GLFW_OPENGL_FORWARD_COMPAT property indicates whether an OpenGL
+ * context is forward-compatible.
+ *
+ * The @ref GLFW_OPENGL_DEBUG_CONTEXT property indicates whether the
+ * corresponding window hint was used when the window was created.
+ *
+ * The @ref GLFW_OPENGL_PROFILE property indicates the profile used by the
+ * OpenGL context, or @ref GLFW_OPENGL_NO_PROFILE if the context is for another
+ * client API than OpenGL.
+ *
+ * The @ref GLFW_OPENGL_ROBUSTNESS property indicates the robustness strategy
+ * used by the OpenGL context, or @ref GLFW_OPENGL_NO_ROBUSTNESS if robustness
+ * is not used.
+ */
+GLFWAPI int glfwGetWindowParam(GLFWwindow window, int param);
+
+/*! @brief Sets the user pointer of the specified window.
+ * @param[in] window The window whose pointer to set.
+ * @param[in] pointer The new value.
+ * @ingroup window
+ *
+ * @sa glfwGetWindowUserPointer
+ */
GLFWAPI void glfwSetWindowUserPointer(GLFWwindow window, void* pointer);
+
+/*! @brief Returns the user pointer of the specified window.
+ * @param[in] window The window whose pointer to return.
+ * @ingroup window
+ *
+ * @sa glfwSetWindowUserPointer
+ */
GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow window);
+
+/*! @brief Sets the position callback for the specified window.
+ * @param[in] window The window whose callback to set.
+ * @param[in] cbfun The new callback, or @c NULL to remove the currently set
+ * callback.
+ * @ingroup window
+ */
+GLFWAPI void glfwSetWindowPosCallback(GLFWwindow window, GLFWwindowposfun cbfun);
+
+/*! @brief Sets the size callback for the specified window.
+ * @param[in] window The window whose callback to set.
+ * @param[in] cbfun The new callback, or @c NULL to remove the currently set
+ * callback.
+ * @ingroup window
+ *
+ * This callback is called when the window is resized.
+ */
GLFWAPI void glfwSetWindowSizeCallback(GLFWwindow window, GLFWwindowsizefun cbfun);
+
+/*! @brief Sets the close callback for the specified window.
+ * @param[in] window The window whose callback to set.
+ * @param[in] cbfun The new callback, or @c NULL to remove the currently set
+ * callback.
+ * @ingroup window
+ *
+ * This callback is called when the user attempts to close the window, i.e.
+ * clicks the window's close widget or, on Mac OS X, selects @b Quit from the
+ * application menu. Calling @ref glfwDestroyWindow does not cause this
+ * callback to be called.
+ *
+ * The return value of the close callback becomes the new value of the @ref
+ * GLFW_CLOSE_REQUESTED window parameter.
+ */
GLFWAPI void glfwSetWindowCloseCallback(GLFWwindow window, GLFWwindowclosefun cbfun);
+
+/*! @brief Sets the refresh callback for the specified window.
+ * @param[in] window The window whose callback to set.
+ * @param[in] cbfun The new callback, or @c NULL to remove the currently set
+ * callback.
+ * @ingroup window
+ *
+ * This callback is called when the client area of the window needs to be
+ * redrawn, for example if the window has been exposed after having been
+ * covered by another window.
+ *
+ * @note On compositing window systems such as Mac OS X, where the window
+ * contents are saved off-screen, this callback may never be called.
+ */
GLFWAPI void glfwSetWindowRefreshCallback(GLFWwindow window, GLFWwindowrefreshfun cbfun);
+
+/*! @brief Sets the focus callback for the specified window.
+ * @param[in] window The window whose callback to set.
+ * @param[in] cbfun The new callback, or @c NULL to remove the currently set
+ * callback.
+ * @ingroup window
+ *
+ * This callback is called when the window gains or loses focus.
+ */
GLFWAPI void glfwSetWindowFocusCallback(GLFWwindow window, GLFWwindowfocusfun cbfun);
+
+/*! @brief Sets the iconify callback for the specified window.
+ * @param[in] window The window whose callback to set.
+ * @param[in] cbfun The new callback, or @c NULL to remove the currently set
+ * callback.
+ * @ingroup window
+ *
+ * This callback is called when the window is iconified or restored.
+ */
GLFWAPI void glfwSetWindowIconifyCallback(GLFWwindow window, GLFWwindowiconifyfun cbfun);
-/* Event handling */
+/*! @brief Processes all pending events.
+ * @ingroup window
+ *
+ * @note This function may only be called from the main thread.
+ *
+ * @sa glfwWaitEvents
+ */
GLFWAPI void glfwPollEvents(void);
+
+/*! @brief Waits until events are pending and processes them.
+ * @ingroup window
+ *
+ * @note This function may only be called from the main thread.
+ *
+ * @sa glfwPollEvents
+ */
GLFWAPI void glfwWaitEvents(void);
-/* Input handling */
-GLFWAPI int glfwGetInputMode(GLFWwindow window, int mode);
+/*! @brief Returns the value of an input option for the specified window.
+ * @param[in] window The window to query.
+ * @param[in] mode One of the following:
+ * @arg @ref GLFW_CURSOR_MODE Sets the cursor mode.
+ * @arg @ref GLFW_STICKY_KEYS Sets whether sticky keys are enabled.
+ * @arg @ref GLFW_STICKY_MOUSE_BUTTONS Sets whether sticky mouse buttons are enabled.
+ * @ingroup input
+ *
+ * @sa glfwSetInputMode
+ */
+GLFWAPI int glfwGetInputMode(GLFWwindow window, int mode);
+
+/*! @brief Sets an input option for the specified window.
+ * @param[in] mode One of the following:
+ * @arg @ref GLFW_CURSOR_MODE Sets the cursor mode.
+ * @arg @ref GLFW_STICKY_KEYS Sets whether sticky keys are enabled.
+ * @arg @ref GLFW_STICKY_MOUSE_BUTTONS Sets whether sticky mouse buttons are enabled.
+ * @ingroup input
+ *
+ * @sa glfwGetInputMode
+ */
GLFWAPI void glfwSetInputMode(GLFWwindow window, int mode, int value);
-GLFWAPI int glfwGetKey(GLFWwindow window, int key);
-GLFWAPI int glfwGetMouseButton(GLFWwindow window, int button);
+
+/*! @brief Returns the last reported state of a keyboard key for the specified
+ * window.
+ * @param[in] window The desired window.
+ * @param[in] key The desired @link keys keyboard key @endlink.
+ * @return @ref GLFW_PRESS or @ref GLFW_RELEASE.
+ * @ingroup input
+ */
+GLFWAPI int glfwGetKey(GLFWwindow window, int key);
+
+/*! @brief Returns the last reported state of a mouse button for the specified
+ * window.
+ * @param[in] window The desired window.
+ * @param[in] key The desired @link buttons mouse buttons @endlink.
+ * @return @ref GLFW_PRESS or @ref GLFW_RELEASE.
+ * @ingroup input
+ */
+GLFWAPI int glfwGetMouseButton(GLFWwindow window, int button);
+
+/*! @brief Retrieves the last reported cursor position, relative to the client
+ * area of the window.
+ * @param[in] window The desired window.
+ * @param[out] xpos The cursor x-coordinate, relative to the left edge of the
+ * client area, or @c NULL.
+ * @param[out] ypos The cursor y-coordinate, relative to the to top edge of the
+ * client area, or @c NULL.
+ * @ingroup input
+ *
+ * @sa glfwSetCursorPos
+ */
GLFWAPI void glfwGetCursorPos(GLFWwindow window, int* xpos, int* ypos);
+
+/*! @brief Sets the position of the cursor, relative to the client area of the window.
+ * @param[in] window The desired window.
+ * @param[in] xpos The desired x-coordinate, relative to the left edge of the
+ * client area, or @c NULL.
+ * @param[in] ypos The desired y-coordinate, relative to the top edge of the
+ * client area, or @c NULL.
+ * @ingroup input
+ *
+ * @note The specified window must be focused.
+ *
+ * @sa glfwGetCursorPos
+ */
GLFWAPI void glfwSetCursorPos(GLFWwindow window, int xpos, int ypos);
+
+/*! @ingroup input
+ */
GLFWAPI void glfwGetScrollOffset(GLFWwindow window, double* xoffset, double* yoffset);
+
+/*! @brief Sets the key callback.
+ * @param[in] cbfun The new key callback, or @c NULL to remove the currently
+ * set callback.
+ * @ingroup input
+ *
+ * @remarks The key callback deals with physical keys, with @link keys tokens
+ * @endlink named after their use on the standard US keyboard layout. If you
+ * want to input text, use the Unicode character callback instead.
+ */
GLFWAPI void glfwSetKeyCallback(GLFWwindow window, GLFWkeyfun cbfun);
+
+/*! @brief Sets the Unicode character callback.
+ * @param[in] cbfun The new Unicode character callback, or @c NULL to remove
+ * the currently set callback.
+ * @ingroup input
+ *
+ * @remarks The Unicode character callback is for text input. If you want to
+ * know whether a specific key was pressed or released, use the key callback.
+ */
GLFWAPI void glfwSetCharCallback(GLFWwindow window, GLFWcharfun cbfun);
+
+/*! @brief Sets the mouse button callback.
+ * @param[in] cbfun The new mouse button callback, or @c NULL to remove the
+ * currently set callback.
+ * @ingroup input
+ */
GLFWAPI void glfwSetMouseButtonCallback(GLFWwindow window, GLFWmousebuttonfun cbfun);
+
+/*! @brief Sets the cursor position callback.
+ * @param[in] cbfun The new cursor position callback, or @c NULL to remove the
+ * currently set callback.
+ * @ingroup input
+ *
+ * @remarks The position is relative to the upper-left corner of the client
+ * area of the window.
+ */
GLFWAPI void glfwSetCursorPosCallback(GLFWwindow window, GLFWcursorposfun cbfun);
+
+/*! @brief Sets the cursor enter/exit callback.
+ * @param[in] cbfun The new cursor enter/exit callback, or @c NULL to remove
+ * the currently set callback.
+ * @ingroup input
+ */
GLFWAPI void glfwSetCursorEnterCallback(GLFWwindow window, GLFWcursorenterfun cbfun);
+
+/*! @brief Sets the scroll callback.
+ * @param[in] cbfun The new scroll callback, or @c NULL to remove the currently
+ * set callback.
+ * @ingroup input
+ *
+ * @note This receives all scrolling input, like that from a mouse wheel or
+ * a touchpad scrolling area.
+ */
GLFWAPI void glfwSetScrollCallback(GLFWwindow window, GLFWscrollfun cbfun);
-/* Joystick input */
+/*! @brief Returns a property of the specified joystick.
+ * @param[in] joy The joystick to query.
+ * @param[in] param The property whose value to return.
+ * @return The specified joystick's current value, or zero if the joystick is
+ * not present.
+ * @ingroup input
+ */
GLFWAPI int glfwGetJoystickParam(int joy, int param);
+
+/*! @brief Returns the values of axes of the specified joystick.
+ * @param[in] joy The joystick to query.
+ * @param[out] axes The array to hold the values.
+ * @param[in] numaxes The size of the provided array.
+ * @return The number of values written to @p axes.
+ * @ingroup input
+ */
GLFWAPI int glfwGetJoystickAxes(int joy, float* axes, int numaxes);
+
+/*! @brief Returns the values of buttons of the specified joystick.
+ * @param[in] joy The joystick to query.
+ * @param[out] buttons The array to hold the values.
+ * @param[in] numbuttons The size of the provided array.
+ * @return The number of values written to @p buttons.
+ * @ingroup input
+ */
GLFWAPI int glfwGetJoystickButtons(int joy, unsigned char* buttons, int numbuttons);
GLFWAPI const char* glfwGetJoystickName(int joy);
-/* Clipboard */
+/*! @brief Sets the clipboard to the specified string.
+ * @param[in] window The window that will own the clipboard contents.
+ * @param[in] string A UTF-8 encoded string.
+ * @ingroup clipboard
+ *
+ * @note This function may only be called from the main thread.
+ *
+ * @sa glfwGetClipboardString
+ */
GLFWAPI void glfwSetClipboardString(GLFWwindow window, const char* string);
+
+/*! @brief Retrieves the contents of the clipboard as a 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 @c NULL
+ * if that format was unavailable.
+ * @ingroup clipboard
+ *
+ * @note This function may only be called from the main thread.
+ *
+ * @note The returned string is valid only until the next call to @ref
+ * glfwGetClipboardString or @ref glfwSetClipboardString.
+ *
+ * @sa glfwSetClipboardString
+ */
GLFWAPI const char* glfwGetClipboardString(GLFWwindow window);
-/* Time */
+/*! @brief Retrieves the current value of the GLFW timer.
+ * @return The current value, in seconds.
+ * @ingroup time
+ *
+ * @remarks This function may be called from secondary threads.
+ *
+ * @remarks Unless the timer has been set using @ref glfwSetTime, the timer
+ * measures time elapsed since GLFW was initialized.
+ *
+ * @note The resolution of the timer is system dependent.
+ */
GLFWAPI double glfwGetTime(void);
-GLFWAPI void glfwSetTime(double time);
-/* OpenGL support */
+/*! @brief Sets the GLFW timer.
+ * @param[in] time The new value, in seconds.
+ * @ingroup time
+ *
+ * @note The resolution of the timer is system dependent.
+ */
+GLFWAPI void glfwSetTime(double time);
+
+/*! @brief Makes the context of the specified window current for this thread.
+ * @param[in] window The window whose context to make current, or @c NULL to
+ * detach the current context.
+ * @ingroup opengl
+ *
+ * @remarks This function may be called from secondary threads.
+ *
+ * @note A context may only be current for a single thread at a time.
+ *
+ * @sa glfwGetCurrentContext
+ */
GLFWAPI void glfwMakeContextCurrent(GLFWwindow window);
+
+/*! @brief Returns the window whose context is current on this thread.
+ * @return The window whose context is current, or @c NULL if no window's
+ * context is current.
+ * @ingroup opengl
+ *
+ * @remarks This function may be called from secondary threads.
+ *
+ * @sa glfwMakeContextCurrent
+ */
GLFWAPI GLFWwindow glfwGetCurrentContext(void);
-GLFWAPI void glfwSwapBuffers(GLFWwindow window);
-GLFWAPI void glfwSwapInterval(int interval);
-GLFWAPI int glfwExtensionSupported(const char* extension);
+
+/*! @brief Swaps the front and back buffers of the specified window.
+ * @param[in] The window whose buffers to swap.
+ * @ingroup opengl
+ *
+ * @remarks This function may be called from secondary threads.
+ *
+ * @sa glfwSwapInterval
+ */
+GLFWAPI void glfwSwapBuffers(GLFWwindow window);
+
+/*! @brief Sets the swap interval for the current context.
+ * @param[in] interval The minimum number of video frame periods to wait for
+ * until the buffers are swapped by @ref glfwSwapBuffers.
+ * @ingroup opengl
+ *
+ * @remarks This function may be called from secondary threads.
+ *
+ * @sa glfwSwapBuffers
+ */
+GLFWAPI void glfwSwapInterval(int interval);
+
+/*! @brief Checks whether the specified extension is available.
+ * @param[in] extension The ASCII encoded name of the extension.
+ * @return @c GL_TRUE if the extension is available, or @c FALSE otherwise.
+ * @ingroup opengl
+ *
+ * @remarks This function may be called from secondary threads.
+ *
+ * @note This function checks not only the client API extension string, but
+ * also any platform-specific context creation API extension strings.
+ */
+GLFWAPI int glfwExtensionSupported(const char* extension);
+
+/*! @brief Returns the address of the specified client API function for the
+ * current context.
+ * @param[in] procname The ASCII encoded name of the function.
+ * @return The address of the function, or @c NULL if the function is
+ * unavailable.
+ * @ingroup opengl
+ *
+ * @remarks This function may be called from secondary threads.
+ */
GLFWAPI GLFWglproc glfwGetProcAddress(const char* procname);
-GLFWAPI void glfwCopyContext(GLFWwindow src, GLFWwindow dst, unsigned long mask);
/*************************************************************************
diff --git a/readme.html b/readme.html
index cf5eb5b8..3ad596c9 100644
--- a/readme.html
+++ b/readme.html
@@ -274,17 +274,18 @@ version of GLFW.
Added glfwSetErrorCallback
function and GLFWerrorfun
type for receiving more specific and/or nested errors
Added glfwSetWindowUserPointer
and glfwGetWindowUserPointer
functions for per-window user pointers
Added glfwGetVersionString
function for determining which code paths were enabled at compile time
- Added glfwGetWindowPos
function for querying the position of the specified window
+ Added glfwSetWindowPosCallback
function and GLFWwindowposfun
type for reciving window position events
Added glfwSetWindowFocusCallback
function and GLFWwindowfocusfun
type for receiving window focus events
Added glfwSetWindowIconifyCallback
function and GLFWwindowiconifyfun
type for receiving window iconification events
Added glfwGetClipboardString
and glfwSetClipboardString
functions for interacting with the system clipboard
Added glfwGetCurrentContext
function for retrieving the window whose OpenGL context is current
- Added glfwCopyContext
function for copying OpenGL state categories between contexts
+ Added GLFW_SRGB_CAPABLE
for requesting sRGB capable framebuffers
Added GLFW_CLIENT_API
, GLFW_OPENGL_API
and GLFW_OPENGL_ES_API
for selecting client API
Added GLFW_OPENGL_ROBUSTNESS
window hint and associated strategy tokens for GL_ARB_robustness
support
Added GLFW_OPENGL_REVISION
window parameter to make up for removal of glfwGetGLVersion
Added GLFW_INCLUDE_GLCOREARB
macro for including glcorearb.h
instead of gl.h
Added GLFW_VISIBLE
window hint and parameter for controlling and polling window visibility
+ Added GLFW_POSITION_X
and GLFW_POSITION_Y
window hints and parameter for controlling and polling window position
Added windows
simple multi-window test program
Added sharing
simple OpenGL object sharing test program
Added modes
video mode enumeration and setting test program
@@ -298,6 +299,7 @@ version of GLFW.
Changed glfwGetVideoModes
to return a dynamic, unlimited number of video modes
Renamed glfw.h
to glfw3.h
to avoid conflicts with 2.x series
Renamed glfwOpenWindowHint
to glfwWindowHint
+ Renamed GLFW_ACTIVE
to GLFW_FOCUSED
Renamed GLFW_WINDOW
token to GLFW_WINDOWED
Renamed GLFW_WINDOW_NO_RESIZE
to GLFW_RESIZABLE
Renamed GLFW_BUILD_DLL
to _GLFW_BUILD_DLL
@@ -312,7 +314,7 @@ version of GLFW.
Replaced glfwEnable
and glfwDisable
with glfwGetInputMode
and glfwSetInputMode
Replaced joystick
test with graphical version
Replaced automatic closing of windows with GLFW_CLOSE_REQUESTED
window parameter
- Made Unicode character input unaffected by GLFW_KEY_REPEAT
+ Removed the GLFW_KEY_REPEAT
input option
Removed event auto-polling and the GLFW_AUTO_POLL_EVENTS
window enable
Removed the Win32 port .def files
Removed the entire threading API
@@ -934,8 +936,9 @@ their skills. Special thanks go out to:
Leopard
Riku Salminen, for the initial implementation of
- glfwShowWindow
and glfwHideWindow
, and for making
- the X11 event processing able to support multi-threaded rendering
+ glfwShowWindow
and glfwHideWindow
, for the idea of
+ glfwDefaultWindowHints
and for making the X11 event processing
+ able to support multi-threaded rendering
Douglas C. Schmidt and Irfan Pyarali, for their excellent article
Strategies for Implementing POSIX Condition Variables on Win32
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 5d066b70..783a2c35 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -13,7 +13,7 @@ set(common_SOURCES clipboard.c fullscreen.c gamma.c init.c input.c
if (_GLFW_COCOA_NSGL)
set(glfw_HEADERS ${common_HEADERS} cocoa_platform.h)
set(glfw_SOURCES ${common_SOURCES} cocoa_clipboard.m cocoa_fullscreen.m
- cocoa_gamma.c cocoa_init.m cocoa_input.m cocoa_joystick.m
+ cocoa_gamma.c cocoa_init.m cocoa_joystick.m
cocoa_opengl.m cocoa_time.c cocoa_window.m)
if (GLFW_NATIVE_API)
@@ -25,7 +25,7 @@ if (_GLFW_COCOA_NSGL)
elseif (_GLFW_WIN32_WGL)
set(glfw_HEADERS ${common_HEADERS} win32_platform.h)
set(glfw_SOURCES ${common_SOURCES} win32_clipboard.c win32_fullscreen.c
- win32_gamma.c win32_init.c win32_input.c win32_joystick.c
+ win32_gamma.c win32_init.c win32_joystick.c
win32_opengl.c win32_time.c win32_window.c)
if (GLFW_NATIVE_API)
@@ -34,7 +34,7 @@ elseif (_GLFW_WIN32_WGL)
elseif (_GLFW_X11_GLX)
set(glfw_HEADERS ${common_HEADERS} x11_platform.h)
set(glfw_SOURCES ${common_SOURCES} x11_clipboard.c x11_fullscreen.c
- x11_gamma.c x11_init.c x11_input.c x11_joystick.c
+ x11_gamma.c x11_init.c x11_joystick.c
x11_keysym2unicode.c x11_opengl.c x11_time.c x11_window.c)
if (GLFW_NATIVE_API)
diff --git a/src/cocoa_input.m b/src/cocoa_input.m
deleted file mode 100644
index 11e1083b..00000000
--- a/src/cocoa_input.m
+++ /dev/null
@@ -1,53 +0,0 @@
-//========================================================================
-// GLFW - An OpenGL library
-// Platform: Cocoa
-// API Version: 3.0
-// WWW: http://www.glfw.org/
-//------------------------------------------------------------------------
-// Copyright (c) 2009-2010 Camilla Berglund
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would
-// be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such, and must not
-// be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source
-// distribution.
-//
-//========================================================================
-
-#include "internal.h"
-
-
-//////////////////////////////////////////////////////////////////////////
-////// GLFW platform API //////
-//////////////////////////////////////////////////////////////////////////
-
-//========================================================================
-// Enable and disable system keys
-//========================================================================
-
-void _glfwPlatformEnableSystemKeys(_GLFWwindow* window)
-{
- // This is checked in cocoa_window.m; no action needed here
-}
-
-void _glfwPlatformDisableSystemKeys(_GLFWwindow* window)
-{
- // This is checked in cocoa_window.m; no action needed here
-
- // Note that it may not be possible to disable things like Exposé
- // except in full-screen mode.
-}
-
diff --git a/src/cocoa_opengl.m b/src/cocoa_opengl.m
index 4d4c4299..ed024d6e 100644
--- a/src/cocoa_opengl.m
+++ b/src/cocoa_opengl.m
@@ -147,13 +147,3 @@ GLFWglproc _glfwPlatformGetProcAddress(const char* procname)
return symbol;
}
-
-//========================================================================
-// Copies the specified OpenGL state categories from src to dst
-//========================================================================
-
-void _glfwPlatformCopyContext(_GLFWwindow* src, _GLFWwindow* dst, unsigned long mask)
-{
- [dst->NSGL.context copyAttributesFromContext:src->NSGL.context withMask:mask];
-}
-
diff --git a/src/cocoa_window.m b/src/cocoa_window.m
index fd60d0ee..040277a7 100644
--- a/src/cocoa_window.m
+++ b/src/cocoa_window.m
@@ -455,8 +455,7 @@ static int convertMacKeyCode(unsigned int macKeyCode)
if ([event modifierFlags] & NSCommandKeyMask)
{
- if (window->systemKeys)
- [super keyDown:event];
+ [super keyDown:event];
}
else
{
@@ -686,7 +685,7 @@ static GLboolean createWindow(_GLFWwindow* window,
styleMask = NSBorderlessWindowMask;
window->NS.object = [[NSWindow alloc]
- initWithContentRect:NSMakeRect(0, 0, window->width, window->height)
+ initWithContentRect:NSMakeRect(wndconfig->positionX, wndconfig->positionY, window->width, window->height)
styleMask:styleMask
backing:NSBackingStoreBuffered
defer:NO];
@@ -836,6 +835,9 @@ static GLboolean createContext(_GLFWwindow* window,
ADD_ATTR2(NSOpenGLPFASamples, fbconfig->samples);
}
+ // NOTE: All NSOpenGLPixelFormats on the relevant cards support sRGB
+ // frambuffer, so there's no need (and no way) to request it
+
ADD_ATTR(0);
#undef ADD_ATTR
@@ -1006,27 +1008,6 @@ void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
}
-//========================================================================
-// Set the window position
-//========================================================================
-
-void _glfwPlatformSetWindowPos(_GLFWwindow* window, int x, int y)
-{
- NSRect contentRect =
- [window->NS.object contentRectForFrameRect:[window->NS.object frame]];
-
- // We assume here that the client code wants to position the window within the
- // screen the window currently occupies
- NSRect screenRect = [[window->NS.object screen] visibleFrame];
- contentRect.origin = NSMakePoint(screenRect.origin.x + x,
- screenRect.origin.y + screenRect.size.height -
- y - contentRect.size.height);
-
- [window->NS.object setFrame:[window->NS.object frameRectForContentRect:contentRect]
- display:YES];
-}
-
-
//========================================================================
// Iconify the window
//========================================================================
diff --git a/src/init.c b/src/init.c
index efcea20c..4d7b731e 100644
--- a/src/init.c
+++ b/src/init.c
@@ -215,21 +215,19 @@ GLFWAPI const char* glfwErrorString(int error)
case GLFW_NOT_INITIALIZED:
return "The GLFW library is not initialized";
case GLFW_NO_CURRENT_CONTEXT:
- return "There is no current OpenGL context";
+ return "There is no current context";
case GLFW_INVALID_ENUM:
return "Invalid argument for enum parameter";
case GLFW_INVALID_VALUE:
return "Invalid value for parameter";
case GLFW_OUT_OF_MEMORY:
return "Out of memory";
- case GLFW_OPENGL_UNAVAILABLE:
- return "OpenGL is not available on this machine";
+ case GLFW_API_UNAVAILABLE:
+ return "The requested client API is unavailable";
case GLFW_VERSION_UNAVAILABLE:
- return "The requested OpenGL version is unavailable";
+ return "The requested client API version is unavailable";
case GLFW_PLATFORM_ERROR:
return "A platform-specific error occurred";
- case GLFW_WINDOW_NOT_ACTIVE:
- return "The specified window is not active";
case GLFW_FORMAT_UNAVAILABLE:
return "The requested format is unavailable";
}
diff --git a/src/input.c b/src/input.c
index 701da4f0..2a077502 100644
--- a/src/input.c
+++ b/src/input.c
@@ -115,34 +115,6 @@ static void setStickyMouseButtons(_GLFWwindow* window, int enabled)
}
-//========================================================================
-// Set system keys for the specified window
-//========================================================================
-
-static void setSystemKeys(_GLFWwindow* window, int enabled)
-{
- if (window->systemKeys == enabled)
- return;
-
- if (enabled)
- _glfwPlatformEnableSystemKeys(window);
- else
- _glfwPlatformDisableSystemKeys(window);
-
- window->systemKeys = enabled;
-}
-
-
-//========================================================================
-// Set key repeat for the specified window
-//========================================================================
-
-static void setKeyRepeat(_GLFWwindow* window, int enabled)
-{
- window->keyRepeat = enabled;
-}
-
-
//////////////////////////////////////////////////////////////////////////
////// GLFW internal API //////
//////////////////////////////////////////////////////////////////////////
@@ -172,7 +144,7 @@ void _glfwInputKey(_GLFWwindow* window, int key, int action)
}
// Call user callback function
- if (window->keyCallback && (window->keyRepeat || !repeated))
+ if (window->keyCallback && !repeated)
window->keyCallback(window, key, action);
}
@@ -295,10 +267,6 @@ GLFWAPI int glfwGetInputMode(GLFWwindow handle, int mode)
return window->stickyKeys;
case GLFW_STICKY_MOUSE_BUTTONS:
return window->stickyMouseButtons;
- case GLFW_SYSTEM_KEYS:
- return window->systemKeys;
- case GLFW_KEY_REPEAT:
- return window->keyRepeat;
default:
_glfwSetError(GLFW_INVALID_ENUM, NULL);
return 0;
@@ -331,12 +299,6 @@ GLFWAPI void glfwSetInputMode(GLFWwindow handle, int mode, int value)
case GLFW_STICKY_MOUSE_BUTTONS:
setStickyMouseButtons(window, value ? GL_TRUE : GL_FALSE);
break;
- case GLFW_SYSTEM_KEYS:
- setSystemKeys(window, value ? GL_TRUE : GL_FALSE);
- break;
- case GLFW_KEY_REPEAT:
- setKeyRepeat(window, value ? GL_TRUE : GL_FALSE);
- break;
default:
_glfwSetError(GLFW_INVALID_ENUM, NULL);
break;
@@ -445,11 +407,8 @@ GLFWAPI void glfwSetCursorPos(GLFWwindow handle, int xpos, int ypos)
return;
}
- if (_glfwLibrary.activeWindow != window)
- {
- _glfwSetError(GLFW_WINDOW_NOT_ACTIVE, NULL);
+ if (_glfwLibrary.focusedWindow != window)
return;
- }
// Don't do anything if the cursor position did not change
if (xpos == window->cursorPosX && ypos == window->cursorPosY)
diff --git a/src/internal.h b/src/internal.h
index 0fbd4b87..b75679fa 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -100,6 +100,7 @@ struct _GLFWhints
GLboolean resizable;
GLboolean visible;
int samples;
+ GLboolean sRGB;
int clientAPI;
int glMajor;
int glMinor;
@@ -107,6 +108,8 @@ struct _GLFWhints
GLboolean glDebug;
int glProfile;
int glRobustness;
+ int positionX;
+ int positionY;
};
@@ -123,6 +126,8 @@ struct _GLFWwndconfig
int refreshRate;
GLboolean resizable;
GLboolean visible;
+ int positionX;
+ int positionY;
int clientAPI;
int glMajor;
int glMinor;
@@ -156,6 +161,7 @@ struct _GLFWfbconfig
int auxBuffers;
GLboolean stereo;
int samples;
+ GLboolean sRGB;
GLFWintptr platformID;
};
@@ -181,8 +187,6 @@ struct _GLFWwindow
// Window input state
GLboolean stickyKeys;
GLboolean stickyMouseButtons;
- GLboolean keyRepeat;
- GLboolean systemKeys; // system keys enabled flag
int cursorPosX, cursorPosY;
int cursorMode;
double scrollX, scrollY;
@@ -197,6 +201,7 @@ struct _GLFWwindow
int glRobustness;
PFNGLGETSTRINGIPROC GetStringi;
+ GLFWwindowposfun windowPosCallback;
GLFWwindowsizefun windowSizeCallback;
GLFWwindowclosefun windowCloseCallback;
GLFWwindowrefreshfun windowRefreshCallback;
@@ -223,7 +228,7 @@ struct _GLFWlibrary
_GLFWhints hints;
_GLFWwindow* windowListHead;
- _GLFWwindow* activeWindow;
+ _GLFWwindow* focusedWindow;
GLFWgammaramp currentRamp;
GLFWgammaramp originalRamp;
@@ -291,7 +296,6 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window, const _GLFWwndconfig* wndcon
void _glfwPlatformDestroyWindow(_GLFWwindow* window);
void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title);
void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height);
-void _glfwPlatformSetWindowPos(_GLFWwindow* window, int x, int y);
void _glfwPlatformIconifyWindow(_GLFWwindow* window);
void _glfwPlatformRestoreWindow(_GLFWwindow* window);
void _glfwPlatformShowWindow(_GLFWwindow* window);
@@ -309,7 +313,6 @@ void _glfwPlatformSwapInterval(int interval);
void _glfwPlatformRefreshWindowParams(_GLFWwindow* window);
int _glfwPlatformExtensionSupported(const char* extension);
GLFWglproc _glfwPlatformGetProcAddress(const char* procname);
-void _glfwPlatformCopyContext(_GLFWwindow* src, _GLFWwindow* dst, unsigned long mask);
//========================================================================
@@ -320,7 +323,7 @@ void _glfwPlatformCopyContext(_GLFWwindow* src, _GLFWwindow* dst, unsigned long
//========================================================================
// Window event notification (window.c)
-void _glfwInputWindowFocus(_GLFWwindow* window, GLboolean activated);
+void _glfwInputWindowFocus(_GLFWwindow* window, GLboolean focused);
void _glfwInputWindowPos(_GLFWwindow* window, int x, int y);
void _glfwInputWindowSize(_GLFWwindow* window, int width, int height);
void _glfwInputWindowIconify(_GLFWwindow* window, int iconified);
diff --git a/src/opengl.c b/src/opengl.c
index 482db6ad..931296ce 100644
--- a/src/opengl.c
+++ b/src/opengl.c
@@ -217,6 +217,12 @@ const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired,
extraDiff += (desired->samples - current->samples) *
(desired->samples - current->samples);
}
+
+ if (desired->sRGB)
+ {
+ if (!current->sRGB)
+ extraDiff++;
+ }
}
// Figure out if the current one is better than the best one found so far
@@ -682,32 +688,3 @@ GLFWAPI GLFWglproc glfwGetProcAddress(const char* procname)
return _glfwPlatformGetProcAddress(procname);
}
-
-//========================================================================
-// Copies the specified OpenGL state categories from src to dst
-//========================================================================
-
-GLFWAPI void glfwCopyContext(GLFWwindow hsrc, GLFWwindow hdst, unsigned long mask)
-{
- _GLFWwindow* src;
- _GLFWwindow* dst;
-
- if (!_glfwInitialized)
- {
- _glfwSetError(GLFW_NOT_INITIALIZED, NULL);
- return;
- }
-
- src = (_GLFWwindow*) hsrc;
- dst = (_GLFWwindow*) hdst;
-
- if (_glfwPlatformGetCurrentContext() == dst)
- {
- _glfwSetError(GLFW_INVALID_VALUE,
- "glfwCopyContext: Cannot copy OpenGL state to a current context");
- return;
- }
-
- _glfwPlatformCopyContext(src, dst, mask);
-}
-
diff --git a/src/win32_input.c b/src/win32_input.c
deleted file mode 100644
index 2178b145..00000000
--- a/src/win32_input.c
+++ /dev/null
@@ -1,132 +0,0 @@
-//========================================================================
-// GLFW - An OpenGL library
-// Platform: Win32
-// API version: 3.0
-// WWW: http://www.glfw.org/
-//------------------------------------------------------------------------
-// Copyright (c) 2002-2006 Marcus Geelnard
-// Copyright (c) 2006-2010 Camilla Berglund
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would
-// be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such, and must not
-// be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source
-// distribution.
-//
-//========================================================================
-
-#include "internal.h"
-
-
-//========================================================================
-// Low level keyboard hook (system callback) function
-// Used to disable system keys under Windows NT
-//========================================================================
-
-static LRESULT CALLBACK keyboardHook(int nCode, WPARAM wParam, LPARAM lParam)
-{
- BOOL syskeys = FALSE;
- PKBDLLHOOKSTRUCT p;
-
- // We are only looking for keyboard events - interpret lParam as a
- // pointer to a KBDLLHOOKSTRUCT
- p = (PKBDLLHOOKSTRUCT) lParam;
-
- if (nCode == HC_ACTION)
- {
- // We have a keyboard event
-
- switch (wParam)
- {
- case WM_KEYDOWN:
- case WM_SYSKEYDOWN:
- case WM_KEYUP:
- case WM_SYSKEYUP:
- // Detect: ALT+TAB, ALT+ESC, ALT+F4, CTRL+ESC,
- // LWIN, RWIN, APPS (mysterious menu key)
- syskeys = (p->vkCode == VK_TAB &&
- p->flags & LLKHF_ALTDOWN) ||
- (p->vkCode == VK_ESCAPE &&
- p->flags & LLKHF_ALTDOWN) ||
- (p->vkCode == VK_F4 &&
- p->flags & LLKHF_ALTDOWN) ||
- (p->vkCode == VK_ESCAPE &&
- (GetKeyState(VK_CONTROL) & 0x8000)) ||
- p->vkCode == VK_LWIN ||
- p->vkCode == VK_RWIN ||
- p->vkCode == VK_APPS;
- break;
-
- default:
- break;
- }
- }
-
- // Was it a system key combination (e.g. ALT+TAB)?
- if (syskeys)
- {
- _GLFWwindow* window = _glfwLibrary.activeWindow;
-
- // Pass the key event to our window message loop
- if (window)
- PostMessage(window->Win32.handle, (UINT) wParam, p->vkCode, 0);
-
- // We've taken care of it - don't let the system know about this
- // key event
- return 1;
- }
- else
- {
- // It's a harmless key press, let the system deal with it
- return CallNextHookEx(_glfwLibrary.Win32.keyboardHook, nCode, wParam, lParam);
- }
-}
-
-
-//////////////////////////////////////////////////////////////////////////
-////// GLFW platform API //////
-//////////////////////////////////////////////////////////////////////////
-
-//========================================================================
-// Enable system keys
-//========================================================================
-
-void _glfwPlatformEnableSystemKeys(_GLFWwindow* window)
-{
- UNREFERENCED_PARAMETER(window);
-
- if (_glfwLibrary.Win32.keyboardHook != NULL)
- {
- UnhookWindowsHookEx(_glfwLibrary.Win32.keyboardHook);
- _glfwLibrary.Win32.keyboardHook = NULL;
- }
-}
-
-
-//========================================================================
-// Disable system keys
-//========================================================================
-
-void _glfwPlatformDisableSystemKeys(_GLFWwindow* window)
-{
- UNREFERENCED_PARAMETER(window);
-
- _glfwLibrary.Win32.keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL,
- keyboardHook,
- _glfwLibrary.Win32.instance,
- 0);
-}
-
diff --git a/src/win32_opengl.c b/src/win32_opengl.c
index acbf09f5..80d7470e 100644
--- a/src/win32_opengl.c
+++ b/src/win32_opengl.c
@@ -72,6 +72,7 @@ static void initWGLExtensions(_GLFWwindow* window)
// This needs to include every extension used below except for
// WGL_ARB_extensions_string and WGL_EXT_extensions_string
window->WGL.ARB_multisample = GL_FALSE;
+ window->WGL.ARB_framebuffer_sRGB = GL_FALSE;
window->WGL.ARB_create_context = GL_FALSE;
window->WGL.ARB_create_context_profile = GL_FALSE;
window->WGL.EXT_create_context_es2_profile = GL_FALSE;
@@ -92,6 +93,9 @@ static void initWGLExtensions(_GLFWwindow* window)
if (_glfwPlatformExtensionSupported("WGL_ARB_multisample"))
window->WGL.ARB_multisample = GL_TRUE;
+ if (_glfwPlatformExtensionSupported("WGL_ARB_framebuffer_sRGB"))
+ window->WGL.ARB_framebuffer_sRGB = GL_TRUE;
+
if (_glfwPlatformExtensionSupported("WGL_ARB_create_context"))
{
window->WGL.CreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)
@@ -189,7 +193,7 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found)
if (!available)
{
- _glfwSetError(GLFW_OPENGL_UNAVAILABLE, "WGL: No pixel formats found");
+ _glfwSetError(GLFW_API_UNAVAILABLE, "WGL: No pixel formats found");
return NULL;
}
@@ -246,6 +250,11 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found)
f->samples = getPixelFormatAttrib(window, i, WGL_SAMPLES_ARB);
else
f->samples = 0;
+
+ if (window->WGL.ARB_framebuffer_sRGB)
+ f->sRGB = getPixelFormatAttrib(window, i, WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB);
+ else
+ f->sRGB = GL_FALSE;
}
else
{
@@ -293,6 +302,9 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found)
// PFD pixel formats do not support FSAA
f->samples = 0;
+
+ // PFD pixel formats do not support sRGB
+ f->sRGB = GL_FALSE;
}
f->platformID = i;
@@ -637,17 +649,3 @@ GLFWglproc _glfwPlatformGetProcAddress(const char* procname)
return (GLFWglproc) wglGetProcAddress(procname);
}
-
-//========================================================================
-// Copies the specified OpenGL state categories from src to dst
-//========================================================================
-
-void _glfwPlatformCopyContext(_GLFWwindow* src, _GLFWwindow* dst, unsigned long mask)
-{
- if (!wglCopyContext(src->WGL.context, dst->WGL.context, mask))
- {
- _glfwSetError(GLFW_PLATFORM_ERROR,
- "WGL: Failed to copy OpenGL context attributes");
- }
-}
-
diff --git a/src/win32_platform.h b/src/win32_platform.h
index 9ee8cc1a..9dba7f2d 100644
--- a/src/win32_platform.h
+++ b/src/win32_platform.h
@@ -144,6 +144,7 @@ typedef struct _GLFWcontextWGL
GLboolean EXT_swap_control;
GLboolean ARB_multisample;
GLboolean ARB_pixel_format;
+ GLboolean ARB_framebuffer_sRGB;
GLboolean ARB_create_context;
GLboolean ARB_create_context_profile;
GLboolean EXT_create_context_es2_profile;
@@ -176,7 +177,6 @@ typedef struct _GLFWlibraryWin32
{
HINSTANCE instance; // Instance of the application
ATOM classAtom; // Window class atom
- HHOOK keyboardHook; // Keyboard hook handle
DWORD foregroundLockTimeout;
char* clipboardString;
diff --git a/src/win32_window.c b/src/win32_window.c
index 75c8a8c1..a99f08dd 100644
--- a/src/win32_window.c
+++ b/src/win32_window.c
@@ -328,22 +328,22 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
case WM_ACTIVATE:
{
- // Window was (de)activated and/or (de)iconified
+ // Window was (de)focused and/or (de)iconified
- BOOL active = LOWORD(wParam) != WA_INACTIVE;
+ BOOL focused = LOWORD(wParam) != WA_INACTIVE;
BOOL iconified = HIWORD(wParam) ? TRUE : FALSE;
- if (active && iconified)
+ if (focused && iconified)
{
// This is a workaround for window iconification using the
- // taskbar leading to windows being told they're active and
- // iconified and then never told they're deactivated
- active = FALSE;
+ // taskbar leading to windows being told they're focused and
+ // iconified and then never told they're defocused
+ focused = FALSE;
}
- if (!active && _glfwLibrary.activeWindow == window)
+ if (!focused && _glfwLibrary.focusedWindow == window)
{
- // The window was deactivated (or iconified, see above)
+ // The window was defocused (or iconified, see above)
if (window->cursorMode == GLFW_CURSOR_CAPTURED)
showCursor(window);
@@ -364,9 +364,9 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
}
}
}
- else if (active && _glfwLibrary.activeWindow != window)
+ else if (focused && _glfwLibrary.focusedWindow != window)
{
- // The window was activated
+ // The window was focused
if (window->cursorMode == GLFW_CURSOR_CAPTURED)
captureCursor(window);
@@ -386,7 +386,7 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
}
}
- _glfwInputWindowFocus(window, active);
+ _glfwInputWindowFocus(window, focused);
_glfwInputWindowIconify(window, iconified);
return 0;
}
@@ -544,7 +544,7 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
if (window->cursorMode == GLFW_CURSOR_CAPTURED)
{
- if (_glfwLibrary.activeWindow != window)
+ if (_glfwLibrary.focusedWindow != window)
return 0;
x = newCursorX - window->Win32.oldCursorX;
@@ -772,7 +772,11 @@ static int createWindow(_GLFWwindow* window,
if (window->mode == GLFW_FULLSCREEN)
wa.left = wa.top = 0;
else
+ {
SystemParametersInfo(SPI_GETWORKAREA, 0, &wa, 0);
+ wa.left += wndconfig->positionX;
+ wa.top += wndconfig->positionY;
+ }
wideTitle = _glfwCreateWideStringFromUTF8(wndconfig->title);
if (!wideTitle)
@@ -825,8 +829,8 @@ static void destroyWindow(_GLFWwindow* window)
// This is duplicated from glfwDestroyWindow
// TODO: Stop duplicating code
- if (window == _glfwLibrary.activeWindow)
- _glfwLibrary.activeWindow = NULL;
+ if (window == _glfwLibrary.focusedWindow)
+ _glfwLibrary.focusedWindow = NULL;
if (window->Win32.handle)
{
@@ -1054,23 +1058,6 @@ void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
}
-//========================================================================
-// Set the window position
-//========================================================================
-
-void _glfwPlatformSetWindowPos(_GLFWwindow* window, int x, int y)
-{
- RECT rect;
-
- GetClientRect(window->Win32.handle, &rect);
- AdjustWindowRectEx(&rect, window->Win32.dwStyle, FALSE, window->Win32.dwExStyle);
-
- SetWindowPos(window->Win32.handle, HWND_TOP,
- x + rect.left, y + rect.top, 0, 0,
- SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER);
-}
-
-
//========================================================================
// Window iconification
//========================================================================
@@ -1145,7 +1132,7 @@ void _glfwPlatformPollEvents(void)
MSG msg;
_GLFWwindow* window;
- window = _glfwLibrary.activeWindow;
+ window = _glfwLibrary.focusedWindow;
if (window)
{
window->Win32.cursorCentered = GL_FALSE;
@@ -1181,7 +1168,7 @@ void _glfwPlatformPollEvents(void)
// LSHIFT/RSHIFT fixup (keys tend to "stick" without this fix)
// This is the only async event handling in GLFW, but it solves some
// nasty problems.
- window = _glfwLibrary.activeWindow;
+ window = _glfwLibrary.focusedWindow;
if (window)
{
int lshift_down, rshift_down;
@@ -1199,8 +1186,8 @@ void _glfwPlatformPollEvents(void)
_glfwInputKey(window, GLFW_KEY_RIGHT_SHIFT, GLFW_RELEASE);
}
- // Did the cursor move in an active window that has captured the cursor
- window = _glfwLibrary.activeWindow;
+ // Did the cursor move in an focused window that has captured the cursor
+ window = _glfwLibrary.focusedWindow;
if (window)
{
if (window->cursorMode == GLFW_CURSOR_CAPTURED &&
diff --git a/src/window.c b/src/window.c
index b86dcfec..d4026465 100644
--- a/src/window.c
+++ b/src/window.c
@@ -72,21 +72,21 @@ static void clearScrollOffsets(void)
// Register window focus events
//========================================================================
-void _glfwInputWindowFocus(_GLFWwindow* window, GLboolean activated)
+void _glfwInputWindowFocus(_GLFWwindow* window, GLboolean focused)
{
- if (activated)
+ if (focused)
{
- if (_glfwLibrary.activeWindow != window)
+ if (_glfwLibrary.focusedWindow != window)
{
- _glfwLibrary.activeWindow = window;
+ _glfwLibrary.focusedWindow = window;
if (window->windowFocusCallback)
- window->windowFocusCallback(window, activated);
+ window->windowFocusCallback(window, focused);
}
}
else
{
- if (_glfwLibrary.activeWindow == window)
+ if (_glfwLibrary.focusedWindow == window)
{
int i;
@@ -104,10 +104,10 @@ void _glfwInputWindowFocus(_GLFWwindow* window, GLboolean activated)
_glfwInputMouseClick(window, i, GLFW_RELEASE);
}
- _glfwLibrary.activeWindow = NULL;
+ _glfwLibrary.focusedWindow = NULL;
if (window->windowFocusCallback)
- window->windowFocusCallback(window, activated);
+ window->windowFocusCallback(window, focused);
}
}
}
@@ -119,8 +119,14 @@ void _glfwInputWindowFocus(_GLFWwindow* window, GLboolean activated)
void _glfwInputWindowPos(_GLFWwindow* window, int x, int y)
{
+ if (window->positionX == x && window->positionY == y)
+ return;
+
window->positionX = x;
window->positionY = y;
+
+ if (window->windowPosCallback)
+ window->windowPosCallback(window, x, y);
}
@@ -231,6 +237,7 @@ GLFWAPI GLFWwindow glfwCreateWindow(int width, int height,
fbconfig.auxBuffers = Max(_glfwLibrary.hints.auxBuffers, 0);
fbconfig.stereo = _glfwLibrary.hints.stereo ? GL_TRUE : GL_FALSE;
fbconfig.samples = Max(_glfwLibrary.hints.samples, 0);
+ fbconfig.sRGB = _glfwLibrary.hints.sRGB ? GL_TRUE : GL_FALSE;
// Set up desired window config
wndconfig.mode = mode;
@@ -238,6 +245,8 @@ GLFWAPI GLFWwindow glfwCreateWindow(int width, int height,
wndconfig.refreshRate = Max(_glfwLibrary.hints.refreshRate, 0);
wndconfig.resizable = _glfwLibrary.hints.resizable ? GL_TRUE : GL_FALSE;
wndconfig.visible = _glfwLibrary.hints.visible ? GL_TRUE : GL_FALSE;
+ wndconfig.positionX = _glfwLibrary.hints.positionX;
+ wndconfig.positionY = _glfwLibrary.hints.positionY;
wndconfig.clientAPI = _glfwLibrary.hints.clientAPI;
wndconfig.glMajor = _glfwLibrary.hints.glMajor;
wndconfig.glMinor = _glfwLibrary.hints.glMinor;
@@ -261,22 +270,11 @@ GLFWAPI GLFWwindow glfwCreateWindow(int width, int height,
return GL_FALSE;
}
- // Check width & height
- if (width > 0 && height <= 0)
+ if (width <= 0 || height <= 0)
{
- // Set the window aspect ratio to 4:3
- height = (width * 3) / 4;
- }
- else if (width <= 0 && height > 0)
- {
- // Set the window aspect ratio to 4:3
- width = (height * 4) / 3;
- }
- else if (width <= 0 && height <= 0)
- {
- // Default window size
- width = 640;
- height = 480;
+ _glfwSetError(GLFW_INVALID_VALUE,
+ "glfwCreateWindow: Invalid window size");
+ return GL_FALSE;
}
window = (_GLFWwindow*) calloc(1, sizeof(_GLFWwindow));
@@ -295,7 +293,6 @@ GLFWAPI GLFWwindow glfwCreateWindow(int width, int height,
window->mode = mode;
window->resizable = wndconfig.resizable;
window->cursorMode = GLFW_CURSOR_NORMAL;
- window->systemKeys = GL_TRUE;
// Open the actual window and create its context
if (!_glfwPlatformCreateWindow(window, &wndconfig, &fbconfig))
@@ -369,6 +366,10 @@ void glfwDefaultWindowHints(void)
_glfwLibrary.hints.resizable = GL_TRUE;
_glfwLibrary.hints.visible = GL_TRUE;
+ // The default window position is the upper left corner of the screen
+ _glfwLibrary.hints.positionX = 0;
+ _glfwLibrary.hints.positionY = 0;
+
// The default is 24 bits of color, 24 bits of depth and 8 bits of stencil
_glfwLibrary.hints.redBits = 8;
_glfwLibrary.hints.greenBits = 8;
@@ -437,9 +438,18 @@ GLFWAPI void glfwWindowHint(int target, int hint)
case GLFW_VISIBLE:
_glfwLibrary.hints.visible = hint;
break;
+ case GLFW_POSITION_X:
+ _glfwLibrary.hints.positionX = hint;
+ break;
+ case GLFW_POSITION_Y:
+ _glfwLibrary.hints.positionY = hint;
+ break;
case GLFW_FSAA_SAMPLES:
_glfwLibrary.hints.samples = hint;
break;
+ case GLFW_SRGB_CAPABLE:
+ _glfwLibrary.hints.sRGB = hint;
+ break;
case GLFW_CLIENT_API:
_glfwLibrary.hints.clientAPI = hint;
break;
@@ -491,9 +501,9 @@ GLFWAPI void glfwDestroyWindow(GLFWwindow handle)
if (window == _glfwPlatformGetCurrentContext())
_glfwPlatformMakeContextCurrent(NULL);
- // Clear the active window pointer if this is the active window
- if (window == _glfwLibrary.activeWindow)
- _glfwLibrary.activeWindow = NULL;
+ // Clear the focused window pointer if this is the focused window
+ if (window == _glfwLibrary.focusedWindow)
+ _glfwLibrary.focusedWindow = NULL;
_glfwPlatformDestroyWindow(window);
@@ -586,52 +596,6 @@ GLFWAPI void glfwSetWindowSize(GLFWwindow handle, int width, int height)
}
-//========================================================================
-// Get the window position
-//========================================================================
-
-GLFWAPI void glfwGetWindowPos(GLFWwindow handle, int* xpos, int* ypos)
-{
- _GLFWwindow* window = (_GLFWwindow*) handle;
-
- if (!_glfwInitialized)
- {
- _glfwSetError(GLFW_NOT_INITIALIZED, NULL);
- return;
- }
-
- if (xpos != NULL)
- *xpos = window->positionX;
-
- if (ypos != NULL)
- *ypos = window->positionY;
-}
-
-
-//========================================================================
-// Set the window position
-//========================================================================
-
-GLFWAPI void glfwSetWindowPos(GLFWwindow handle, int xpos, int ypos)
-{
- _GLFWwindow* window = (_GLFWwindow*) handle;
-
- if (!_glfwInitialized)
- {
- _glfwSetError(GLFW_NOT_INITIALIZED, NULL);
- return;
- }
-
- if (window->mode == GLFW_FULLSCREEN || window->iconified)
- {
- // TODO: Figure out if this is an error
- return;
- }
-
- _glfwPlatformSetWindowPos(window, xpos, ypos);
-}
-
-
//========================================================================
// Window iconification
//========================================================================
@@ -735,8 +699,8 @@ GLFWAPI int glfwGetWindowParam(GLFWwindow handle, int param)
switch (param)
{
- case GLFW_ACTIVE:
- return window == _glfwLibrary.activeWindow;
+ case GLFW_FOCUSED:
+ return window == _glfwLibrary.focusedWindow;
case GLFW_ICONIFIED:
return window->iconified;
case GLFW_CLOSE_REQUESTED:
@@ -747,6 +711,10 @@ GLFWAPI int glfwGetWindowParam(GLFWwindow handle, int param)
return window->resizable;
case GLFW_VISIBLE:
return window->visible;
+ case GLFW_POSITION_X:
+ return window->positionX;
+ case GLFW_POSITION_Y:
+ return window->positionY;
case GLFW_CLIENT_API:
return window->clientAPI;
case GLFW_OPENGL_VERSION_MAJOR:
@@ -806,6 +774,24 @@ GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow handle)
}
+//========================================================================
+// Set callback function for window position changes
+//========================================================================
+
+GLFWAPI void glfwSetWindowPosCallback(GLFWwindow handle, GLFWwindowposfun cbfun)
+{
+ _GLFWwindow* window = (_GLFWwindow*) handle;
+
+ if (!_glfwInitialized)
+ {
+ _glfwSetError(GLFW_NOT_INITIALIZED, NULL);
+ return;
+ }
+
+ window->windowPosCallback = cbfun;
+}
+
+
//========================================================================
// Set callback function for window size changes
//========================================================================
diff --git a/src/x11_init.c b/src/x11_init.c
index 3fbbd608..2eb09517 100644
--- a/src/x11_init.c
+++ b/src/x11_init.c
@@ -491,7 +491,7 @@ static GLboolean initDisplay(void)
_glfwLibrary.X11.display = XOpenDisplay(NULL);
if (!_glfwLibrary.X11.display)
{
- _glfwSetError(GLFW_OPENGL_UNAVAILABLE, "X11: Failed to open X display");
+ _glfwSetError(GLFW_API_UNAVAILABLE, "X11: Failed to open X display");
return GL_FALSE;
}
diff --git a/src/x11_input.c b/src/x11_input.c
deleted file mode 100644
index 2ea8b8c4..00000000
--- a/src/x11_input.c
+++ /dev/null
@@ -1,65 +0,0 @@
-//========================================================================
-// GLFW - An OpenGL library
-// Platform: X11
-// API version: 3.0
-// WWW: http://www.glfw.org/
-//------------------------------------------------------------------------
-// Copyright (c) 2002-2006 Marcus Geelnard
-// Copyright (c) 2006-2010 Camilla Berglund
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would
-// be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such, and must not
-// be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source
-// distribution.
-//
-//========================================================================
-
-#include "internal.h"
-
-
-//////////////////////////////////////////////////////////////////////////
-////// GLFW platform API //////
-//////////////////////////////////////////////////////////////////////////
-
-//========================================================================
-// Enable system keys
-//========================================================================
-
-void _glfwPlatformEnableSystemKeys(_GLFWwindow* window)
-{
- if (window->X11.keyboardGrabbed)
- {
- XUngrabKeyboard(_glfwLibrary.X11.display, CurrentTime);
- window->X11.keyboardGrabbed = GL_FALSE;
- }
-}
-
-
-//========================================================================
-// Disable system keys
-//========================================================================
-
-void _glfwPlatformDisableSystemKeys(_GLFWwindow* window)
-{
- if (XGrabKeyboard(_glfwLibrary.X11.display, window->X11.handle,
- True, GrabModeAsync, GrabModeAsync, CurrentTime)
- == GrabSuccess)
- {
- window->X11.keyboardGrabbed = GL_TRUE;
- }
-}
-
diff --git a/src/x11_opengl.c b/src/x11_opengl.c
index ccd59d87..845a1980 100644
--- a/src/x11_opengl.c
+++ b/src/x11_opengl.c
@@ -93,7 +93,7 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found)
{
if (!_glfwLibrary.GLX.SGIX_fbconfig)
{
- _glfwSetError(GLFW_OPENGL_UNAVAILABLE,
+ _glfwSetError(GLFW_API_UNAVAILABLE,
"GLX: GLXFBConfig support not found");
return NULL;
}
@@ -103,8 +103,8 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found)
if (strcmp(vendor, "Chromium") == 0)
{
- // This is a (hopefully temporary) workaround for Chromium (VirtualBox
- // GL) not setting the window bit on any GLXFBConfigs
+ // HACK: This is a (hopefully temporary) workaround for Chromium
+ // (VirtualBox GL) not setting the window bit on any GLXFBConfigs
trustWindowBit = GL_FALSE;
}
@@ -116,7 +116,7 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found)
&count);
if (!count)
{
- _glfwSetError(GLFW_OPENGL_UNAVAILABLE,
+ _glfwSetError(GLFW_API_UNAVAILABLE,
"GLX: No GLXFBConfigs returned");
return NULL;
}
@@ -128,7 +128,7 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found)
&count);
if (!count)
{
- _glfwSetError(GLFW_OPENGL_UNAVAILABLE,
+ _glfwSetError(GLFW_API_UNAVAILABLE,
"GLX: No GLXFBConfigs returned");
return NULL;
}
@@ -190,6 +190,11 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found)
else
f->samples = 0;
+ if (_glfwLibrary.GLX.ARB_framebuffer_sRGB)
+ f->sRGB = getFBConfigAttrib(window, fbconfigs[i], GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB);
+ else
+ f->sRGB = GL_FALSE;
+
f->platformID = (GLFWintptr) getFBConfigAttrib(window, fbconfigs[i], GLX_FBCONFIG_ID);
(*found)++;
@@ -465,7 +470,7 @@ int _glfwInitOpenGL(void)
// Check if GLX is supported on this display
if (!glXQueryExtension(_glfwLibrary.X11.display, NULL, NULL))
{
- _glfwSetError(GLFW_OPENGL_UNAVAILABLE, "GLX: GLX support not found");
+ _glfwSetError(GLFW_API_UNAVAILABLE, "GLX: GLX support not found");
return GL_FALSE;
}
@@ -473,8 +478,7 @@ int _glfwInitOpenGL(void)
&_glfwLibrary.GLX.majorVersion,
&_glfwLibrary.GLX.minorVersion))
{
- _glfwSetError(GLFW_OPENGL_UNAVAILABLE,
- "GLX: Failed to query GLX version");
+ _glfwSetError(GLFW_API_UNAVAILABLE, "GLX: Failed to query GLX version");
return GL_FALSE;
}
@@ -528,6 +532,9 @@ int _glfwInitOpenGL(void)
if (_glfwPlatformExtensionSupported("GLX_ARB_multisample"))
_glfwLibrary.GLX.ARB_multisample = GL_TRUE;
+ if (_glfwPlatformExtensionSupported("GLX_ARB_framebuffer_sRGB"))
+ _glfwLibrary.GLX.ARB_framebuffer_sRGB = GL_TRUE;
+
if (_glfwPlatformExtensionSupported("GLX_ARB_create_context"))
{
_glfwLibrary.GLX.CreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC)
@@ -732,16 +739,3 @@ GLFWglproc _glfwPlatformGetProcAddress(const char* procname)
return _glfw_glXGetProcAddress((const GLubyte*) procname);
}
-
-//========================================================================
-// Copies the specified OpenGL state categories from src to dst
-//========================================================================
-
-void _glfwPlatformCopyContext(_GLFWwindow* src, _GLFWwindow* dst, unsigned long mask)
-{
- glXCopyContext(_glfwLibrary.X11.display,
- src->GLX.context,
- dst->GLX.context,
- mask);
-}
-
diff --git a/src/x11_platform.h b/src/x11_platform.h
index a29101c6..ca359891 100644
--- a/src/x11_platform.h
+++ b/src/x11_platform.h
@@ -135,12 +135,17 @@ typedef struct _GLFWwindowX11
// Various platform specific internal variables
GLboolean overrideRedirect; // True if window is OverrideRedirect
- GLboolean keyboardGrabbed; // True if keyboard is currently grabbed
GLboolean cursorGrabbed; // True if cursor is currently grabbed
GLboolean cursorHidden; // True if cursor is currently hidden
GLboolean cursorCentered; // True if cursor was moved since last poll
int cursorPosX, cursorPosY;
+ // Window position hint (commited the first time the window is shown)
+ GLboolean windowPosSet; // False until the window position has
+ // been set
+ int positionX; // The window position to be set the
+ int positionY; // first time the window is shown
+
} _GLFWwindowX11;
@@ -268,6 +273,7 @@ typedef struct _GLFWlibraryGLX
GLboolean EXT_swap_control;
GLboolean MESA_swap_control;
GLboolean ARB_multisample;
+ GLboolean ARB_framebuffer_sRGB;
GLboolean ARB_create_context;
GLboolean ARB_create_context_profile;
GLboolean ARB_create_context_robustness;
diff --git a/src/x11_window.c b/src/x11_window.c
index ae920e7f..01ba91ec 100644
--- a/src/x11_window.c
+++ b/src/x11_window.c
@@ -119,7 +119,7 @@ static GLboolean createWindow(_GLFWwindow* window,
window->X11.handle = XCreateWindow(_glfwLibrary.X11.display,
_glfwLibrary.X11.root,
- 0, 0, // Position
+ wndconfig->positionX, wndconfig->positionY,
window->width, window->height,
0, // Border width
visual->depth, // Color depth
@@ -136,6 +136,12 @@ static GLboolean createWindow(_GLFWwindow* window,
_glfwSetError(GLFW_PLATFORM_ERROR, "X11: Failed to create window");
return GL_FALSE;
}
+
+ // Request a window position to be set once the window is shown
+ // (see _glfwPlatformShowWindow)
+ window->X11.windowPosSet = GL_FALSE;
+ window->X11.positionX = wndconfig->positionX;
+ window->X11.positionY = wndconfig->positionY;
}
if (window->mode == GLFW_FULLSCREEN && !_glfwLibrary.X11.hasEWMH)
@@ -626,7 +632,7 @@ static void processEvent(XEvent *event)
if (window->cursorMode == GLFW_CURSOR_CAPTURED)
{
- if (_glfwLibrary.activeWindow != window)
+ if (_glfwLibrary.focusedWindow != window)
break;
x = event->xmotion.x - window->X11.cursorPosX;
@@ -1006,16 +1012,6 @@ void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
}
-//========================================================================
-// Set the window position.
-//========================================================================
-
-void _glfwPlatformSetWindowPos(_GLFWwindow* window, int x, int y)
-{
- XMoveWindow(_glfwLibrary.X11.display, window->X11.handle, x, y);
-}
-
-
//========================================================================
// Window iconification
//========================================================================
@@ -1060,6 +1056,15 @@ void _glfwPlatformShowWindow(_GLFWwindow* window)
{
XMapRaised(_glfwLibrary.X11.display, window->X11.handle);
XFlush(_glfwLibrary.X11.display);
+
+ // Set the window position the first time the window is shown
+ // Note: XMoveWindow has no effect before the window has been mapped.
+ if (!window->X11.windowPosSet)
+ {
+ XMoveWindow(_glfwLibrary.X11.display, window->X11.handle,
+ window->X11.positionX, window->X11.positionY);
+ window->X11.windowPosSet = GL_TRUE;
+ }
}
@@ -1129,11 +1134,11 @@ void _glfwPlatformPollEvents(void)
processEvent(&event);
}
- // Check whether the cursor has moved inside an active window that has
+ // Check whether the cursor has moved inside an focused window that has
// captured the cursor (because then it needs to be re-centered)
_GLFWwindow* window;
- window = _glfwLibrary.activeWindow;
+ window = _glfwLibrary.focusedWindow;
if (window)
{
if (window->cursorMode == GLFW_CURSOR_CAPTURED &&
diff --git a/tests/clipboard.c b/tests/clipboard.c
index 818e6e65..c3746f19 100644
--- a/tests/clipboard.c
+++ b/tests/clipboard.c
@@ -125,7 +125,7 @@ int main(int argc, char** argv)
exit(EXIT_FAILURE);
}
- window = glfwCreateWindow(0, 0, GLFW_WINDOWED, "Clipboard Test", NULL);
+ window = glfwCreateWindow(200, 200, GLFW_WINDOWED, "Clipboard Test", NULL);
if (!window)
{
glfwTerminate();
diff --git a/tests/defaults.c b/tests/defaults.c
index 2877cfd9..b1103ca4 100644
--- a/tests/defaults.c
+++ b/tests/defaults.c
@@ -85,7 +85,7 @@ int main(void)
glfwWindowHint(GLFW_VISIBLE, GL_FALSE);
- window = glfwCreateWindow(0, 0, GLFW_WINDOWED, "Defaults", NULL);
+ window = glfwCreateWindow(640, 480, GLFW_WINDOWED, "Defaults", NULL);
if (!window)
{
glfwTerminate();
diff --git a/tests/events.c b/tests/events.c
index 9379ded9..46bde2ab 100644
--- a/tests/events.c
+++ b/tests/events.c
@@ -41,8 +41,6 @@
#include
// These must match the input mode defaults
-static GLboolean keyrepeat = GL_FALSE;
-static GLboolean systemkeys = GL_TRUE;
static GLboolean closeable = GL_TRUE;
// Event index
@@ -220,6 +218,15 @@ static const char* get_character_string(int character)
return result;
}
+static void window_pos_callback(GLFWwindow window, int x, int y)
+{
+ printf("%08x at %0.3f: Window position: %i %i\n",
+ counter++,
+ glfwGetTime(),
+ x,
+ y);
+}
+
static void window_size_callback(GLFWwindow window, int width, int height)
{
printf("%08x at %0.3f: Window size: %i %i\n",
@@ -249,12 +256,12 @@ static void window_refresh_callback(GLFWwindow window)
}
}
-static void window_focus_callback(GLFWwindow window, int activated)
+static void window_focus_callback(GLFWwindow window, int focused)
{
printf("%08x at %0.3f: Window %s\n",
counter++,
glfwGetTime(),
- activated ? "activated" : "deactivated");
+ focused ? "focused" : "defocused");
}
static void window_iconify_callback(GLFWwindow window, int iconified)
@@ -311,24 +318,6 @@ static void key_callback(GLFWwindow window, int key, int action)
switch (key)
{
- case GLFW_KEY_R:
- {
- keyrepeat = !keyrepeat;
- glfwSetInputMode(window, GLFW_KEY_REPEAT, keyrepeat);
-
- printf("(( key repeat %s ))\n", keyrepeat ? "enabled" : "disabled");
- break;
- }
-
- case GLFW_KEY_S:
- {
- systemkeys = !systemkeys;
- glfwSetInputMode(window, GLFW_SYSTEM_KEYS, systemkeys);
-
- printf("(( system keys %s ))\n", systemkeys ? "enabled" : "disabled");
- break;
- }
-
case GLFW_KEY_C:
{
closeable = !closeable;
@@ -363,7 +352,7 @@ int main(void)
printf("Library initialized\n");
- window = glfwCreateWindow(0, 0, GLFW_WINDOWED, "Event Linter", NULL);
+ window = glfwCreateWindow(640, 480, GLFW_WINDOWED, "Event Linter", NULL);
if (!window)
{
glfwTerminate();
@@ -374,6 +363,7 @@ int main(void)
printf("Window opened\n");
+ glfwSetWindowPosCallback(window, window_pos_callback);
glfwSetWindowSizeCallback(window, window_size_callback);
glfwSetWindowCloseCallback(window, window_close_callback);
glfwSetWindowRefreshCallback(window, window_refresh_callback);
@@ -392,9 +382,6 @@ int main(void)
glfwGetWindowSize(window, &width, &height);
printf("Window size should be %ix%i\n", width, height);
- printf("Key repeat should be %s\n", keyrepeat ? "enabled" : "disabled");
- printf("System keys should be %s\n", systemkeys ? "enabled" : "disabled");
-
printf("Main loop starting\n");
while (!glfwGetWindowParam(window, GLFW_CLOSE_REQUESTED))
diff --git a/tests/fsfocus.c b/tests/fsfocus.c
index 17ffc35f..a87d136a 100644
--- a/tests/fsfocus.c
+++ b/tests/fsfocus.c
@@ -23,7 +23,7 @@
//
//========================================================================
//
-// This test is used to test window activation and iconfication for
+// This test is used to test window focusing and iconfication for
// fullscreen windows with a video mode differing from the desktop mode
//
//========================================================================
@@ -35,11 +35,11 @@
static GLboolean running = GL_TRUE;
-static void window_focus_callback(GLFWwindow window, int activated)
+static void window_focus_callback(GLFWwindow window, int focused)
{
printf("%0.3f: Window %s\n",
glfwGetTime(),
- activated ? "activated" : "deactivated");
+ focused ? "focused" : "defocused");
}
static void window_key_callback(GLFWwindow window, int key, int action)
diff --git a/tests/gamma.c b/tests/gamma.c
index 9ff0e9e5..8b995afc 100644
--- a/tests/gamma.c
+++ b/tests/gamma.c
@@ -133,8 +133,8 @@ int main(int argc, char** argv)
}
else
{
- width = 0;
- height = 0;
+ width = 200;
+ height = 200;
}
window = glfwCreateWindow(width, height, mode, "Gamma Test", NULL);
diff --git a/tests/glfwinfo.c b/tests/glfwinfo.c
index 792e4bd5..5e46fe1e 100644
--- a/tests/glfwinfo.c
+++ b/tests/glfwinfo.c
@@ -268,7 +268,7 @@ int main(int argc, char** argv)
// We assume here that we stand a better chance of success by leaving all
// possible details of pixel format selection to GLFW
- window = glfwCreateWindow(0, 0, GLFW_WINDOWED, "Version", NULL);
+ window = glfwCreateWindow(200, 200, GLFW_WINDOWED, "Version", NULL);
if (!window)
{
glfwTerminate();
diff --git a/tests/iconify.c b/tests/iconify.c
index f7a87cba..b0b6b6a1 100644
--- a/tests/iconify.c
+++ b/tests/iconify.c
@@ -75,11 +75,11 @@ static void window_size_callback(GLFWwindow window, int width, int height)
glViewport(0, 0, width, height);
}
-static void window_focus_callback(GLFWwindow window, int activated)
+static void window_focus_callback(GLFWwindow window, int focused)
{
printf("%0.2f Window %s\n",
glfwGetTime(),
- activated ? "activated" : "deactivated");
+ focused ? "focused" : "defocused");
}
static void window_iconify_callback(GLFWwindow window, int iconified)
@@ -128,8 +128,8 @@ int main(int argc, char** argv)
}
else
{
- width = 0;
- height = 0;
+ width = 640;
+ height = 480;
}
window = glfwCreateWindow(width, height, mode, "Iconify", NULL);
@@ -152,7 +152,7 @@ int main(int argc, char** argv)
printf("Window is %s and %s\n",
glfwGetWindowParam(window, GLFW_ICONIFIED) ? "iconified" : "restored",
- glfwGetWindowParam(window, GLFW_ACTIVE) ? "active" : "inactive");
+ glfwGetWindowParam(window, GLFW_FOCUSED) ? "focused" : "defocused");
glEnable(GL_SCISSOR_TEST);
diff --git a/tests/joysticks.c b/tests/joysticks.c
index 639f8503..806f5bc8 100644
--- a/tests/joysticks.c
+++ b/tests/joysticks.c
@@ -191,7 +191,7 @@ int main(void)
exit(EXIT_FAILURE);
}
- window = glfwCreateWindow(0, 0, GLFW_WINDOWED, "Joystick Test", NULL);
+ window = glfwCreateWindow(640, 480, GLFW_WINDOWED, "Joystick Test", NULL);
if (!window)
{
glfwTerminate();
diff --git a/tests/peter.c b/tests/peter.c
index 32748932..30690e68 100644
--- a/tests/peter.c
+++ b/tests/peter.c
@@ -92,7 +92,7 @@ static void window_size_callback(GLFWwindow window, int width, int height)
static GLboolean open_window(void)
{
- window_handle = glfwCreateWindow(0, 0, GLFW_WINDOWED, "Peter Detector", NULL);
+ window_handle = glfwCreateWindow(640, 480, GLFW_WINDOWED, "Peter Detector", NULL);
if (!window_handle)
return GL_FALSE;
diff --git a/tests/sharing.c b/tests/sharing.c
index 41ce8db5..0042a858 100644
--- a/tests/sharing.c
+++ b/tests/sharing.c
@@ -51,10 +51,12 @@ static int window_close_callback(GLFWwindow window)
return GL_FALSE;
}
-static GLFWwindow open_window(const char* title, GLFWwindow share)
+static GLFWwindow open_window(const char* title, GLFWwindow share, int posX, int posY)
{
GLFWwindow window;
+ glfwWindowHint(GLFW_POSITION_X, posX);
+ glfwWindowHint(GLFW_POSITION_Y, posY);
window = glfwCreateWindow(WIDTH, HEIGHT, GLFW_WINDOWED, title, share);
if (!window)
return NULL;
@@ -125,7 +127,6 @@ static void draw_quad(GLuint texture)
int main(int argc, char** argv)
{
GLuint texture;
- int x, y;
if (!glfwInit())
{
@@ -133,7 +134,7 @@ int main(int argc, char** argv)
exit(EXIT_FAILURE);
}
- windows[0] = open_window("First", NULL);
+ windows[0] = open_window("First", NULL, 0, 0);
if (!windows[0])
{
fprintf(stderr, "Failed to open first GLFW window: %s\n", glfwErrorString(glfwGetError()));
@@ -147,7 +148,8 @@ int main(int argc, char** argv)
// It will then be shared with the second context, created below
texture = create_texture();
- windows[1] = open_window("Second", windows[0]);
+ // Put the second window to the right of the first one
+ windows[1] = open_window("Second", windows[0], WIDTH + 50, 0);
if (!windows[1])
{
fprintf(stderr, "Failed to open second GLFW window: %s\n", glfwErrorString(glfwGetError()));
@@ -156,14 +158,13 @@ int main(int argc, char** argv)
exit(EXIT_FAILURE);
}
- // Set drawing color for the first context and copy it to the second
+ // Set drawing color for both contexts
glfwMakeContextCurrent(windows[0]);
glColor3f(0.6f, 0.f, 0.6f);
- glfwCopyContext(windows[0], windows[1], GL_CURRENT_BIT);
+ glfwMakeContextCurrent(windows[1]);
+ glColor3f(0.6f, 0.6f, 0.f);
- // Put the second window to the right of the first one
- glfwGetWindowPos(windows[0], &x, &y);
- glfwSetWindowPos(windows[1], x + WIDTH + 50, y);
+ glfwMakeContextCurrent(windows[0]);
while (!closed)
{
diff --git a/tests/tearing.c b/tests/tearing.c
index e3149c35..63ece2ba 100644
--- a/tests/tearing.c
+++ b/tests/tearing.c
@@ -70,7 +70,7 @@ int main(void)
exit(EXIT_FAILURE);
}
- window = glfwCreateWindow(0, 0, GLFW_WINDOWED, "", NULL);
+ window = glfwCreateWindow(640, 480, GLFW_WINDOWED, "", NULL);
if (!window)
{
fprintf(stderr, "Failed to open GLFW window: %s\n", glfwErrorString(glfwGetError()));
diff --git a/tests/threads.c b/tests/threads.c
index 49e3739a..8b06b1d3 100644
--- a/tests/threads.c
+++ b/tests/threads.c
@@ -89,6 +89,8 @@ int main(void)
for (i = 0; i < count; i++)
{
+ glfwWindowHint(GLFW_POSITION_X, 200 + 250 * i);
+ glfwWindowHint(GLFW_POSITION_Y, 200);
threads[i].window = glfwCreateWindow(200, 200,
GLFW_WINDOWED,
threads[i].title,
@@ -100,8 +102,6 @@ int main(void)
exit(EXIT_FAILURE);
}
- glfwSetWindowPos(threads[i].window, 200 + 250 * i, 200);
-
if (thrd_create(&threads[i].id, thread_main, threads + i) !=
thrd_success)
{
diff --git a/tests/title.c b/tests/title.c
index a9abebb2..62690f9c 100644
--- a/tests/title.c
+++ b/tests/title.c
@@ -47,7 +47,7 @@ int main(void)
exit(EXIT_FAILURE);
}
- window = glfwCreateWindow(0, 0, GLFW_WINDOWED, "English 日本語 русский язык 官話", NULL);
+ window = glfwCreateWindow(400, 400, GLFW_WINDOWED, "English 日本語 русский язык 官話", NULL);
if (!window)
{
fprintf(stderr, "Failed to open GLFW window: %s\n", glfwErrorString(glfwGetError()));
diff --git a/tests/windows.c b/tests/windows.c
index ddf67915..187248c2 100644
--- a/tests/windows.c
+++ b/tests/windows.c
@@ -55,6 +55,8 @@ int main(void)
for (i = 0; i < 4; i++)
{
+ glfwWindowHint(GLFW_POSITION_X, 100 + (i & 1) * 300);
+ glfwWindowHint(GLFW_POSITION_Y, 100 + (i >> 1) * 300);
windows[i] = glfwCreateWindow(200, 200, GLFW_WINDOWED, titles[i], NULL);
if (!windows[i])
{
@@ -70,8 +72,6 @@ int main(void)
(GLclampf) (i >> 1),
i ? 0.f : 1.f,
0.f);
-
- glfwSetWindowPos(windows[i], 100 + (i & 1) * 300, 100 + (i >> 1) * 300);
}
while (running)