From c5f7eff19019eb7e44704277924d554831ba47d4 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Thu, 27 Sep 2012 02:35:19 +0200 Subject: [PATCH 01/41] Fixed use of functions missing on VC++. --- src/gamma.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/gamma.c b/src/gamma.c index eed0b66d..51e0ce14 100644 --- a/src/gamma.c +++ b/src/gamma.c @@ -67,8 +67,12 @@ GLFWAPI void glfwSetGamma(float gamma) value = (float) i / (float) (size - 1); // Apply gamma curve value = (float) pow(value, 1.f / gamma) * 65535.f + 0.5f; + // Clamp to value range - value = (float) fmax(fmin(value, 65535.f), 0.f); + if (value < 0.f) + value = 0.f; + else if (value > 65535.f) + value = 65535.f; ramp.red[i] = (unsigned short) value; ramp.green[i] = (unsigned short) value; From 7fa27f1e98b07bd5b837478f3c8333bfc98a1ecf Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Thu, 27 Sep 2012 02:49:20 +0200 Subject: [PATCH 02/41] Fixed warnings on VC++. --- src/CMakeLists.txt | 4 ++++ tests/threads.c | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8a7bdec3..5d066b70 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -2,6 +2,10 @@ include_directories(${GLFW_SOURCE_DIR}/src ${GLFW_BINARY_DIR}/src ${glfw_INCLUDE_DIRS}) +if (MSVC) + add_definitions(-D_CRT_SECURE_NO_WARNINGS) +endif() + set(common_HEADERS ${GLFW_SOURCE_DIR}/include/GL/glfw3.h internal.h) set(common_SOURCES clipboard.c fullscreen.c gamma.c init.c input.c joystick.c opengl.c time.c window.c) diff --git a/tests/threads.c b/tests/threads.c index 35c83716..49e3739a 100644 --- a/tests/threads.c +++ b/tests/threads.c @@ -28,6 +28,8 @@ // //======================================================================== +#include "tinycthread.h" + #include #include @@ -35,8 +37,6 @@ #include #include -#include "tinycthread.h" - typedef struct { GLFWwindow window; From fe0cc512a29ae389630954eadd70dc5ce235d95d Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Thu, 27 Sep 2012 15:18:57 +0200 Subject: [PATCH 03/41] Added missing cast. --- src/window.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/window.c b/src/window.c index e9da2367..901d9a77 100644 --- a/src/window.c +++ b/src/window.c @@ -268,7 +268,7 @@ GLFWAPI GLFWwindow glfwCreateWindow(int width, int height, wndconfig.glDebug = _glfwLibrary.hints.glDebug ? GL_TRUE : GL_FALSE; wndconfig.glProfile = _glfwLibrary.hints.glProfile; wndconfig.glRobustness = _glfwLibrary.hints.glRobustness ? GL_TRUE : GL_FALSE; - wndconfig.share = share; + wndconfig.share = (_GLFWwindow*) share; // Reset to default values for the next call _glfwSetDefaultWindowHints(); From 410a4e29e133fe911c817fb1061df16420c4365a Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Thu, 27 Sep 2012 22:28:04 +0200 Subject: [PATCH 04/41] Moved from gl3.h to glcorearb.h. --- include/GL/glfw3.h | 6 +++--- readme.html | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h index dae1cc6a..3ef25d16 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -141,7 +141,7 @@ extern "C" { /* Include the chosen OpenGL header and, optionally, the GLU header. */ #if defined(__APPLE_CC__) - #if defined(GLFW_INCLUDE_GL3) + #if defined(GLFW_INCLUDE_GLCOREARB) #include #else #define GL_GLEXT_LEGACY @@ -151,8 +151,8 @@ extern "C" { #include #endif #else - #if defined(GLFW_INCLUDE_GL3) - #include + #if defined(GLFW_INCLUDE_GLCOREARB) + #include #else #include #endif diff --git a/readme.html b/readme.html index c6047bb7..633c775e 100644 --- a/readme.html +++ b/readme.html @@ -282,7 +282,7 @@ version of GLFW.

  • Added GLFW_OPENGL_ES2_PROFILE profile for creating OpenGL ES 2.0 contexts using the GLX_EXT_create_context_es2_profile and WGL_EXT_create_context_es2_profile extensions
  • 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_GL3 macro for telling the GLFW header to include gl3.h header instead of gl.h
  • +
  • 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 windows simple multi-window test program
  • Added sharing simple OpenGL object sharing test program
  • From 38cad9aff0d6ef33bdb547b8b9f45f58ae119165 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sun, 30 Sep 2012 15:32:50 +0200 Subject: [PATCH 05/41] Added client API window hint. This is cherry-picked from the EGL branch in preparation for the EGL backend. --- include/GL/glfw3.h | 22 +++--- readme.html | 2 +- src/cocoa_window.m | 7 ++ src/internal.h | 3 + src/opengl.c | 178 ++++++++++++++++++++++++++++----------------- src/win32_opengl.c | 26 ++++--- src/window.c | 5 ++ src/x11_opengl.c | 27 ++++--- tests/glfwinfo.c | 133 +++++++++++++++++++-------------- 9 files changed, 250 insertions(+), 153 deletions(-) diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h index 3ef25d16..968ab0db 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -404,14 +404,19 @@ extern "C" { /* The following constants are used with both glfwGetWindowParam * and glfwWindowHint */ -#define GLFW_OPENGL_VERSION_MAJOR 0x00022000 -#define GLFW_OPENGL_VERSION_MINOR 0x00022001 -#define GLFW_OPENGL_FORWARD_COMPAT 0x00022002 -#define GLFW_OPENGL_DEBUG_CONTEXT 0x00022003 -#define GLFW_OPENGL_PROFILE 0x00022004 -#define GLFW_OPENGL_ROBUSTNESS 0x00022005 -#define GLFW_RESIZABLE 0x00022006 -#define GLFW_VISIBLE 0x00022007 +#define GLFW_CLIENT_API 0x00022000 +#define GLFW_OPENGL_VERSION_MAJOR 0x00022001 +#define GLFW_OPENGL_VERSION_MINOR 0x00022002 +#define GLFW_OPENGL_FORWARD_COMPAT 0x00022003 +#define GLFW_OPENGL_DEBUG_CONTEXT 0x00022004 +#define GLFW_OPENGL_PROFILE 0x00022005 +#define GLFW_OPENGL_ROBUSTNESS 0x00022006 +#define GLFW_RESIZABLE 0x00022007 +#define GLFW_VISIBLE 0x00022008 + +/* GLFW_CLIENT_API tokens */ +#define GLFW_OPENGL_API 0x00000001 +#define GLFW_OPENGL_ES_API 0x00000002 /* GLFW_OPENGL_ROBUSTNESS mode tokens */ #define GLFW_OPENGL_NO_ROBUSTNESS 0x00000000 @@ -422,7 +427,6 @@ extern "C" { #define GLFW_OPENGL_NO_PROFILE 0x00000000 #define GLFW_OPENGL_CORE_PROFILE 0x00000001 #define GLFW_OPENGL_COMPAT_PROFILE 0x00000002 -#define GLFW_OPENGL_ES2_PROFILE 0x00000004 /* glfwGetInputMode/glfwSetInputMode tokens */ #define GLFW_CURSOR_MODE 0x00030001 diff --git a/readme.html b/readme.html index 633c775e..22e2b6bb 100644 --- a/readme.html +++ b/readme.html @@ -279,7 +279,7 @@ version of GLFW.

  • 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_OPENGL_ES2_PROFILE profile for creating OpenGL ES 2.0 contexts using the GLX_EXT_create_context_es2_profile and WGL_EXT_create_context_es2_profile extensions
  • +
  • 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
  • diff --git a/src/cocoa_window.m b/src/cocoa_window.m index efdc0c6b..ed10d384 100644 --- a/src/cocoa_window.m +++ b/src/cocoa_window.m @@ -729,6 +729,13 @@ static GLboolean createContext(_GLFWwindow* window, else if (colorBits < 15) colorBits = 15; + if (wndconfig->clientAPI != GLFW_OPENGL_ES_API) + { + _glfwSetError(GLFW_VERSION_UNAVAILABLE, + "Cocoa/NSOpenGL: NSOpenGL does not support OpenGL ES"); + return GL_FALSE; + } + #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 // Fail if any OpenGL version above 2.1 other than 3.2 was requested if (wndconfig->glMajor > 3 || diff --git a/src/internal.h b/src/internal.h index b41e0b2c..67aa3151 100644 --- a/src/internal.h +++ b/src/internal.h @@ -100,6 +100,7 @@ struct _GLFWhints GLboolean resizable; GLboolean visible; int samples; + int clientAPI; int glMajor; int glMinor; GLboolean glForward; @@ -122,6 +123,7 @@ struct _GLFWwndconfig int refreshRate; GLboolean resizable; GLboolean visible; + int clientAPI; int glMajor; int glMinor; GLboolean glForward; @@ -188,6 +190,7 @@ struct _GLFWwindow char key[GLFW_KEY_LAST + 1]; // OpenGL extensions and context attributes + int clientAPI; int glMajor, glMinor, glRevision; GLboolean glForward, glDebug; int glProfile; diff --git a/src/opengl.c b/src/opengl.c index 6f80fd7b..482db6ad 100644 --- a/src/opengl.c +++ b/src/opengl.c @@ -36,15 +36,17 @@ //======================================================================== -// Parses the OpenGL version string and extracts the version number +// Parses the client API version string and extracts the version number //======================================================================== -static GLboolean parseGLVersion(int* major, int* minor, int* rev) +static GLboolean parseGLVersion(int* api, int* major, int* minor, int* rev) { - int i, _major, _minor = 0, _rev = 0; + int i, _api = GLFW_OPENGL_API, _major, _minor = 0, _rev = 0; const char* version; const char* prefixes[] = { + "OpenGL ES-CM ", + "OpenGL ES-CL ", "OpenGL ES ", NULL }; @@ -63,6 +65,7 @@ static GLboolean parseGLVersion(int* major, int* minor, int* rev) if (strncmp(version, prefixes[i], length) == 0) { version += length; + _api = GLFW_OPENGL_ES_API; break; } } @@ -73,6 +76,7 @@ static GLboolean parseGLVersion(int* major, int* minor, int* rev) return GL_FALSE; } + *api = _api; *major = _major; *minor = _minor; *rev = _rev; @@ -249,83 +253,119 @@ const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired, GLboolean _glfwIsValidContextConfig(_GLFWwndconfig* wndconfig) { - if (wndconfig->glMajor < 1 || wndconfig->glMinor < 0) + if (wndconfig->clientAPI != GLFW_OPENGL_API && + wndconfig->clientAPI != GLFW_OPENGL_ES_API) { - // OpenGL 1.0 is the smallest valid version - _glfwSetError(GLFW_INVALID_VALUE, - "glfwCreateWindow: Invalid OpenGL version requested"); + _glfwSetError(GLFW_INVALID_ENUM, + "glfwCreateWindow: Invalid client API requested"); return GL_FALSE; } - if (wndconfig->glMajor == 1 && wndconfig->glMinor > 5) - { - // OpenGL 1.x series ended with version 1.5 - _glfwSetError(GLFW_INVALID_VALUE, - "glfwCreateWindow: Invalid OpenGL version requested"); - return GL_FALSE; - } - else if (wndconfig->glMajor == 2 && wndconfig->glMinor > 1) - { - // OpenGL 2.x series ended with version 2.1 - _glfwSetError(GLFW_INVALID_VALUE, - "glfwCreateWindow: Invalid OpenGL version requested"); - return GL_FALSE; - } - else if (wndconfig->glMajor == 3 && wndconfig->glMinor > 3) - { - // OpenGL 3.x series ended with version 3.3 - _glfwSetError(GLFW_INVALID_VALUE, - "glfwCreateWindow: Invalid OpenGL version requested"); - return GL_FALSE; - } - else - { - // For now, let everything else through - } - if (wndconfig->glProfile == GLFW_OPENGL_ES2_PROFILE) + if (wndconfig->clientAPI == GLFW_OPENGL_API) { - if (wndconfig->glMajor != 2 || wndconfig->glMinor < 0) + if (wndconfig->glMajor < 1 || wndconfig->glMinor < 0) { - // The OpenGL ES 2.0 profile is currently only defined for version - // 2.0 (see {WGL|GLX}_EXT_create_context_es2_profile), but for - // compatibility with future updates to OpenGL ES, we allow - // everything 2.x and let the driver report invalid 2.x versions - + // OpenGL 1.0 is the smallest valid version _glfwSetError(GLFW_INVALID_VALUE, - "glfwCreateWindow: Invalid OpenGL ES 2.x version requested"); + "glfwCreateWindow: Invalid OpenGL version requested"); return GL_FALSE; } - } - else if (wndconfig->glProfile) - { - if (wndconfig->glProfile != GLFW_OPENGL_CORE_PROFILE && - wndconfig->glProfile != GLFW_OPENGL_COMPAT_PROFILE) + if (wndconfig->glMajor == 1 && wndconfig->glMinor > 5) { - _glfwSetError(GLFW_INVALID_ENUM, - "glfwCreateWindow: Invalid OpenGL profile requested"); - return GL_FALSE; - } - - if (wndconfig->glMajor < 3 || - (wndconfig->glMajor == 3 && wndconfig->glMinor < 2)) - { - // Desktop OpenGL context profiles are only defined for version 3.2 - // and above - + // OpenGL 1.x series ended with version 1.5 _glfwSetError(GLFW_INVALID_VALUE, - "glfwCreateWindow: Context profiles only exist for " - "OpenGL version 3.2 and above"); + "glfwCreateWindow: Invalid OpenGL version requested"); + return GL_FALSE; + } + else if (wndconfig->glMajor == 2 && wndconfig->glMinor > 1) + { + // OpenGL 2.x series ended with version 2.1 + _glfwSetError(GLFW_INVALID_VALUE, + "glfwCreateWindow: Invalid OpenGL version requested"); + return GL_FALSE; + } + else if (wndconfig->glMajor == 3 && wndconfig->glMinor > 3) + { + // OpenGL 3.x series ended with version 3.3 + _glfwSetError(GLFW_INVALID_VALUE, + "glfwCreateWindow: Invalid OpenGL version requested"); + return GL_FALSE; + } + else + { + // For now, let everything else through + } + + if (wndconfig->glProfile) + { + if (wndconfig->glProfile != GLFW_OPENGL_CORE_PROFILE && + wndconfig->glProfile != GLFW_OPENGL_COMPAT_PROFILE) + { + _glfwSetError(GLFW_INVALID_ENUM, + "glfwCreateWindow: Invalid OpenGL profile requested"); + return GL_FALSE; + } + + if (wndconfig->glMajor < 3 || + (wndconfig->glMajor == 3 && wndconfig->glMinor < 2)) + { + // Desktop OpenGL context profiles are only defined for version 3.2 + // and above + + _glfwSetError(GLFW_INVALID_VALUE, + "glfwCreateWindow: Context profiles only exist for " + "OpenGL version 3.2 and above"); + return GL_FALSE; + } + } + + if (wndconfig->glForward && wndconfig->glMajor < 3) + { + // Forward-compatible contexts are only defined for OpenGL version 3.0 and above + _glfwSetError(GLFW_INVALID_VALUE, + "glfwCreateWindow: Forward compatibility only exist " + "for OpenGL version 3.0 and above"); return GL_FALSE; } } - - if (wndconfig->glForward && wndconfig->glMajor < 3) + else if (wndconfig->clientAPI == GLFW_OPENGL_ES_API) { - // Forward-compatible contexts are only defined for OpenGL version 3.0 and above - _glfwSetError(GLFW_INVALID_VALUE, - "glfwCreateWindow: Forward compatibility only exist for " - "OpenGL version 3.0 and above"); - return GL_FALSE; + if (wndconfig->glMajor < 1 || wndconfig->glMinor < 0) + { + // OpenGL ES 1.0 is the smallest valid version + _glfwSetError(GLFW_INVALID_VALUE, + "glfwCreateWindow: Invalid OpenGL ES version requested"); + return GL_FALSE; + } + if (wndconfig->glMajor == 1 && wndconfig->glMinor > 1) + { + // OpenGL ES 1.x series ended with version 1.1 + _glfwSetError(GLFW_INVALID_VALUE, + "glfwCreateWindow: Invalid OpenGL ES version requested"); + return GL_FALSE; + } + else + { + // For now, let everything else through + } + + if (wndconfig->glProfile) + { + // OpenGL ES does not support profiles + _glfwSetError(GLFW_INVALID_VALUE, + "glfwCreateWindow: Context profiles are not supported " + "by OpenGL ES"); + return GL_FALSE; + } + + if (wndconfig->glForward) + { + // OpenGL ES does not support forward-compatibility + _glfwSetError(GLFW_INVALID_VALUE, + "glfwCreateWindow: Forward compatibility is not " + "supported by OpenGL ES"); + return GL_FALSE; + } } if (wndconfig->glRobustness) @@ -334,7 +374,8 @@ GLboolean _glfwIsValidContextConfig(_GLFWwndconfig* wndconfig) wndconfig->glRobustness != GLFW_OPENGL_LOSE_CONTEXT_ON_RESET) { _glfwSetError(GLFW_INVALID_VALUE, - "glfwCreateWindow: Invalid OpenGL robustness mode requested"); + "glfwCreateWindow: Invalid OpenGL robustness mode " + "requested"); return GL_FALSE; } } @@ -352,7 +393,8 @@ GLboolean _glfwRefreshContextParams(void) { _GLFWwindow* window = _glfwPlatformGetCurrentContext(); - if (!parseGLVersion(&window->glMajor, + if (!parseGLVersion(&window->clientAPI, + &window->glMajor, &window->glMinor, &window->glRevision)) { @@ -378,7 +420,7 @@ GLboolean _glfwRefreshContextParams(void) { window->glForward = GL_FALSE; - if (window->glMajor >= 3) + if (window->clientAPI == GLFW_OPENGL_API && window->glMajor >= 3) { GLint flags; glGetIntegerv(GL_CONTEXT_FLAGS, &flags); diff --git a/src/win32_opengl.c b/src/win32_opengl.c index d6e1b490..0bcfe452 100644 --- a/src/win32_opengl.c +++ b/src/win32_opengl.c @@ -356,6 +356,21 @@ static GLboolean createContext(_GLFWwindow* window, attribs[i++] = wndconfig->glMinor; } + if (wndconfig->clientAPI == GLFW_OPENGL_ES_API) + { + if (!window->WGL.ARB_create_context_profile || + !window->WGL.EXT_create_context_es2_profile) + { + _glfwSetError(GLFW_VERSION_UNAVAILABLE, + "Win32/WGL: OpenGL ES 2.x requested but " + "WGL_EXT_create_context_es2_profile is unavailable"); + return GL_FALSE; + } + + attribs[i++] = WGL_CONTEXT_PROFILE_MASK_ARB; + attribs[i++] = WGL_CONTEXT_ES2_PROFILE_BIT_EXT; + } + if (wndconfig->glForward || wndconfig->glDebug || wndconfig->glRobustness) { int flags = 0; @@ -385,21 +400,10 @@ static GLboolean createContext(_GLFWwindow* window, return GL_FALSE; } - if (wndconfig->glProfile == GLFW_OPENGL_ES2_PROFILE && - !window->WGL.EXT_create_context_es2_profile) - { - _glfwSetError(GLFW_VERSION_UNAVAILABLE, - "WGL: OpenGL ES 2.x profile requested but " - "WGL_EXT_create_context_es2_profile is unavailable"); - return GL_FALSE; - } - if (wndconfig->glProfile == GLFW_OPENGL_CORE_PROFILE) flags = WGL_CONTEXT_CORE_PROFILE_BIT_ARB; else if (wndconfig->glProfile == GLFW_OPENGL_COMPAT_PROFILE) flags = WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB; - else if (wndconfig->glProfile == GLFW_OPENGL_ES2_PROFILE) - flags = WGL_CONTEXT_ES2_PROFILE_BIT_EXT; attribs[i++] = WGL_CONTEXT_PROFILE_MASK_ARB; attribs[i++] = flags; diff --git a/src/window.c b/src/window.c index 901d9a77..5c2bd864 100644 --- a/src/window.c +++ b/src/window.c @@ -77,6 +77,7 @@ void _glfwSetDefaultWindowHints(void) memset(&_glfwLibrary.hints, 0, sizeof(_glfwLibrary.hints)); // The default minimum OpenGL version is 1.0 + _glfwLibrary.hints.clientAPI = GLFW_OPENGL_API; _glfwLibrary.hints.glMajor = 1; _glfwLibrary.hints.glMinor = 0; @@ -262,6 +263,7 @@ 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.clientAPI = _glfwLibrary.hints.clientAPI; wndconfig.glMajor = _glfwLibrary.hints.glMajor; wndconfig.glMinor = _glfwLibrary.hints.glMinor; wndconfig.glForward = _glfwLibrary.hints.glForward ? GL_TRUE : GL_FALSE; @@ -436,6 +438,9 @@ GLFWAPI void glfwWindowHint(int target, int hint) case GLFW_FSAA_SAMPLES: _glfwLibrary.hints.samples = hint; break; + case GLFW_CLIENT_API: + _glfwLibrary.hints.clientAPI = hint; + break; case GLFW_OPENGL_VERSION_MAJOR: _glfwLibrary.hints.glMajor = hint; break; diff --git a/src/x11_opengl.c b/src/x11_opengl.c index af1e0ffb..19e04a4f 100644 --- a/src/x11_opengl.c +++ b/src/x11_opengl.c @@ -295,6 +295,22 @@ static int createContext(_GLFWwindow* window, setGLXattrib(attribs, index, GLX_CONTEXT_MINOR_VERSION_ARB, wndconfig->glMinor); } + if (wndconfig->clientAPI == GLFW_OPENGL_ES_API) + { + if (!_glfwLibrary.GLX.ARB_create_context_profile || + !_glfwLibrary.GLX.EXT_create_context_es2_profile) + { + _glfwSetError(GLFW_VERSION_UNAVAILABLE, + "GLX: OpenGL ES 2.x requested but " + "GLX_EXT_create_context_es2_profile is unavailable"); + return GL_FALSE; + } + + setGLXattrib(attribs, index, + GLX_CONTEXT_PROFILE_MASK_ARB, + GLX_CONTEXT_ES2_PROFILE_BIT_EXT); + } + if (wndconfig->glForward || wndconfig->glDebug || wndconfig->glRobustness) { int flags = 0; @@ -323,21 +339,10 @@ static int createContext(_GLFWwindow* window, return GL_FALSE; } - if (wndconfig->glProfile == GLFW_OPENGL_ES2_PROFILE && - !_glfwLibrary.GLX.EXT_create_context_es2_profile) - { - _glfwSetError(GLFW_VERSION_UNAVAILABLE, - "GLX: OpenGL ES 2.x profile requested but " - "GLX_EXT_create_context_es2_profile is unavailable"); - return GL_FALSE; - } - if (wndconfig->glProfile == GLFW_OPENGL_CORE_PROFILE) flags = GLX_CONTEXT_CORE_PROFILE_BIT_ARB; else if (wndconfig->glProfile == GLFW_OPENGL_COMPAT_PROFILE) flags = GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB; - else if (wndconfig->glProfile == GLFW_OPENGL_ES2_PROFILE) - flags = GLX_CONTEXT_ES2_PROFILE_BIT_EXT; setGLXattrib(attribs, index, GLX_CONTEXT_PROFILE_MASK_ARB, flags); } diff --git a/tests/glfwinfo.c b/tests/glfwinfo.c index d11c861d..dea207c9 100644 --- a/tests/glfwinfo.c +++ b/tests/glfwinfo.c @@ -42,17 +42,20 @@ #define strcasecmp(x, y) _stricmp(x, y) #endif +#define API_OPENGL "gl" +#define API_OPENGL_ES "es" + #define PROFILE_NAME_CORE "core" #define PROFILE_NAME_COMPAT "compat" -#define PROFILE_NAME_ES2 "es2" #define STRATEGY_NAME_NONE "none" #define STRATEGY_NAME_LOSE "lose" static void usage(void) { - printf("Usage: glfwinfo [-h] [-m MAJOR] [-n MINOR] [-d] [-l] [-f] [-p PROFILE] [-r STRATEGY]\n"); - printf("available profiles: " PROFILE_NAME_CORE " " PROFILE_NAME_COMPAT " " PROFILE_NAME_ES2 "\n"); + printf("Usage: glfwinfo [-h] [-a API] [-m MAJOR] [-n MINOR] [-d] [-l] [-f] [-p PROFILE] [-r STRATEGY]\n"); + printf("available APIs: " API_OPENGL " " API_OPENGL_ES "\n"); + printf("available profiles: " PROFILE_NAME_CORE " " PROFILE_NAME_COMPAT "\n"); printf("available strategies: " STRATEGY_NAME_NONE " " STRATEGY_NAME_LOSE "\n"); } @@ -61,37 +64,35 @@ static void error_callback(int error, const char* description) fprintf(stderr, "Error: %s in %s\n", glfwErrorString(error), description); } -static const char* get_glfw_profile_name(int profile) +static const char* get_client_api_name(int api) { - if (profile == GLFW_OPENGL_COMPAT_PROFILE) - return PROFILE_NAME_COMPAT; - else if (profile == GLFW_OPENGL_CORE_PROFILE) - return PROFILE_NAME_CORE; - else if (profile == GLFW_OPENGL_ES2_PROFILE) - return PROFILE_NAME_ES2; + if (api == GLFW_OPENGL_API) + return "OpenGL"; + else if (api == GLFW_OPENGL_ES_API) + return "OpenGL ES"; - return "unknown"; + return "Unknown API"; } static const char* get_profile_name(GLint mask) { if (mask & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT) - return PROFILE_NAME_COMPAT; + return "compatibility"; if (mask & GL_CONTEXT_CORE_PROFILE_BIT) - return PROFILE_NAME_CORE; + return "core"; return "unknown"; } -static void list_extensions(int major, int minor) +static void list_extensions(int api, int major, int minor) { int i; GLint count; const GLubyte* extensions; - printf("OpenGL context supported extensions:\n"); + printf("%s context supported extensions:\n", get_client_api_name(api)); - if (major > 2) + if (api == GLFW_OPENGL_API && major > 2) { PFNGLGETSTRINGIPROC glGetStringi = (PFNGLGETSTRINGIPROC) glfwGetProcAddress("glGetStringi"); if (!glGetStringi) @@ -147,7 +148,7 @@ static GLboolean valid_version(void) int main(int argc, char** argv) { - int ch, profile = 0, strategy = 0, major = 1, minor = 0, revision; + int ch, api = 0, profile = 0, strategy = 0, major = 1, minor = 0, revision; GLboolean debug = GL_FALSE, forward = GL_FALSE, list = GL_FALSE; GLint flags, mask; GLFWwindow window; @@ -155,10 +156,20 @@ int main(int argc, char** argv) if (!valid_version()) exit(EXIT_FAILURE); - while ((ch = getopt(argc, argv, "dfhlm:n:p:r:")) != -1) + while ((ch = getopt(argc, argv, "a:dfhlm:n:p:r:")) != -1) { switch (ch) { + case 'a': + if (strcasecmp(optarg, API_OPENGL) == 0) + api = GLFW_OPENGL_API; + else if (strcasecmp(optarg, API_OPENGL_ES) == 0) + api = GLFW_OPENGL_ES_API; + else + { + usage(); + exit(EXIT_FAILURE); + } case 'd': debug = GL_TRUE; break; @@ -182,8 +193,6 @@ int main(int argc, char** argv) profile = GLFW_OPENGL_CORE_PROFILE; else if (strcasecmp(optarg, PROFILE_NAME_COMPAT) == 0) profile = GLFW_OPENGL_COMPAT_PROFILE; - else if (strcasecmp(optarg, PROFILE_NAME_ES2) == 0) - profile = GLFW_OPENGL_ES2_PROFILE; else { usage(); @@ -226,6 +235,9 @@ int main(int argc, char** argv) glfwWindowHint(GLFW_OPENGL_VERSION_MINOR, minor); } + if (api != 0) + glfwWindowHint(GLFW_CLIENT_API, api); + if (debug) glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE); @@ -249,62 +261,77 @@ int main(int argc, char** argv) glfwMakeContextCurrent(window); - // Report OpenGL version - - printf("OpenGL context version string: \"%s\"\n", glGetString(GL_VERSION)); + // Report client API version + api = glfwGetWindowParam(window, GLFW_CLIENT_API); major = glfwGetWindowParam(window, GLFW_OPENGL_VERSION_MAJOR); minor = glfwGetWindowParam(window, GLFW_OPENGL_VERSION_MINOR); revision = glfwGetWindowParam(window, GLFW_OPENGL_REVISION); - printf("OpenGL context version parsed by GLFW: %u.%u.%u\n", major, minor, revision); + printf("%s context version string: \"%s\"\n", + get_client_api_name(api), + glGetString(GL_VERSION)); - // Report OpenGL context properties + printf("%s context version parsed by GLFW: %u.%u.%u\n", + get_client_api_name(api), + major, minor, revision); - if (major >= 3) + // Report client API context properties + + if (api == GLFW_OPENGL_API) { - glGetIntegerv(GL_CONTEXT_FLAGS, &flags); - printf("OpenGL context flags (0x%08x):", flags); + if (major >= 3) + { + glGetIntegerv(GL_CONTEXT_FLAGS, &flags); + printf("%s context flags (0x%08x):", get_client_api_name(api), flags); - if (flags & GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT) - printf(" forward-compatible"); - if (flags & 0) - printf(" debug"); - putchar('\n'); + if (flags & GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT) + printf(" forward-compatible"); + if (flags & 0) + printf(" debug"); + putchar('\n'); - printf("OpenGL context flags parsed by GLFW:"); + printf("%s context flags parsed by GLFW:", get_client_api_name(api)); - if (glfwGetWindowParam(window, GLFW_OPENGL_FORWARD_COMPAT)) - printf(" forward-compatible"); - if (glfwGetWindowParam(window, GLFW_OPENGL_DEBUG_CONTEXT)) - printf(" debug"); - putchar('\n'); + if (glfwGetWindowParam(window, GLFW_OPENGL_FORWARD_COMPAT)) + printf(" forward-compatible"); + if (glfwGetWindowParam(window, GLFW_OPENGL_DEBUG_CONTEXT)) + printf(" debug"); + putchar('\n'); + } + + if (major > 3 || (major == 3 && minor >= 2)) + { + glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &mask); + printf("%s profile mask (0x%08x): %s\n", + get_client_api_name(api), + mask, + get_profile_name(mask)); + + printf("%s profile mask parsed by GLFW:\n", get_client_api_name(api)); + } } - if (major > 3 || (major == 3 && minor >= 2)) - { - glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &mask); - printf("OpenGL profile mask (0x%08x): %s\n", mask, get_profile_name(mask)); - - printf("OpenGL profile mask parsed by GLFW: %s\n", - get_glfw_profile_name(glfwGetWindowParam(window, GLFW_OPENGL_PROFILE))); - } + printf("%s context renderer string: \"%s\"\n", + get_client_api_name(api), + glGetString(GL_RENDERER)); + printf("%s context vendor string: \"%s\"\n", + get_client_api_name(api), + glGetString(GL_VENDOR)); printf("OpenGL context debug flag saved by GLFW: %s\n", glfwGetWindowParam(window, GLFW_OPENGL_DEBUG_CONTEXT) ? "true" : "false"); - printf("OpenGL context renderer string: \"%s\"\n", glGetString(GL_RENDERER)); - printf("OpenGL context vendor string: \"%s\"\n", glGetString(GL_VENDOR)); - if (major > 1) { - printf("OpenGL context shading language version: \"%s\"\n", + printf("%s context shading language version: \"%s\"\n", + get_client_api_name(api), glGetString(GL_SHADING_LANGUAGE_VERSION)); } - // Report OpenGL extensions + // Report client API extensions if (list) - list_extensions(major, minor); + list_extensions(api, major, minor); glfwTerminate(); exit(EXIT_SUCCESS); From c764ae81e8d232e1fb49062190a195110c60a8c9 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sun, 30 Sep 2012 15:43:26 +0200 Subject: [PATCH 06/41] Added missing window parameter return. --- src/window.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/window.c b/src/window.c index 5c2bd864..2a4f3d85 100644 --- a/src/window.c +++ b/src/window.c @@ -745,6 +745,8 @@ GLFWAPI int glfwGetWindowParam(GLFWwindow handle, int param) return window->resizable; case GLFW_VISIBLE: return window->visible; + case GLFW_CLIENT_API: + return window->clientAPI; case GLFW_OPENGL_VERSION_MAJOR: return window->glMajor; case GLFW_OPENGL_VERSION_MINOR: From 937f137246fecd28e0279d3ca1818fa1470ef243 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sun, 30 Sep 2012 15:51:46 +0200 Subject: [PATCH 07/41] Improved error formatting. --- tests/glfwinfo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/glfwinfo.c b/tests/glfwinfo.c index dea207c9..1fa9fa2f 100644 --- a/tests/glfwinfo.c +++ b/tests/glfwinfo.c @@ -61,7 +61,7 @@ static void usage(void) static void error_callback(int error, const char* description) { - fprintf(stderr, "Error: %s in %s\n", glfwErrorString(error), description); + fprintf(stderr, "Error: %s\n", description); } static const char* get_client_api_name(int api) From d00c194f4ab4c0cd84bd78e4d5b92d79da7371ae Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sun, 30 Sep 2012 15:51:59 +0200 Subject: [PATCH 08/41] Added 8 bits of stencil to defaults. --- src/window.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/window.c b/src/window.c index 2a4f3d85..42ae6628 100644 --- a/src/window.c +++ b/src/window.c @@ -85,11 +85,12 @@ void _glfwSetDefaultWindowHints(void) _glfwLibrary.hints.resizable = GL_TRUE; _glfwLibrary.hints.visible = GL_TRUE; - // The default is 24 bits of depth, 8 bits of color - _glfwLibrary.hints.depthBits = 24; - _glfwLibrary.hints.redBits = 8; - _glfwLibrary.hints.greenBits = 8; - _glfwLibrary.hints.blueBits = 8; + // The default is 24 bits of color, 24 bits of depth and 8 bits of stencil + _glfwLibrary.hints.redBits = 8; + _glfwLibrary.hints.greenBits = 8; + _glfwLibrary.hints.blueBits = 8; + _glfwLibrary.hints.depthBits = 24; + _glfwLibrary.hints.stencilBits = 8; } From 5fcfcb2ddc2da28d3f7bd9ea13ecbc6ab53d2302 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sun, 30 Sep 2012 15:53:20 +0200 Subject: [PATCH 09/41] Updated comment. --- src/window.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/window.c b/src/window.c index 42ae6628..0b6fb9bd 100644 --- a/src/window.c +++ b/src/window.c @@ -76,7 +76,7 @@ void _glfwSetDefaultWindowHints(void) { memset(&_glfwLibrary.hints, 0, sizeof(_glfwLibrary.hints)); - // The default minimum OpenGL version is 1.0 + // The default is OpenGL with minimum version 1.0 _glfwLibrary.hints.clientAPI = GLFW_OPENGL_API; _glfwLibrary.hints.glMajor = 1; _glfwLibrary.hints.glMinor = 0; From 21a015778fca0c5f379894adc66ab2292c8f2891 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Tue, 2 Oct 2012 17:07:59 +0200 Subject: [PATCH 10/41] Replaced malloc and memset with calloc. --- src/window.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/window.c b/src/window.c index 0b6fb9bd..741938d1 100644 --- a/src/window.c +++ b/src/window.c @@ -308,15 +308,13 @@ GLFWAPI GLFWwindow glfwCreateWindow(int width, int height, height = 480; } - window = (_GLFWwindow*) malloc(sizeof(_GLFWwindow)); + window = (_GLFWwindow*) calloc(1, sizeof(_GLFWwindow)); if (!window) { _glfwSetError(GLFW_OUT_OF_MEMORY, NULL); return NULL; } - memset(window, 0, sizeof(_GLFWwindow)); - window->next = _glfwLibrary.windowListHead; _glfwLibrary.windowListHead = window; From f236fc2f613484c6daf01c61297133a80a6df22e Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Tue, 2 Oct 2012 18:03:21 +0200 Subject: [PATCH 11/41] Fixed X11 hidden cursor mode. --- src/x11_window.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/x11_window.c b/src/x11_window.c index 9cadaeac..ae920e7f 100644 --- a/src/x11_window.c +++ b/src/x11_window.c @@ -238,6 +238,15 @@ static GLboolean createWindow(_GLFWwindow* window, static void hideCursor(_GLFWwindow* window) { + // Un-grab cursor (in windowed mode only; in fullscreen mode we still + // want the cursor grabbed in order to confine the cursor to the window + // area) + if (window->X11.cursorGrabbed && window->mode == GLFW_WINDOWED) + { + XUngrabPointer(_glfwLibrary.X11.display, CurrentTime); + window->X11.cursorGrabbed = GL_FALSE; + } + if (!window->X11.cursorHidden) { XDefineCursor(_glfwLibrary.X11.display, @@ -280,7 +289,7 @@ static void showCursor(_GLFWwindow* window) // Un-grab cursor (in windowed mode only; in fullscreen mode we still // want the cursor grabbed in order to confine the cursor to the window // area) - if (window->X11.cursorGrabbed) + if (window->X11.cursorGrabbed && window->mode == GLFW_WINDOWED) { XUngrabPointer(_glfwLibrary.X11.display, CurrentTime); window->X11.cursorGrabbed = GL_FALSE; From ae5da60c189ece319b2e47a29dffb152411540a7 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Thu, 4 Oct 2012 04:05:37 +0200 Subject: [PATCH 12/41] Fixed test for wrong client API. --- src/cocoa_window.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cocoa_window.m b/src/cocoa_window.m index ed10d384..e3a88901 100644 --- a/src/cocoa_window.m +++ b/src/cocoa_window.m @@ -729,7 +729,7 @@ static GLboolean createContext(_GLFWwindow* window, else if (colorBits < 15) colorBits = 15; - if (wndconfig->clientAPI != GLFW_OPENGL_ES_API) + if (wndconfig->clientAPI != GLFW_OPENGL_API) { _glfwSetError(GLFW_VERSION_UNAVAILABLE, "Cocoa/NSOpenGL: NSOpenGL does not support OpenGL ES"); From 2bb62a14679cdf793b1595c420c8c89cac3ae9e3 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Thu, 4 Oct 2012 04:08:53 +0200 Subject: [PATCH 13/41] Bug fix formatting. --- src/cocoa_window.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cocoa_window.m b/src/cocoa_window.m index e3a88901..1ecc9655 100644 --- a/src/cocoa_window.m +++ b/src/cocoa_window.m @@ -729,7 +729,7 @@ static GLboolean createContext(_GLFWwindow* window, else if (colorBits < 15) colorBits = 15; - if (wndconfig->clientAPI != GLFW_OPENGL_API) + if (wndconfig->clientAPI == GLFW_OPENGL_ES_API) { _glfwSetError(GLFW_VERSION_UNAVAILABLE, "Cocoa/NSOpenGL: NSOpenGL does not support OpenGL ES"); From 2c6f4329a466c0aeb40ba2344ad0d093dd3c22fa Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Fri, 5 Oct 2012 04:00:27 +0200 Subject: [PATCH 14/41] Updated iconification test to use callbacks. --- tests/iconify.c | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/tests/iconify.c b/tests/iconify.c index 77815358..0ecde623 100644 --- a/tests/iconify.c +++ b/tests/iconify.c @@ -70,16 +70,29 @@ static void key_callback(GLFWwindow window, int key, int action) static void window_size_callback(GLFWwindow window, int width, int height) { - printf("%0.2f Size %ix%i\n", glfwGetTime(), width, height); + printf("%0.2f Window resized to %ix%i\n", glfwGetTime(), width, height); glViewport(0, 0, width, height); } +static void window_focus_callback(GLFWwindow window, int activated) +{ + printf("%0.2f Window %s\n", + glfwGetTime(), + activated ? "activated" : "deactivated"); +} + +static void window_iconify_callback(GLFWwindow window, int iconified) +{ + printf("%0.2f Window %s\n", + glfwGetTime(), + iconified ? "iconified" : "restored"); +} + int main(int argc, char** argv) { int width, height, ch; int mode = GLFW_WINDOWED; - GLboolean active = -1, iconified = -1; GLFWwindow window; while ((ch = getopt(argc, argv, "fh")) != -1) @@ -134,23 +147,17 @@ int main(int argc, char** argv) glfwSetKeyCallback(key_callback); glfwSetWindowSizeCallback(window_size_callback); glfwSetWindowCloseCallback(window_close_callback); + glfwSetWindowFocusCallback(window_focus_callback); + glfwSetWindowIconifyCallback(window_iconify_callback); + + printf("Window is %s and %s\n", + glfwGetWindowParam(window, GLFW_ICONIFIED) ? "iconified" : "restored", + glfwGetWindowParam(window, GLFW_ACTIVE) ? "active" : "inactive"); glEnable(GL_SCISSOR_TEST); while (!closed) { - if (iconified != glfwGetWindowParam(window, GLFW_ICONIFIED) || - active != glfwGetWindowParam(window, GLFW_ACTIVE)) - { - iconified = glfwGetWindowParam(window, GLFW_ICONIFIED); - active = glfwGetWindowParam(window, GLFW_ACTIVE); - - printf("%0.2f %s %s\n", - glfwGetTime(), - iconified ? "Iconified" : "Restored", - active ? "Active" : "Inactive"); - } - glfwGetWindowSize(window, &width, &height); glScissor(0, 0, width, height); From e6556c7f34a8e4f232fa6df0166d279e3d05c60e Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Wed, 17 Oct 2012 17:11:56 +0200 Subject: [PATCH 15/41] Comment grammar fix. --- src/cocoa_window.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cocoa_window.m b/src/cocoa_window.m index e3a88901..dc33f165 100644 --- a/src/cocoa_window.m +++ b/src/cocoa_window.m @@ -654,9 +654,9 @@ static GLboolean initializeAppKit(void) // Implicitly create shared NSApplication instance [GLFWApplication sharedApplication]; - // Setting up the menu bar must go between sharedApplication - // above and finishLaunching below, in order to properly emulate the - // behavior of NSApplicationMain + // Menu bar setup must go between sharedApplication above and + // finishLaunching below, in order to properly emulate the behavior + // of NSApplicationMain createMenuBar(); [NSApp finishLaunching]; From 550b0c177d61380116d8d7326bb79825bf9909a1 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Thu, 18 Oct 2012 16:25:15 +0200 Subject: [PATCH 16/41] Added missing initial value. --- src/win32_opengl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/win32_opengl.c b/src/win32_opengl.c index 0bcfe452..c326dac7 100644 --- a/src/win32_opengl.c +++ b/src/win32_opengl.c @@ -411,7 +411,7 @@ static GLboolean createContext(_GLFWwindow* window, if (wndconfig->glRobustness) { - int strategy; + int strategy = 0; if (!window->WGL.ARB_create_context_robustness) { From c1dcd29c71daca0db02e0158a87af54eac62b969 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sun, 21 Oct 2012 21:30:13 +0200 Subject: [PATCH 17/41] Fixed potential clearing of wrong context. --- src/cocoa_window.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/cocoa_window.m b/src/cocoa_window.m index 1ecc9655..5625d41d 100644 --- a/src/cocoa_window.m +++ b/src/cocoa_window.m @@ -969,7 +969,9 @@ void _glfwPlatformDestroyWindow(_GLFWwindow* window) [window->NSGL.pixelFormat release]; window->NSGL.pixelFormat = nil; - [NSOpenGLContext clearCurrentContext]; + if ([NSOpenGLContext currentContext] == window->NSGL.context) + [NSOpenGLContext clearCurrentContext]; + [window->NSGL.context release]; window->NSGL.context = nil; From 467d5016210cc8f13b6bde7812df7ea773a3dd79 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sun, 21 Oct 2012 21:57:29 +0200 Subject: [PATCH 18/41] Cleanup of context clearing during window destruction. --- src/cocoa_window.m | 3 --- src/win32_opengl.c | 5 ----- src/win32_window.c | 8 ++++++++ src/window.c | 4 ++-- src/x11_opengl.c | 2 -- 5 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/cocoa_window.m b/src/cocoa_window.m index c01582c1..fd60d0ee 100644 --- a/src/cocoa_window.m +++ b/src/cocoa_window.m @@ -969,9 +969,6 @@ void _glfwPlatformDestroyWindow(_GLFWwindow* window) [window->NSGL.pixelFormat release]; window->NSGL.pixelFormat = nil; - if ([NSOpenGLContext currentContext] == window->NSGL.context) - [NSOpenGLContext clearCurrentContext]; - [window->NSGL.context release]; window->NSGL.context = nil; diff --git a/src/win32_opengl.c b/src/win32_opengl.c index c326dac7..acbf09f5 100644 --- a/src/win32_opengl.c +++ b/src/win32_opengl.c @@ -528,11 +528,6 @@ int _glfwCreateContext(_GLFWwindow* window, void _glfwDestroyContext(_GLFWwindow* window) { - // This is duplicated from glfwDestroyWindow - // TODO: Stop duplicating code - if (window == _glfwCurrentWindow) - _glfwPlatformMakeContextCurrent(NULL); - if (window->WGL.context) { wglDeleteContext(window->WGL.context); diff --git a/src/win32_window.c b/src/win32_window.c index 6b275476..6bb9509d 100644 --- a/src/win32_window.c +++ b/src/win32_window.c @@ -947,8 +947,16 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window, // we're just creating an OpenGL 3.0+ context with the same pixel // format, but it's not worth the added code complexity + // First we clear the current context (the one we just created) + // This is usually done by glfwDestroyWindow, but as we're not doing + // full window destruction, it's duplicated here + _glfwPlatformMakeContextCurrent(NULL); + + // Next destroy the Win32 window and WGL context (without resetting or + // destroying the GLFW window object) destroyWindow(window); + // ...and then create them again, this time with better APIs if (!createWindow(window, wndconfig, fbconfig)) return GL_FALSE; } diff --git a/src/window.c b/src/window.c index 741938d1..bb1093f5 100644 --- a/src/window.c +++ b/src/window.c @@ -483,8 +483,8 @@ GLFWAPI void glfwDestroyWindow(GLFWwindow handle) if (window == NULL) return; - // Clear the current context if this window's context is current - // TODO: Re-examine this in light of multithreading + // The window's context must not be current on another thread when the + // window is destroyed if (window == _glfwPlatformGetCurrentContext()) _glfwPlatformMakeContextCurrent(NULL); diff --git a/src/x11_opengl.c b/src/x11_opengl.c index 19e04a4f..ccd59d87 100644 --- a/src/x11_opengl.c +++ b/src/x11_opengl.c @@ -619,8 +619,6 @@ void _glfwDestroyContext(_GLFWwindow* window) if (window->GLX.context) { - // Release and destroy the context - glXMakeCurrent(_glfwLibrary.X11.display, None, NULL); glXDestroyContext(_glfwLibrary.X11.display, window->GLX.context); window->GLX.context = NULL; } From bf43247aedab5262677373e93890d806ea10dc37 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sun, 21 Oct 2012 22:13:14 +0200 Subject: [PATCH 19/41] Fixed output of GLFW-parsed context profile by glfwinfo. --- tests/glfwinfo.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/tests/glfwinfo.c b/tests/glfwinfo.c index 1fa9fa2f..3b262852 100644 --- a/tests/glfwinfo.c +++ b/tests/glfwinfo.c @@ -74,7 +74,7 @@ static const char* get_client_api_name(int api) return "Unknown API"; } -static const char* get_profile_name(GLint mask) +static const char* get_profile_name_gl(GLint mask) { if (mask & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT) return "compatibility"; @@ -84,6 +84,16 @@ static const char* get_profile_name(GLint mask) return "unknown"; } +static const char* get_profile_name_glfw(int profile) +{ + if (profile == GLFW_OPENGL_COMPAT_PROFILE) + return "compatibility"; + if (profile == GLFW_OPENGL_CORE_PROFILE) + return "core"; + + return "unknown"; +} + static void list_extensions(int api, int major, int minor) { int i; @@ -302,13 +312,17 @@ int main(int argc, char** argv) if (major > 3 || (major == 3 && minor >= 2)) { + int profile = glfwGetWindowParam(window, GLFW_OPENGL_PROFILE); + glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &mask); printf("%s profile mask (0x%08x): %s\n", get_client_api_name(api), mask, - get_profile_name(mask)); + get_profile_name_gl(mask)); - printf("%s profile mask parsed by GLFW:\n", get_client_api_name(api)); + printf("%s profile mask parsed by GLFW: %s\n", + get_client_api_name(api), + get_profile_name_glfw(profile)); } } From 5df4df6ca49dc156556d177cf21c35e5f1545175 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Mon, 22 Oct 2012 02:59:05 +0200 Subject: [PATCH 20/41] Added glfwDefaultWindowHints. --- include/GL/glfw3.h | 1 + readme.html | 1 + src/init.c | 6 ++--- src/internal.h | 3 --- src/window.c | 61 ++++++++++++++++++++++++---------------------- 5 files changed, 37 insertions(+), 35 deletions(-) diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h index 968ab0db..df0ac6b1 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -529,6 +529,7 @@ GLFWAPI void glfwGetGammaRamp(GLFWgammaramp* ramp); GLFWAPI void glfwSetGammaRamp(const GLFWgammaramp* ramp); /* Window handling */ +GLFWAPI void glfwDefaultWindowHints(void); GLFWAPI void glfwWindowHint(int target, int hint); GLFWAPI GLFWwindow glfwCreateWindow(int width, int height, int mode, const char* title, GLFWwindow share); GLFWAPI void glfwDestroyWindow(GLFWwindow window); diff --git a/readme.html b/readme.html index 22e2b6bb..a40e1d35 100644 --- a/readme.html +++ b/readme.html @@ -268,6 +268,7 @@ version of GLFW.

    v3.0

    • Added GLFWwindow window handle type and updated window-related functions and callbacks to take a window handle
    • +
    • Added glfwDefaultWindowHints function for resetting all window hints to their default values
    • Added glfwMakeContextCurrent function for making the context of the specified window current
    • Added glfwGetError and glfwErrorString error reporting functions and a number of error tokens
    • Added glfwSetErrorCallback function and GLFWerrorfun type for receiving more specific and/or nested errors
    • diff --git a/src/init.c b/src/init.c index 7e9fe4e7..12d806cc 100644 --- a/src/init.c +++ b/src/init.c @@ -121,9 +121,6 @@ GLFWAPI int glfwInit(void) memset(&_glfwLibrary, 0, sizeof(_glfwLibrary)); - // Not all window hints have zero as their default value - _glfwSetDefaultWindowHints(); - if (!_glfwPlatformInit()) { _glfwPlatformTerminate(); @@ -134,6 +131,9 @@ GLFWAPI int glfwInit(void) _glfwInitialized = GL_TRUE; + // Not all window hints have zero as their default value + glfwDefaultWindowHints(); + return GL_TRUE; } diff --git a/src/internal.h b/src/internal.h index 67aa3151..01767c96 100644 --- a/src/internal.h +++ b/src/internal.h @@ -350,9 +350,6 @@ void _glfwSplitBPP(int bpp, int* red, int* green, int* blue); // Error handling (init.c) void _glfwSetError(int error, const char* format, ...); -// Window management (window.c) -void _glfwSetDefaultWindowHints(void); - // OpenGL context helpers (opengl.c) int _glfwStringInExtensionString(const char* string, const GLubyte* extensions); const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired, diff --git a/src/window.c b/src/window.c index bb1093f5..c48fceb6 100644 --- a/src/window.c +++ b/src/window.c @@ -68,32 +68,6 @@ static void clearScrollOffsets(void) ////// GLFW internal API ////// ////////////////////////////////////////////////////////////////////////// -//======================================================================== -// Reset all window hints to their default values -//======================================================================== - -void _glfwSetDefaultWindowHints(void) -{ - memset(&_glfwLibrary.hints, 0, sizeof(_glfwLibrary.hints)); - - // The default is OpenGL with minimum version 1.0 - _glfwLibrary.hints.clientAPI = GLFW_OPENGL_API; - _glfwLibrary.hints.glMajor = 1; - _glfwLibrary.hints.glMinor = 0; - - // The default is to show the window and allow window resizing - _glfwLibrary.hints.resizable = GL_TRUE; - _glfwLibrary.hints.visible = GL_TRUE; - - // The default is 24 bits of color, 24 bits of depth and 8 bits of stencil - _glfwLibrary.hints.redBits = 8; - _glfwLibrary.hints.greenBits = 8; - _glfwLibrary.hints.blueBits = 8; - _glfwLibrary.hints.depthBits = 24; - _glfwLibrary.hints.stencilBits = 8; -} - - //======================================================================== // Register window focus events //======================================================================== @@ -273,9 +247,6 @@ GLFWAPI GLFWwindow glfwCreateWindow(int width, int height, wndconfig.glRobustness = _glfwLibrary.hints.glRobustness ? GL_TRUE : GL_FALSE; wndconfig.share = (_GLFWwindow*) share; - // Reset to default values for the next call - _glfwSetDefaultWindowHints(); - // Check the OpenGL bits of the window config if (!_glfwIsValidContextConfig(&wndconfig)) return GL_FALSE; @@ -375,6 +346,38 @@ GLFWAPI GLFWwindow glfwCreateWindow(int width, int height, } +//======================================================================== +// Reset all window hints to their default values +//======================================================================== + +void glfwDefaultWindowHints(void) +{ + if (!_glfwInitialized) + { + _glfwSetError(GLFW_NOT_INITIALIZED, NULL); + return; + } + + memset(&_glfwLibrary.hints, 0, sizeof(_glfwLibrary.hints)); + + // The default is OpenGL with minimum version 1.0 + _glfwLibrary.hints.clientAPI = GLFW_OPENGL_API; + _glfwLibrary.hints.glMajor = 1; + _glfwLibrary.hints.glMinor = 0; + + // The default is to show the window and allow window resizing + _glfwLibrary.hints.resizable = GL_TRUE; + _glfwLibrary.hints.visible = GL_TRUE; + + // The default is 24 bits of color, 24 bits of depth and 8 bits of stencil + _glfwLibrary.hints.redBits = 8; + _glfwLibrary.hints.greenBits = 8; + _glfwLibrary.hints.blueBits = 8; + _glfwLibrary.hints.depthBits = 24; + _glfwLibrary.hints.stencilBits = 8; +} + + //======================================================================== // Set hints for creating the window //======================================================================== From d68acb78bfbd3c09511b653ea3ea95d017ea41de Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Mon, 22 Oct 2012 03:20:16 +0200 Subject: [PATCH 21/41] Removed registering glfwTerminate with atexit. Functions registered with atexit are called from the thread calling exit. glfwTerminate should only be called from the main thread. Mistakes should be explicit. --- examples/heightmap.c | 7 +++++++ examples/splitview.c | 2 ++ examples/triangle.c | 2 ++ readme.html | 1 + src/init.c | 2 -- tests/glfwinfo.c | 6 ++++++ tests/modes.c | 3 +++ tests/peter.c | 4 ++++ tests/reopen.c | 5 +++++ tests/sharing.c | 4 ++++ tests/tearing.c | 4 ++-- tests/title.c | 3 +++ tests/windows.c | 1 + 13 files changed, 40 insertions(+), 4 deletions(-) diff --git a/examples/heightmap.c b/examples/heightmap.c index 5139a493..94e2bb95 100644 --- a/examples/heightmap.c +++ b/examples/heightmap.c @@ -595,6 +595,8 @@ int main(int argc, char** argv) free(vertex_shader_src); free(fragment_shader_src); + + glfwTerminate(); exit(EXIT_FAILURE); } @@ -608,6 +610,8 @@ int main(int argc, char** argv) fprintf(stderr, "ERROR: unable to resolve OpenGL function pointers\n"); free(vertex_shader_src); free(fragment_shader_src); + + glfwTerminate(); exit(EXIT_FAILURE); } /* Prepare opengl resources for rendering */ @@ -619,6 +623,8 @@ int main(int argc, char** argv) { fprintf(stderr, "ERROR: during creation of the shader program\n"); usage(); + + glfwTerminate(); exit(EXIT_FAILURE); } @@ -683,6 +689,7 @@ int main(int argc, char** argv) } } + glfwTerminate(); exit(EXIT_SUCCESS); } diff --git a/examples/splitview.c b/examples/splitview.c index 4a48a383..92fa6c22 100644 --- a/examples/splitview.c +++ b/examples/splitview.c @@ -463,6 +463,8 @@ int main(void) if (!window) { fprintf(stderr, "Failed to open GLFW window\n"); + + glfwTerminate(); exit(EXIT_FAILURE); } diff --git a/examples/triangle.c b/examples/triangle.c index 615483a9..3a1cef94 100644 --- a/examples/triangle.c +++ b/examples/triangle.c @@ -27,6 +27,8 @@ int main(void) if (!window) { fprintf(stderr, "Failed to open GLFW window\n"); + + glfwTerminate(); exit(EXIT_FAILURE); } diff --git a/readme.html b/readme.html index a40e1d35..cf5eb5b8 100644 --- a/readme.html +++ b/readme.html @@ -318,6 +318,7 @@ version of GLFW.

    • Removed the entire threading API
    • Removed the entire image loading API
    • Removed deprecated Carbon port
    • +
    • Removed registering glfwTerminate with atexit
    • Removed glfwSleep function
    • Removed glfwGetNumberOfProcessors function
    • Removed glfwGetGLVersion function
    • diff --git a/src/init.c b/src/init.c index 12d806cc..efcea20c 100644 --- a/src/init.c +++ b/src/init.c @@ -127,8 +127,6 @@ GLFWAPI int glfwInit(void) return GL_FALSE; } - atexit(glfwTerminate); - _glfwInitialized = GL_TRUE; // Not all window hints have zero as their default value diff --git a/tests/glfwinfo.c b/tests/glfwinfo.c index 3b262852..792e4bd5 100644 --- a/tests/glfwinfo.c +++ b/tests/glfwinfo.c @@ -106,7 +106,10 @@ static void list_extensions(int api, int major, int minor) { PFNGLGETSTRINGIPROC glGetStringi = (PFNGLGETSTRINGIPROC) glfwGetProcAddress("glGetStringi"); if (!glGetStringi) + { + glfwTerminate(); exit(EXIT_FAILURE); + } glGetIntegerv(GL_NUM_EXTENSIONS, &count); @@ -267,7 +270,10 @@ int main(int argc, char** argv) window = glfwCreateWindow(0, 0, GLFW_WINDOWED, "Version", NULL); if (!window) + { + glfwTerminate(); exit(EXIT_FAILURE); + } glfwMakeContextCurrent(window); diff --git a/tests/modes.c b/tests/modes.c index ef1db71c..60dbb8fa 100644 --- a/tests/modes.c +++ b/tests/modes.c @@ -157,6 +157,8 @@ static void test_modes(void) if (!window_handle) { printf("User terminated program\n"); + + glfwTerminate(); exit(EXIT_SUCCESS); } } @@ -224,6 +226,7 @@ int main(int argc, char** argv) else if (mode == TEST_MODE) test_modes(); + glfwTerminate(); exit(EXIT_SUCCESS); } diff --git a/tests/peter.c b/tests/peter.c index 59c917e9..d803c2a1 100644 --- a/tests/peter.c +++ b/tests/peter.c @@ -120,6 +120,8 @@ int main(void) if (!open_window()) { fprintf(stderr, "Failed to open GLFW window: %s\n", glfwErrorString(glfwGetError())); + + glfwTerminate(); exit(EXIT_FAILURE); } @@ -138,6 +140,8 @@ int main(void) if (!open_window()) { fprintf(stderr, "Failed to open GLFW window: %s\n", glfwErrorString(glfwGetError())); + + glfwTerminate(); exit(EXIT_FAILURE); } diff --git a/tests/reopen.c b/tests/reopen.c index 5d137188..ad8401d8 100644 --- a/tests/reopen.c +++ b/tests/reopen.c @@ -132,7 +132,10 @@ int main(int argc, char** argv) for (;;) { if (!open_window(640, 480, (count & 1) ? GLFW_FULLSCREEN : GLFW_WINDOWED)) + { + glfwTerminate(); exit(EXIT_FAILURE); + } glMatrixMode(GL_PROJECTION); glOrtho(-1.f, 1.f, -1.f, 1.f, 1.f, -1.f); @@ -156,6 +159,8 @@ int main(int argc, char** argv) { close_window(); printf("User closed window\n"); + + glfwTerminate(); exit(EXIT_SUCCESS); } } diff --git a/tests/sharing.c b/tests/sharing.c index 64e61740..2f060484 100644 --- a/tests/sharing.c +++ b/tests/sharing.c @@ -137,6 +137,8 @@ int main(int argc, char** argv) if (!windows[0]) { fprintf(stderr, "Failed to open first GLFW window: %s\n", glfwErrorString(glfwGetError())); + + glfwTerminate(); exit(EXIT_FAILURE); } @@ -149,6 +151,8 @@ int main(int argc, char** argv) if (!windows[1]) { fprintf(stderr, "Failed to open second GLFW window: %s\n", glfwErrorString(glfwGetError())); + + glfwTerminate(); exit(EXIT_FAILURE); } diff --git a/tests/tearing.c b/tests/tearing.c index a8d774a4..a4647096 100644 --- a/tests/tearing.c +++ b/tests/tearing.c @@ -73,9 +73,9 @@ int main(void) window = glfwCreateWindow(0, 0, GLFW_WINDOWED, "", NULL); if (!window) { - glfwTerminate(); - fprintf(stderr, "Failed to open GLFW window: %s\n", glfwErrorString(glfwGetError())); + + glfwTerminate(); exit(EXIT_FAILURE); } diff --git a/tests/title.c b/tests/title.c index c7539033..38535708 100644 --- a/tests/title.c +++ b/tests/title.c @@ -51,6 +51,8 @@ int main(void) if (!window) { fprintf(stderr, "Failed to open GLFW window: %s\n", glfwErrorString(glfwGetError())); + + glfwTerminate(); exit(EXIT_FAILURE); } @@ -66,6 +68,7 @@ int main(void) glfwWaitEvents(); } + glfwTerminate(); exit(EXIT_SUCCESS); } diff --git a/tests/windows.c b/tests/windows.c index 894febeb..ddf67915 100644 --- a/tests/windows.c +++ b/tests/windows.c @@ -60,6 +60,7 @@ int main(void) { fprintf(stderr, "Failed to open GLFW window: %s\n", glfwErrorString(glfwGetError())); + glfwTerminate(); exit(EXIT_FAILURE); } From 18d71c2b6d031c58d0d1e7c6406431a19b92aca8 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sun, 28 Oct 2012 13:45:11 +0100 Subject: [PATCH 22/41] Made window-related callbacks per-window. This makes polymorphic behaviour easier to implement and avoids the problem of events being triggered before the GLFW window object is fully usable. --- examples/boing.c | 4 +-- examples/gears.c | 10 +++---- examples/heightmap.c | 4 +-- examples/splitview.c | 12 ++++----- examples/wave.c | 14 +++++----- include/GL/glfw3.h | 22 +++++++-------- src/input.c | 64 ++++++++++++++++++++++++++------------------ src/internal.h | 24 ++++++++--------- src/window.c | 54 ++++++++++++++++++++++--------------- tests/accuracy.c | 8 +++--- tests/clipboard.c | 6 ++--- tests/events.c | 24 ++++++++--------- tests/fsaa.c | 6 ++--- tests/fsfocus.c | 6 ++--- tests/gamma.c | 6 ++--- tests/iconify.c | 10 +++---- tests/joysticks.c | 2 +- tests/modes.c | 8 +++--- tests/peter.c | 6 ++--- tests/reopen.c | 6 ++--- tests/sharing.c | 4 +-- tests/tearing.c | 4 +-- tests/title.c | 2 +- 23 files changed, 164 insertions(+), 142 deletions(-) diff --git a/examples/boing.c b/examples/boing.c index a2094c5f..5a1993ff 100644 --- a/examples/boing.c +++ b/examples/boing.c @@ -577,8 +577,6 @@ int main( void ) exit( EXIT_FAILURE ); } - glfwSetWindowSizeCallback( reshape ); - glfwWindowHint(GLFW_DEPTH_BITS, 16); window = glfwCreateWindow( 400, 400, GLFW_WINDOWED, "Boing (classic Amiga demo)", NULL ); @@ -589,6 +587,8 @@ int main( void ) exit( EXIT_FAILURE ); } + glfwSetWindowSizeCallback(window, reshape); + glfwMakeContextCurrent(window); glfwSwapInterval( 1 ); diff --git a/examples/gears.c b/examples/gears.c index cd3cdbb1..63f973d2 100644 --- a/examples/gears.c +++ b/examples/gears.c @@ -338,11 +338,6 @@ int main(int argc, char *argv[]) exit( EXIT_FAILURE ); } - // Set callback functions - glfwSetWindowCloseCallback(window_close_callback); - glfwSetWindowSizeCallback( reshape ); - glfwSetKeyCallback( key ); - glfwWindowHint(GLFW_DEPTH_BITS, 16); window = glfwCreateWindow( 300, 300, GLFW_WINDOWED, "Gears", NULL ); @@ -353,6 +348,11 @@ int main(int argc, char *argv[]) exit( EXIT_FAILURE ); } + // Set callback functions + glfwSetWindowCloseCallback(window, window_close_callback); + glfwSetWindowSizeCallback(window, reshape); + glfwSetKeyCallback(window, key); + glfwMakeContextCurrent(window); glfwSwapInterval( 1 ); diff --git a/examples/heightmap.c b/examples/heightmap.c index 94e2bb95..6abaa1ec 100644 --- a/examples/heightmap.c +++ b/examples/heightmap.c @@ -601,8 +601,8 @@ int main(int argc, char** argv) } /* Register events callback */ - glfwSetWindowCloseCallback(window_close_callback); - glfwSetKeyCallback(key_callback); + glfwSetWindowCloseCallback(window, window_close_callback); + glfwSetKeyCallback(window, key_callback); glfwMakeContextCurrent(window); if (GL_TRUE != init_opengl()) diff --git a/examples/splitview.c b/examples/splitview.c index 92fa6c22..965a183c 100644 --- a/examples/splitview.c +++ b/examples/splitview.c @@ -450,12 +450,6 @@ int main(void) exit(EXIT_FAILURE); } - // Set callback functions - glfwSetWindowSizeCallback(windowSizeFun); - glfwSetWindowRefreshCallback(windowRefreshFun); - glfwSetCursorPosCallback(cursorPosFun); - glfwSetMouseButtonCallback(mouseButtonFun); - glfwWindowHint(GLFW_DEPTH_BITS, 16); // Open OpenGL window @@ -468,6 +462,12 @@ int main(void) exit(EXIT_FAILURE); } + // Set callback functions + glfwSetWindowSizeCallback(window, windowSizeFun); + glfwSetWindowRefreshCallback(window, windowRefreshFun); + glfwSetCursorPosCallback(window, cursorPosFun); + glfwSetMouseButtonCallback(window, mouseButtonFun); + // Enable vsync glfwMakeContextCurrent(window); glfwSwapInterval(1); diff --git a/examples/wave.c b/examples/wave.c index 668d54bd..c04bfb2d 100644 --- a/examples/wave.c +++ b/examples/wave.c @@ -399,13 +399,6 @@ int main(int argc, char* argv[]) exit(EXIT_FAILURE); } - glfwSetKeyCallback(key_callback); - glfwSetWindowCloseCallback(window_close_callback); - glfwSetWindowSizeCallback(window_size_callback); - glfwSetMouseButtonCallback(mouse_button_callback); - glfwSetCursorPosCallback(cursor_position_callback); - glfwSetScrollCallback(scroll_callback); - window = glfwCreateWindow(640, 480, GLFW_WINDOWED, "Wave Simulation", NULL); if (!window) { @@ -413,6 +406,13 @@ int main(int argc, char* argv[]) exit(EXIT_FAILURE); } + glfwSetKeyCallback(window, key_callback); + glfwSetWindowCloseCallback(window, window_close_callback); + glfwSetWindowSizeCallback(window, window_size_callback); + glfwSetMouseButtonCallback(window, mouse_button_callback); + glfwSetCursorPosCallback(window, cursor_position_callback); + glfwSetScrollCallback(window, scroll_callback); + glfwMakeContextCurrent(window); glfwSwapInterval(1); diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h index df0ac6b1..87ba9423 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -545,11 +545,11 @@ GLFWAPI void glfwHideWindow(GLFWwindow window); GLFWAPI int glfwGetWindowParam(GLFWwindow window, int param); GLFWAPI void glfwSetWindowUserPointer(GLFWwindow window, void* pointer); GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow window); -GLFWAPI void glfwSetWindowSizeCallback(GLFWwindowsizefun cbfun); -GLFWAPI void glfwSetWindowCloseCallback(GLFWwindowclosefun cbfun); -GLFWAPI void glfwSetWindowRefreshCallback(GLFWwindowrefreshfun cbfun); -GLFWAPI void glfwSetWindowFocusCallback(GLFWwindowfocusfun cbfun); -GLFWAPI void glfwSetWindowIconifyCallback(GLFWwindowiconifyfun cbfun); +GLFWAPI void glfwSetWindowSizeCallback(GLFWwindow window, GLFWwindowsizefun cbfun); +GLFWAPI void glfwSetWindowCloseCallback(GLFWwindow window, GLFWwindowclosefun cbfun); +GLFWAPI void glfwSetWindowRefreshCallback(GLFWwindow window, GLFWwindowrefreshfun cbfun); +GLFWAPI void glfwSetWindowFocusCallback(GLFWwindow window, GLFWwindowfocusfun cbfun); +GLFWAPI void glfwSetWindowIconifyCallback(GLFWwindow window, GLFWwindowiconifyfun cbfun); /* Event handling */ GLFWAPI void glfwPollEvents(void); @@ -563,12 +563,12 @@ GLFWAPI int glfwGetMouseButton(GLFWwindow window, int button); GLFWAPI void glfwGetCursorPos(GLFWwindow window, int* xpos, int* ypos); GLFWAPI void glfwSetCursorPos(GLFWwindow window, int xpos, int ypos); GLFWAPI void glfwGetScrollOffset(GLFWwindow window, double* xoffset, double* yoffset); -GLFWAPI void glfwSetKeyCallback(GLFWkeyfun cbfun); -GLFWAPI void glfwSetCharCallback(GLFWcharfun cbfun); -GLFWAPI void glfwSetMouseButtonCallback(GLFWmousebuttonfun cbfun); -GLFWAPI void glfwSetCursorPosCallback(GLFWcursorposfun cbfun); -GLFWAPI void glfwSetCursorEnterCallback(GLFWcursorenterfun cbfun); -GLFWAPI void glfwSetScrollCallback(GLFWscrollfun cbfun); +GLFWAPI void glfwSetKeyCallback(GLFWwindow window, GLFWkeyfun cbfun); +GLFWAPI void glfwSetCharCallback(GLFWwindow window, GLFWcharfun cbfun); +GLFWAPI void glfwSetMouseButtonCallback(GLFWwindow window, GLFWmousebuttonfun cbfun); +GLFWAPI void glfwSetCursorPosCallback(GLFWwindow window, GLFWcursorposfun cbfun); +GLFWAPI void glfwSetCursorEnterCallback(GLFWwindow window, GLFWcursorenterfun cbfun); +GLFWAPI void glfwSetScrollCallback(GLFWwindow window, GLFWscrollfun cbfun); /* Joystick input */ GLFWAPI int glfwGetJoystickParam(int joy, int param); diff --git a/src/input.c b/src/input.c index 52b3b0fb..701da4f0 100644 --- a/src/input.c +++ b/src/input.c @@ -172,8 +172,8 @@ void _glfwInputKey(_GLFWwindow* window, int key, int action) } // Call user callback function - if (_glfwLibrary.keyCallback && (window->keyRepeat || !repeated)) - _glfwLibrary.keyCallback(window, key, action); + if (window->keyCallback && (window->keyRepeat || !repeated)) + window->keyCallback(window, key, action); } @@ -187,8 +187,8 @@ void _glfwInputChar(_GLFWwindow* window, int character) if (!((character >= 32 && character <= 126) || character >= 160)) return; - if (_glfwLibrary.charCallback) - _glfwLibrary.charCallback(window, character); + if (window->charCallback) + window->charCallback(window, character); } @@ -201,8 +201,8 @@ void _glfwInputScroll(_GLFWwindow* window, double xoffset, double yoffset) window->scrollX += xoffset; window->scrollY += yoffset; - if (_glfwLibrary.scrollCallback) - _glfwLibrary.scrollCallback(window, xoffset, yoffset); + if (window->scrollCallback) + window->scrollCallback(window, xoffset, yoffset); } @@ -221,8 +221,8 @@ void _glfwInputMouseClick(_GLFWwindow* window, int button, int action) else window->mouseButton[button] = (char) action; - if (_glfwLibrary.mouseButtonCallback) - _glfwLibrary.mouseButtonCallback(window, button, action); + if (window->mouseButtonCallback) + window->mouseButtonCallback(window, button, action); } @@ -249,11 +249,11 @@ void _glfwInputCursorMotion(_GLFWwindow* window, int x, int y) window->cursorPosY = y; } - if (_glfwLibrary.cursorPosCallback) + if (window->cursorPosCallback) { - _glfwLibrary.cursorPosCallback(window, - window->cursorPosX, - window->cursorPosY); + window->cursorPosCallback(window, + window->cursorPosX, + window->cursorPosY); } } @@ -264,8 +264,8 @@ void _glfwInputCursorMotion(_GLFWwindow* window, int x, int y) void _glfwInputCursorEnter(_GLFWwindow* window, int entered) { - if (_glfwLibrary.cursorEnterCallback) - _glfwLibrary.cursorEnterCallback(window, entered); + if (window->cursorEnterCallback) + window->cursorEnterCallback(window, entered); } @@ -494,15 +494,17 @@ GLFWAPI void glfwGetScrollOffset(GLFWwindow handle, double* xoffset, double* yof // Set callback function for keyboard input //======================================================================== -GLFWAPI void glfwSetKeyCallback(GLFWkeyfun cbfun) +GLFWAPI void glfwSetKeyCallback(GLFWwindow handle, GLFWkeyfun cbfun) { + _GLFWwindow* window = (_GLFWwindow*) handle; + if (!_glfwInitialized) { _glfwSetError(GLFW_NOT_INITIALIZED, NULL); return; } - _glfwLibrary.keyCallback = cbfun; + window->keyCallback = cbfun; } @@ -510,15 +512,17 @@ GLFWAPI void glfwSetKeyCallback(GLFWkeyfun cbfun) // Set callback function for character input //======================================================================== -GLFWAPI void glfwSetCharCallback(GLFWcharfun cbfun) +GLFWAPI void glfwSetCharCallback(GLFWwindow handle, GLFWcharfun cbfun) { + _GLFWwindow* window = (_GLFWwindow*) handle; + if (!_glfwInitialized) { _glfwSetError(GLFW_NOT_INITIALIZED, NULL); return; } - _glfwLibrary.charCallback = cbfun; + window->charCallback = cbfun; } @@ -526,15 +530,17 @@ GLFWAPI void glfwSetCharCallback(GLFWcharfun cbfun) // Set callback function for mouse clicks //======================================================================== -GLFWAPI void glfwSetMouseButtonCallback(GLFWmousebuttonfun cbfun) +GLFWAPI void glfwSetMouseButtonCallback(GLFWwindow handle, GLFWmousebuttonfun cbfun) { + _GLFWwindow* window = (_GLFWwindow*) handle; + if (!_glfwInitialized) { _glfwSetError(GLFW_NOT_INITIALIZED, NULL); return; } - _glfwLibrary.mouseButtonCallback = cbfun; + window->mouseButtonCallback = cbfun; } @@ -542,15 +548,17 @@ GLFWAPI void glfwSetMouseButtonCallback(GLFWmousebuttonfun cbfun) // Set callback function for mouse moves //======================================================================== -GLFWAPI void glfwSetCursorPosCallback(GLFWcursorposfun cbfun) +GLFWAPI void glfwSetCursorPosCallback(GLFWwindow handle, GLFWcursorposfun cbfun) { + _GLFWwindow* window = (_GLFWwindow*) handle; + if (!_glfwInitialized) { _glfwSetError(GLFW_NOT_INITIALIZED, NULL); return; } - _glfwLibrary.cursorPosCallback = cbfun; + window->cursorPosCallback = cbfun; } @@ -558,15 +566,17 @@ GLFWAPI void glfwSetCursorPosCallback(GLFWcursorposfun cbfun) // Set callback function for cursor enter/leave events //======================================================================== -GLFWAPI void glfwSetCursorEnterCallback(GLFWcursorenterfun cbfun) +GLFWAPI void glfwSetCursorEnterCallback(GLFWwindow handle, GLFWcursorenterfun cbfun) { + _GLFWwindow* window = (_GLFWwindow*) handle; + if (!_glfwInitialized) { _glfwSetError(GLFW_NOT_INITIALIZED, NULL); return; } - _glfwLibrary.cursorEnterCallback = cbfun; + window->cursorEnterCallback = cbfun; } @@ -574,14 +584,16 @@ GLFWAPI void glfwSetCursorEnterCallback(GLFWcursorenterfun cbfun) // Set callback function for scroll events //======================================================================== -GLFWAPI void glfwSetScrollCallback(GLFWscrollfun cbfun) +GLFWAPI void glfwSetScrollCallback(GLFWwindow handle, GLFWscrollfun cbfun) { + _GLFWwindow* window = (_GLFWwindow*) handle; + if (!_glfwInitialized) { _glfwSetError(GLFW_NOT_INITIALIZED, NULL); return; } - _glfwLibrary.scrollCallback = cbfun; + window->scrollCallback = cbfun; } diff --git a/src/internal.h b/src/internal.h index 01767c96..3f70426a 100644 --- a/src/internal.h +++ b/src/internal.h @@ -197,6 +197,18 @@ struct _GLFWwindow int glRobustness; PFNGLGETSTRINGIPROC GetStringi; + GLFWwindowsizefun windowSizeCallback; + GLFWwindowclosefun windowCloseCallback; + GLFWwindowrefreshfun windowRefreshCallback; + GLFWwindowfocusfun windowFocusCallback; + GLFWwindowiconifyfun windowIconifyCallback; + GLFWmousebuttonfun mouseButtonCallback; + GLFWcursorposfun cursorPosCallback; + GLFWcursorenterfun cursorEnterCallback; + GLFWscrollfun scrollCallback; + GLFWkeyfun keyCallback; + GLFWcharfun charCallback; + // These are defined in the current port's platform.h _GLFW_PLATFORM_WINDOW_STATE; _GLFW_PLATFORM_CONTEXT_STATE; @@ -213,18 +225,6 @@ struct _GLFWlibrary _GLFWwindow* windowListHead; _GLFWwindow* activeWindow; - GLFWwindowsizefun windowSizeCallback; - GLFWwindowclosefun windowCloseCallback; - GLFWwindowrefreshfun windowRefreshCallback; - GLFWwindowfocusfun windowFocusCallback; - GLFWwindowiconifyfun windowIconifyCallback; - GLFWmousebuttonfun mouseButtonCallback; - GLFWcursorposfun cursorPosCallback; - GLFWcursorenterfun cursorEnterCallback; - GLFWscrollfun scrollCallback; - GLFWkeyfun keyCallback; - GLFWcharfun charCallback; - GLFWgammaramp currentRamp; GLFWgammaramp originalRamp; int originalRampSize; diff --git a/src/window.c b/src/window.c index c48fceb6..b86dcfec 100644 --- a/src/window.c +++ b/src/window.c @@ -80,8 +80,8 @@ void _glfwInputWindowFocus(_GLFWwindow* window, GLboolean activated) { _glfwLibrary.activeWindow = window; - if (_glfwLibrary.windowFocusCallback) - _glfwLibrary.windowFocusCallback(window, activated); + if (window->windowFocusCallback) + window->windowFocusCallback(window, activated); } } else @@ -106,8 +106,8 @@ void _glfwInputWindowFocus(_GLFWwindow* window, GLboolean activated) _glfwLibrary.activeWindow = NULL; - if (_glfwLibrary.windowFocusCallback) - _glfwLibrary.windowFocusCallback(window, activated); + if (window->windowFocusCallback) + window->windowFocusCallback(window, activated); } } } @@ -136,8 +136,8 @@ void _glfwInputWindowSize(_GLFWwindow* window, int width, int height) window->width = width; window->height = height; - if (_glfwLibrary.windowSizeCallback) - _glfwLibrary.windowSizeCallback(window, width, height); + if (window->windowSizeCallback) + window->windowSizeCallback(window, width, height); } @@ -152,8 +152,8 @@ void _glfwInputWindowIconify(_GLFWwindow* window, int iconified) window->iconified = iconified; - if (_glfwLibrary.windowIconifyCallback) - _glfwLibrary.windowIconifyCallback(window, iconified); + if (window->windowIconifyCallback) + window->windowIconifyCallback(window, iconified); } @@ -173,8 +173,8 @@ void _glfwInputWindowVisibility(_GLFWwindow* window, int visible) void _glfwInputWindowDamage(_GLFWwindow* window) { - if (_glfwLibrary.windowRefreshCallback) - _glfwLibrary.windowRefreshCallback(window); + if (window->windowRefreshCallback) + window->windowRefreshCallback(window); } @@ -184,8 +184,8 @@ void _glfwInputWindowDamage(_GLFWwindow* window) void _glfwInputWindowCloseRequest(_GLFWwindow* window) { - if (_glfwLibrary.windowCloseCallback) - window->closeRequested = _glfwLibrary.windowCloseCallback(window); + if (window->windowCloseCallback) + window->closeRequested = window->windowCloseCallback(window); else window->closeRequested = GL_TRUE; } @@ -810,15 +810,17 @@ GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow handle) // Set callback function for window size changes //======================================================================== -GLFWAPI void glfwSetWindowSizeCallback(GLFWwindowsizefun cbfun) +GLFWAPI void glfwSetWindowSizeCallback(GLFWwindow handle, GLFWwindowsizefun cbfun) { + _GLFWwindow* window = (_GLFWwindow*) handle; + if (!_glfwInitialized) { _glfwSetError(GLFW_NOT_INITIALIZED, NULL); return; } - _glfwLibrary.windowSizeCallback = cbfun; + window->windowSizeCallback = cbfun; } @@ -826,15 +828,17 @@ GLFWAPI void glfwSetWindowSizeCallback(GLFWwindowsizefun cbfun) // Set callback function for window close events //======================================================================== -GLFWAPI void glfwSetWindowCloseCallback(GLFWwindowclosefun cbfun) +GLFWAPI void glfwSetWindowCloseCallback(GLFWwindow handle, GLFWwindowclosefun cbfun) { + _GLFWwindow* window = (_GLFWwindow*) handle; + if (!_glfwInitialized) { _glfwSetError(GLFW_NOT_INITIALIZED, NULL); return; } - _glfwLibrary.windowCloseCallback = cbfun; + window->windowCloseCallback = cbfun; } @@ -842,15 +846,17 @@ GLFWAPI void glfwSetWindowCloseCallback(GLFWwindowclosefun cbfun) // Set callback function for window refresh events //======================================================================== -GLFWAPI void glfwSetWindowRefreshCallback(GLFWwindowrefreshfun cbfun) +GLFWAPI void glfwSetWindowRefreshCallback(GLFWwindow handle, GLFWwindowrefreshfun cbfun) { + _GLFWwindow* window = (_GLFWwindow*) handle; + if (!_glfwInitialized) { _glfwSetError(GLFW_NOT_INITIALIZED, NULL); return; } - _glfwLibrary.windowRefreshCallback = cbfun; + window->windowRefreshCallback = cbfun; } @@ -858,15 +864,17 @@ GLFWAPI void glfwSetWindowRefreshCallback(GLFWwindowrefreshfun cbfun) // Set callback function for window focus events //======================================================================== -GLFWAPI void glfwSetWindowFocusCallback(GLFWwindowfocusfun cbfun) +GLFWAPI void glfwSetWindowFocusCallback(GLFWwindow handle, GLFWwindowfocusfun cbfun) { + _GLFWwindow* window = (_GLFWwindow*) handle; + if (!_glfwInitialized) { _glfwSetError(GLFW_NOT_INITIALIZED, NULL); return; } - _glfwLibrary.windowFocusCallback = cbfun; + window->windowFocusCallback = cbfun; } @@ -874,15 +882,17 @@ GLFWAPI void glfwSetWindowFocusCallback(GLFWwindowfocusfun cbfun) // Set callback function for window iconification events //======================================================================== -GLFWAPI void glfwSetWindowIconifyCallback(GLFWwindowiconifyfun cbfun) +GLFWAPI void glfwSetWindowIconifyCallback(GLFWwindow handle, GLFWwindowiconifyfun cbfun) { + _GLFWwindow* window = (_GLFWwindow*) handle; + if (!_glfwInitialized) { _glfwSetError(GLFW_NOT_INITIALIZED, NULL); return; } - _glfwLibrary.windowIconifyCallback = cbfun; + window->windowIconifyCallback = cbfun; } diff --git a/tests/accuracy.c b/tests/accuracy.c index f3fb752b..d320f64c 100644 --- a/tests/accuracy.c +++ b/tests/accuracy.c @@ -86,10 +86,6 @@ int main(void) exit(EXIT_FAILURE); } - glfwSetCursorPosCallback(cursor_position_callback); - glfwSetWindowSizeCallback(window_size_callback); - glfwSetKeyCallback(key_callback); - window = glfwCreateWindow(window_width, window_height, GLFW_WINDOWED, "", NULL); if (!window) { @@ -99,6 +95,10 @@ int main(void) exit(EXIT_FAILURE); } + glfwSetCursorPosCallback(window, cursor_position_callback); + glfwSetWindowSizeCallback(window, window_size_callback); + glfwSetKeyCallback(window, key_callback); + glfwMakeContextCurrent(window); glfwGetWindowSize(window, &width, &height); diff --git a/tests/clipboard.c b/tests/clipboard.c index f83bbfea..818e6e65 100644 --- a/tests/clipboard.c +++ b/tests/clipboard.c @@ -137,9 +137,9 @@ int main(int argc, char** argv) glfwMakeContextCurrent(window); glfwSwapInterval(1); - glfwSetKeyCallback(key_callback); - glfwSetWindowSizeCallback(window_size_callback); - glfwSetWindowCloseCallback(window_close_callback); + glfwSetKeyCallback(window, key_callback); + glfwSetWindowSizeCallback(window, window_size_callback); + glfwSetWindowCloseCallback(window, window_close_callback); glMatrixMode(GL_PROJECTION); glOrtho(-1.f, 1.f, -1.f, 1.f, -1.f, 1.f); diff --git a/tests/events.c b/tests/events.c index 809da473..9379ded9 100644 --- a/tests/events.c +++ b/tests/events.c @@ -363,18 +363,6 @@ int main(void) printf("Library initialized\n"); - glfwSetWindowSizeCallback(window_size_callback); - glfwSetWindowCloseCallback(window_close_callback); - glfwSetWindowRefreshCallback(window_refresh_callback); - glfwSetWindowFocusCallback(window_focus_callback); - glfwSetWindowIconifyCallback(window_iconify_callback); - glfwSetMouseButtonCallback(mouse_button_callback); - glfwSetCursorPosCallback(cursor_position_callback); - glfwSetCursorEnterCallback(cursor_enter_callback); - glfwSetScrollCallback(scroll_callback); - glfwSetKeyCallback(key_callback); - glfwSetCharCallback(char_callback); - window = glfwCreateWindow(0, 0, GLFW_WINDOWED, "Event Linter", NULL); if (!window) { @@ -386,6 +374,18 @@ int main(void) printf("Window opened\n"); + glfwSetWindowSizeCallback(window, window_size_callback); + glfwSetWindowCloseCallback(window, window_close_callback); + glfwSetWindowRefreshCallback(window, window_refresh_callback); + glfwSetWindowFocusCallback(window, window_focus_callback); + glfwSetWindowIconifyCallback(window, window_iconify_callback); + glfwSetMouseButtonCallback(window, mouse_button_callback); + glfwSetCursorPosCallback(window, cursor_position_callback); + glfwSetCursorEnterCallback(window, cursor_enter_callback); + glfwSetScrollCallback(window, scroll_callback); + glfwSetKeyCallback(window, key_callback); + glfwSetCharCallback(window, char_callback); + glfwMakeContextCurrent(window); glfwSwapInterval(1); diff --git a/tests/fsaa.c b/tests/fsaa.c index 8fc8b60a..735a1f5f 100644 --- a/tests/fsaa.c +++ b/tests/fsaa.c @@ -93,9 +93,6 @@ int main(int argc, char** argv) else printf("Requesting that FSAA not be available\n"); - glfwSetKeyCallback(key_callback); - glfwSetWindowSizeCallback(window_size_callback); - glfwWindowHint(GLFW_FSAA_SAMPLES, samples); window = glfwCreateWindow(800, 400, GLFW_WINDOWED, "Aliasing Detector", NULL); @@ -107,6 +104,9 @@ int main(int argc, char** argv) exit(EXIT_FAILURE); } + glfwSetKeyCallback(window, key_callback); + glfwSetWindowSizeCallback(window, window_size_callback); + glfwMakeContextCurrent(window); glfwSwapInterval(1); diff --git a/tests/fsfocus.c b/tests/fsfocus.c index 1c46d7af..17ffc35f 100644 --- a/tests/fsfocus.c +++ b/tests/fsfocus.c @@ -96,9 +96,9 @@ int main(void) glfwSetInputMode(window, GLFW_CURSOR_MODE, GLFW_CURSOR_NORMAL); - glfwSetWindowFocusCallback(window_focus_callback); - glfwSetKeyCallback(window_key_callback); - glfwSetWindowCloseCallback(window_close_callback); + glfwSetWindowFocusCallback(window, window_focus_callback); + glfwSetKeyCallback(window, window_key_callback); + glfwSetWindowCloseCallback(window, window_close_callback); while (running) { diff --git a/tests/gamma.c b/tests/gamma.c index c30dd53c..9ff0e9e5 100644 --- a/tests/gamma.c +++ b/tests/gamma.c @@ -151,9 +151,9 @@ int main(int argc, char** argv) glfwMakeContextCurrent(window); glfwSwapInterval(1); - glfwSetKeyCallback(key_callback); - glfwSetWindowCloseCallback(window_close_callback); - glfwSetWindowSizeCallback(size_callback); + glfwSetKeyCallback(window, key_callback); + glfwSetWindowCloseCallback(window, window_close_callback); + glfwSetWindowSizeCallback(window, size_callback); glMatrixMode(GL_PROJECTION); glOrtho(-1.f, 1.f, -1.f, 1.f, -1.f, 1.f); diff --git a/tests/iconify.c b/tests/iconify.c index 0ecde623..f7a87cba 100644 --- a/tests/iconify.c +++ b/tests/iconify.c @@ -144,11 +144,11 @@ int main(int argc, char** argv) glfwMakeContextCurrent(window); glfwSwapInterval(1); - glfwSetKeyCallback(key_callback); - glfwSetWindowSizeCallback(window_size_callback); - glfwSetWindowCloseCallback(window_close_callback); - glfwSetWindowFocusCallback(window_focus_callback); - glfwSetWindowIconifyCallback(window_iconify_callback); + glfwSetKeyCallback(window, key_callback); + glfwSetWindowSizeCallback(window, window_size_callback); + glfwSetWindowCloseCallback(window, window_close_callback); + glfwSetWindowFocusCallback(window, window_focus_callback); + glfwSetWindowIconifyCallback(window, window_iconify_callback); printf("Window is %s and %s\n", glfwGetWindowParam(window, GLFW_ICONIFIED) ? "iconified" : "restored", diff --git a/tests/joysticks.c b/tests/joysticks.c index 40202ce7..a41eaa5f 100644 --- a/tests/joysticks.c +++ b/tests/joysticks.c @@ -195,7 +195,7 @@ int main(void) exit(EXIT_FAILURE); } - glfwSetWindowSizeCallback(window_size_callback); + glfwSetWindowSizeCallback(window, window_size_callback); glfwMakeContextCurrent(window); glfwSwapInterval(1); diff --git a/tests/modes.c b/tests/modes.c index 60dbb8fa..e1f13faa 100644 --- a/tests/modes.c +++ b/tests/modes.c @@ -117,10 +117,6 @@ static void test_modes(void) int i, count; GLFWvidmode* modes = glfwGetVideoModes(&count); - glfwSetWindowSizeCallback(window_size_callback); - glfwSetWindowCloseCallback(window_close_callback); - glfwSetKeyCallback(key_callback); - for (i = 0; i < count; i++) { GLFWvidmode* mode = modes + i; @@ -143,6 +139,10 @@ static void test_modes(void) continue; } + glfwSetWindowSizeCallback(window_handle, window_size_callback); + glfwSetWindowCloseCallback(window_handle, window_close_callback); + glfwSetKeyCallback(window_handle, key_callback); + glfwMakeContextCurrent(window_handle); glfwSwapInterval(1); diff --git a/tests/peter.c b/tests/peter.c index d803c2a1..32748932 100644 --- a/tests/peter.c +++ b/tests/peter.c @@ -102,9 +102,9 @@ static GLboolean open_window(void) glfwGetCursorPos(window_handle, &cursor_x, &cursor_y); printf("Cursor position: %i %i\n", cursor_x, cursor_y); - glfwSetWindowSizeCallback(window_size_callback); - glfwSetCursorPosCallback(cursor_position_callback); - glfwSetKeyCallback(key_callback); + glfwSetWindowSizeCallback(window_handle, window_size_callback); + glfwSetCursorPosCallback(window_handle, cursor_position_callback); + glfwSetKeyCallback(window_handle, key_callback); return GL_TRUE; } diff --git a/tests/reopen.c b/tests/reopen.c index ad8401d8..212c108d 100644 --- a/tests/reopen.c +++ b/tests/reopen.c @@ -102,9 +102,9 @@ static GLboolean open_window(int width, int height, int mode) glfwMakeContextCurrent(window_handle); glfwSwapInterval(1); - glfwSetWindowSizeCallback(window_size_callback); - glfwSetWindowCloseCallback(window_close_callback); - glfwSetKeyCallback(key_callback); + glfwSetWindowSizeCallback(window_handle, window_size_callback); + glfwSetWindowCloseCallback(window_handle, window_close_callback); + glfwSetKeyCallback(window_handle, key_callback); printf("Opening %s mode window took %0.3f seconds\n", get_mode_name(mode), diff --git a/tests/sharing.c b/tests/sharing.c index 2f060484..41ce8db5 100644 --- a/tests/sharing.c +++ b/tests/sharing.c @@ -62,8 +62,8 @@ static GLFWwindow open_window(const char* title, GLFWwindow share) glfwMakeContextCurrent(window); glfwSwapInterval(1); - glfwSetWindowCloseCallback(window_close_callback); - glfwSetKeyCallback(key_callback); + glfwSetWindowCloseCallback(window, window_close_callback); + glfwSetKeyCallback(window, key_callback); return window; } diff --git a/tests/tearing.c b/tests/tearing.c index a4647096..e3149c35 100644 --- a/tests/tearing.c +++ b/tests/tearing.c @@ -82,8 +82,8 @@ int main(void) glfwMakeContextCurrent(window); set_swap_interval(window, swap_interval); - glfwSetWindowSizeCallback(window_size_callback); - glfwSetKeyCallback(key_callback); + glfwSetWindowSizeCallback(window, window_size_callback); + glfwSetKeyCallback(window, key_callback); glMatrixMode(GL_PROJECTION); glOrtho(-1.f, 1.f, -1.f, 1.f, 1.f, -1.f); diff --git a/tests/title.c b/tests/title.c index 38535708..a9abebb2 100644 --- a/tests/title.c +++ b/tests/title.c @@ -59,7 +59,7 @@ int main(void) glfwMakeContextCurrent(window); glfwSwapInterval(1); - glfwSetWindowSizeCallback(window_size_callback); + glfwSetWindowSizeCallback(window, window_size_callback); while (!glfwGetWindowParam(window, GLFW_CLOSE_REQUESTED)) { From 4c5de7a7b06a9d3d39db07d75e1e4f753dfd205c Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Tue, 30 Oct 2012 17:20:16 +0100 Subject: [PATCH 23/41] Fixed selection flag not being used. --- src/win32_fullscreen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/win32_fullscreen.c b/src/win32_fullscreen.c index 35d75054..045fecab 100644 --- a/src/win32_fullscreen.c +++ b/src/win32_fullscreen.c @@ -130,7 +130,7 @@ void _glfwSetVideoMode(int* width, int* height, closestRate = *refreshRate; if (getClosestVideoMode(&closestWidth, &closestHeight, - &closestBPP, &closestRate, GL_FALSE)) + &closestBPP, &closestRate, exactBPP)) { dm.dmSize = sizeof(DEVMODE); dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL; From a9d1fdfc44de37e9a4c2837cd75a56c4a0608826 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Tue, 30 Oct 2012 17:37:34 +0100 Subject: [PATCH 24/41] Fixed VC++ warnings. --- src/win32_fullscreen.c | 2 +- src/win32_input.c | 4 ++++ src/win32_window.c | 3 +++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/win32_fullscreen.c b/src/win32_fullscreen.c index 045fecab..26740d11 100644 --- a/src/win32_fullscreen.c +++ b/src/win32_fullscreen.c @@ -43,7 +43,7 @@ static GLboolean getClosestVideoMode(int* width, int* height, int* bpp, int* refreshRate, GLboolean exactBPP) { - int mode, bestWidth, bestHeight, bestBPP, bestRate; + int mode, bestWidth = 0, bestHeight = 0, bestBPP = 0, bestRate = 0; unsigned int sizeDiff, rateDiff, leastSizeDiff, leastRateDiff; GLboolean foundMode = GL_FALSE; DEVMODE dm; diff --git a/src/win32_input.c b/src/win32_input.c index a9195838..2178b145 100644 --- a/src/win32_input.c +++ b/src/win32_input.c @@ -106,6 +106,8 @@ static LRESULT CALLBACK keyboardHook(int nCode, WPARAM wParam, LPARAM lParam) void _glfwPlatformEnableSystemKeys(_GLFWwindow* window) { + UNREFERENCED_PARAMETER(window); + if (_glfwLibrary.Win32.keyboardHook != NULL) { UnhookWindowsHookEx(_glfwLibrary.Win32.keyboardHook); @@ -120,6 +122,8 @@ void _glfwPlatformEnableSystemKeys(_GLFWwindow* window) void _glfwPlatformDisableSystemKeys(_GLFWwindow* window) { + UNREFERENCED_PARAMETER(window); + _glfwLibrary.Win32.keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, keyboardHook, _glfwLibrary.Win32.instance, diff --git a/src/win32_window.c b/src/win32_window.c index 6bb9509d..75c8a8c1 100644 --- a/src/win32_window.c +++ b/src/win32_window.c @@ -41,6 +41,7 @@ static void hideCursor(_GLFWwindow* window) { + UNREFERENCED_PARAMETER(window); } @@ -69,6 +70,8 @@ static void captureCursor(_GLFWwindow* window) static void showCursor(_GLFWwindow* window) { + UNREFERENCED_PARAMETER(window); + // Un-capture cursor ReleaseCapture(); From 4fc32a4bbf2f5402fb8fc83adfe48b96ce287496 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Wed, 31 Oct 2012 16:11:09 +0100 Subject: [PATCH 25/41] Comment fix. --- src/internal.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/internal.h b/src/internal.h index 3f70426a..bbbced89 100644 --- a/src/internal.h +++ b/src/internal.h @@ -172,7 +172,7 @@ struct _GLFWwindow GLboolean closeRequested; // GL_TRUE if this window should be closed int width, height; int positionX, positionY; - int mode; // GLFW_WINDOW or GLFW_FULLSCREEN + int mode; // GLFW_WINDOWED or GLFW_FULLSCREEN GLboolean resizable; // GL_TRUE if user may resize this window GLboolean visible; // GL_TRUE if this window is visible int refreshRate; // monitor refresh rate From ad7bf4beba40f4b14ab4ee072742906d395ea9e2 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Mon, 5 Nov 2012 16:19:11 +0100 Subject: [PATCH 26/41] Replaced ad-hoc Linux detection with __linux__. --- CMakeLists.txt | 4 ---- src/config.h.in | 3 --- src/x11_init.c | 2 +- src/x11_joystick.c | 20 ++++++++++---------- 4 files changed, 11 insertions(+), 18 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index abfee8c9..a7d0625a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -185,10 +185,6 @@ if (_GLFW_X11_GLX) set(GLFW_PKG_LIBS "${GLFW_PKG_LIBS} -ldl") endif() endif() - - if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") - set(_GLFW_HAS_LINUX_JOYSTICKS 1) - endif() endif() #-------------------------------------------------------------------- diff --git a/src/config.h.in b/src/config.h.in index a432d947..4a8c1e3f 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -63,9 +63,6 @@ // Define this to 1 if glXGetProcAddressEXT is available #cmakedefine _GLFW_HAS_GLXGETPROCADDRESSEXT -// Define this to 1 if the Linux joystick API is available -#cmakedefine _GLFW_HAS_LINUX_JOYSTICKS - // The GLFW version as used by glfwGetVersionString #define _GLFW_VERSION_FULL "@GLFW_VERSION_FULL@" diff --git a/src/x11_init.c b/src/x11_init.c index 60a0add3..3fbbd608 100644 --- a/src/x11_init.c +++ b/src/x11_init.c @@ -719,7 +719,7 @@ const char* _glfwPlatformGetVersionString(void) #if defined(_POSIX_TIMERS) && defined(_POSIX_MONOTONIC_CLOCK) " clock_gettime" #endif -#if defined(_GLFW_HAS_LINUX_JOYSTICKS) +#if defined(__linux__) " Linux-joystick-API" #else " no-joystick-support" diff --git a/src/x11_joystick.c b/src/x11_joystick.c index 3d2f597d..93ab3e7f 100644 --- a/src/x11_joystick.c +++ b/src/x11_joystick.c @@ -30,7 +30,7 @@ #include "internal.h" -#ifdef _GLFW_HAS_LINUX_JOYSTICKS +#ifdef __linux__ #include #include @@ -41,7 +41,7 @@ #include #include #include -#endif // _GLFW_HAS_LINUX_JOYSTICKS +#endif // __linux__ //======================================================================== @@ -50,7 +50,7 @@ static int openJoystickDevice(int joy, const char* path) { -#ifdef _GLFW_HAS_LINUX_JOYSTICKS +#ifdef __linux__ char numAxes, numButtons; int fd, version; @@ -97,7 +97,7 @@ static int openJoystickDevice(int joy, const char* path) } _glfwLibrary.X11.joystick[joy].present = GL_TRUE; -#endif // _GLFW_HAS_LINUX_JOYSTICKS +#endif // __linux__ return GL_TRUE; } @@ -109,7 +109,7 @@ static int openJoystickDevice(int joy, const char* path) static void pollJoystickEvents(void) { -#ifdef _GLFW_HAS_LINUX_JOYSTICKS +#ifdef __linux__ int i; ssize_t result; struct js_event e; @@ -160,7 +160,7 @@ static void pollJoystickEvents(void) } } } -#endif // _GLFW_HAS_LINUX_JOYSTICKS +#endif // __linux__ } @@ -174,7 +174,7 @@ static void pollJoystickEvents(void) int _glfwInitJoysticks(void) { -#ifdef _GLFW_HAS_LINUX_JOYSTICKS +#ifdef __linux__ int i, joy = 0; regex_t regex; DIR* dir; @@ -215,7 +215,7 @@ int _glfwInitJoysticks(void) } regfree(®ex); -#endif // _GLFW_HAS_LINUX_JOYSTICKS +#endif // __linux__ return GL_TRUE; } @@ -227,7 +227,7 @@ int _glfwInitJoysticks(void) void _glfwTerminateJoysticks(void) { -#ifdef _GLFW_HAS_LINUX_JOYSTICKS +#ifdef __linux__ int i; for (i = 0; i <= GLFW_JOYSTICK_LAST; i++) @@ -241,7 +241,7 @@ void _glfwTerminateJoysticks(void) _glfwLibrary.X11.joystick[i].present = GL_FALSE; } } -#endif // _GLFW_HAS_LINUX_JOYSTICKS +#endif // __linux__ } From c9f4dedd96ea954e88f09c81fda8ed7d912ba09b Mon Sep 17 00:00:00 2001 From: "m@bitsnbites.eu" Date: Sun, 28 Oct 2012 00:23:28 +0200 Subject: [PATCH 27/41] Introduced window positioning hints and window position properties --- include/GL/glfw3.h | 2 ++ src/cocoa_window.m | 2 +- src/internal.h | 4 ++++ src/win32_window.c | 4 ++++ src/window.c | 16 ++++++++++++++++ src/x11_platform.h | 6 ++++++ src/x11_window.c | 17 ++++++++++++++++- tests/sharing.c | 14 ++++++-------- tests/threads.c | 4 ++-- tests/windows.c | 4 ++-- 10 files changed, 59 insertions(+), 14 deletions(-) diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h index 87ba9423..69fe6bfd 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -413,6 +413,8 @@ extern "C" { #define GLFW_OPENGL_ROBUSTNESS 0x00022006 #define GLFW_RESIZABLE 0x00022007 #define GLFW_VISIBLE 0x00022008 +#define GLFW_POSITION_X 0x00022009 +#define GLFW_POSITION_Y 0x0002200A /* GLFW_CLIENT_API tokens */ #define GLFW_OPENGL_API 0x00000001 diff --git a/src/cocoa_window.m b/src/cocoa_window.m index fd60d0ee..8fa1b866 100644 --- a/src/cocoa_window.m +++ b/src/cocoa_window.m @@ -686,7 +686,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]; diff --git a/src/internal.h b/src/internal.h index bbbced89..573c9851 100644 --- a/src/internal.h +++ b/src/internal.h @@ -107,6 +107,8 @@ struct _GLFWhints GLboolean glDebug; int glProfile; int glRobustness; + int positionX; + int positionY; }; @@ -123,6 +125,8 @@ struct _GLFWwndconfig int refreshRate; GLboolean resizable; GLboolean visible; + int positionX; + int positionY; int clientAPI; int glMajor; int glMinor; diff --git a/src/win32_window.c b/src/win32_window.c index 75c8a8c1..2e6070ae 100644 --- a/src/win32_window.c +++ b/src/win32_window.c @@ -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) diff --git a/src/window.c b/src/window.c index b86dcfec..bf499a0a 100644 --- a/src/window.c +++ b/src/window.c @@ -238,6 +238,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; @@ -369,6 +371,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,6 +443,12 @@ 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; @@ -747,6 +759,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: diff --git a/src/x11_platform.h b/src/x11_platform.h index a6b576ed..e2897216 100644 --- a/src/x11_platform.h +++ b/src/x11_platform.h @@ -141,6 +141,12 @@ typedef struct _GLFWwindowX11 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; diff --git a/src/x11_window.c b/src/x11_window.c index ae920e7f..a4233f26 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) @@ -1060,6 +1066,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; + } } diff --git a/tests/sharing.c b/tests/sharing.c index 41ce8db5..74e11478 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())); @@ -161,10 +163,6 @@ int main(int argc, char** argv) glColor3f(0.6f, 0.f, 0.6f); glfwCopyContext(windows[0], windows[1], GL_CURRENT_BIT); - // Put the second window to the right of the first one - glfwGetWindowPos(windows[0], &x, &y); - glfwSetWindowPos(windows[1], x + WIDTH + 50, y); - while (!closed) { glfwMakeContextCurrent(windows[0]); 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/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) From 424e7c7b5399a6caefec1bdacf28b81c58fd743f Mon Sep 17 00:00:00 2001 From: "m@bitsnbites.eu" Date: Sun, 28 Oct 2012 00:31:56 +0200 Subject: [PATCH 28/41] Removed glfwSetWindowPos and glfwGetWindowPos glfwGetWindowPos is superseded by glfwGetWindowParam() with GLFW_POSITION_X and GLFW_POSITION_Y as parameters. glfwSetWindowPos can easily lead to bad practices (moving windows around without the users consent), and has been replaced with the GLFW_POSITION_X/Y window hints that allow setting the window position for a newly created window. --- include/GL/glfw3.h | 2 -- src/cocoa_window.m | 21 --------------------- src/internal.h | 1 - src/win32_window.c | 17 ----------------- src/window.c | 46 ---------------------------------------------- src/x11_window.c | 10 ---------- 6 files changed, 97 deletions(-) diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h index 69fe6bfd..191633a2 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -538,8 +538,6 @@ GLFWAPI void glfwDestroyWindow(GLFWwindow window); GLFWAPI void glfwSetWindowTitle(GLFWwindow window, const char* title); GLFWAPI void glfwGetWindowSize(GLFWwindow window, int* width, int* height); 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); GLFWAPI void glfwIconifyWindow(GLFWwindow window); GLFWAPI void glfwRestoreWindow(GLFWwindow window); GLFWAPI void glfwShowWindow(GLFWwindow window); diff --git a/src/cocoa_window.m b/src/cocoa_window.m index 8fa1b866..5e4c7d81 100644 --- a/src/cocoa_window.m +++ b/src/cocoa_window.m @@ -1006,27 +1006,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/internal.h b/src/internal.h index 573c9851..2101ad23 100644 --- a/src/internal.h +++ b/src/internal.h @@ -294,7 +294,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); diff --git a/src/win32_window.c b/src/win32_window.c index 2e6070ae..fd342da6 100644 --- a/src/win32_window.c +++ b/src/win32_window.c @@ -1058,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 //======================================================================== diff --git a/src/window.c b/src/window.c index bf499a0a..986a0cb6 100644 --- a/src/window.c +++ b/src/window.c @@ -598,52 +598,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 //======================================================================== diff --git a/src/x11_window.c b/src/x11_window.c index a4233f26..28724750 100644 --- a/src/x11_window.c +++ b/src/x11_window.c @@ -1012,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 //======================================================================== From 1c21fc1383366c11488a774fe0d2d187d0c67d71 Mon Sep 17 00:00:00 2001 From: "m@bitsnbites.eu" Date: Sun, 28 Oct 2012 00:50:38 +0200 Subject: [PATCH 29/41] Removed GLFW_SYSTEM_KEYS from the GLFW API Rationale: Disabling system commands is inherently dangerous, and should not be encouraged. Also, it's very difficult to define and implement a reliable and consistent cross-platform mechanism. --- include/GL/glfw3.h | 3 +- src/CMakeLists.txt | 6 +- src/cocoa_input.m | 53 ----------------- src/cocoa_window.m | 3 +- src/input.c | 23 -------- src/internal.h | 1 - src/win32_input.c | 132 ------------------------------------------- src/win32_platform.h | 1 - src/window.c | 1 - src/x11_input.c | 65 --------------------- src/x11_platform.h | 1 - tests/events.c | 11 ---- 12 files changed, 5 insertions(+), 295 deletions(-) delete mode 100644 src/cocoa_input.m delete mode 100644 src/win32_input.c delete mode 100644 src/x11_input.c diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h index 191633a2..52ab1a75 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -434,8 +434,7 @@ extern "C" { #define GLFW_CURSOR_MODE 0x00030001 #define GLFW_STICKY_KEYS 0x00030002 #define GLFW_STICKY_MOUSE_BUTTONS 0x00030003 -#define GLFW_SYSTEM_KEYS 0x00030004 -#define GLFW_KEY_REPEAT 0x00030005 +#define GLFW_KEY_REPEAT 0x00030004 /* GLFW_CURSOR_MODE values */ #define GLFW_CURSOR_NORMAL 0x00040001 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_window.m b/src/cocoa_window.m index 5e4c7d81..24ba6628 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 { diff --git a/src/input.c b/src/input.c index 701da4f0..46c9da6e 100644 --- a/src/input.c +++ b/src/input.c @@ -115,24 +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 //======================================================================== @@ -295,8 +277,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: @@ -331,9 +311,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; diff --git a/src/internal.h b/src/internal.h index 2101ad23..50bfa4c6 100644 --- a/src/internal.h +++ b/src/internal.h @@ -186,7 +186,6 @@ struct _GLFWwindow GLboolean stickyKeys; GLboolean stickyMouseButtons; GLboolean keyRepeat; - GLboolean systemKeys; // system keys enabled flag int cursorPosX, cursorPosY; int cursorMode; double scrollX, scrollY; 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_platform.h b/src/win32_platform.h index ba10039e..217fc2cf 100644 --- a/src/win32_platform.h +++ b/src/win32_platform.h @@ -176,7 +176,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/window.c b/src/window.c index 986a0cb6..73bc1698 100644 --- a/src/window.c +++ b/src/window.c @@ -297,7 +297,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)) 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_platform.h b/src/x11_platform.h index e2897216..e577c22f 100644 --- a/src/x11_platform.h +++ b/src/x11_platform.h @@ -135,7 +135,6 @@ 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 diff --git a/tests/events.c b/tests/events.c index 9379ded9..4e3002cf 100644 --- a/tests/events.c +++ b/tests/events.c @@ -42,7 +42,6 @@ // These must match the input mode defaults static GLboolean keyrepeat = GL_FALSE; -static GLboolean systemkeys = GL_TRUE; static GLboolean closeable = GL_TRUE; // Event index @@ -320,15 +319,6 @@ static void key_callback(GLFWwindow window, int key, int action) 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; @@ -393,7 +383,6 @@ int main(void) 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"); From bce2cd65e1304360e05ff1995e5b50cee7f67568 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Thu, 22 Nov 2012 16:38:24 +0100 Subject: [PATCH 30/41] Begun outlining reference documentation. --- include/GL/glfw3.h | 1038 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 993 insertions(+), 45 deletions(-) diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h index 52ab1a75..957adbd0 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -35,6 +35,41 @@ 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 *************************************************************************/ @@ -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,84 @@ 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 */ +/*! @defgroup paramhints Window parameters and hints + * @ingroup window + * @{ */ + +/*! @brief @c GL_TRUE if the window is active, or @c GL_FALSE otherwise. + */ #define GLFW_ACTIVE 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 -/* 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,82 +528,282 @@ 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 +/*! @brief Whether to allow key repeat for the @link GLFWkeyfun key callback + * @endlink. + * @ingroup input + */ #define GLFW_KEY_REPEAT 0x00030004 +/*! @} */ -/* 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 +/*! @brief GLFW could not find support for the requested client API on the + * system. + */ #define GLFW_OPENGL_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 +/*! @brief The specified window needed to be active for the call to succeed. + */ #define GLFW_WINDOW_NOT_ACTIVE 0x00070009 +/*! @brief The clipboard did not contain data in the requested format. + */ #define GLFW_FORMAT_UNAVAILABLE 0x0007000A +/*! @} */ -/* 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 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 iconfiy/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; @@ -496,7 +813,9 @@ typedef struct int greenBits; } GLFWvidmode; -/* Gamma ramp */ +/*! @brief Gamma ramp. + * @ingroup gamma + */ typedef struct { unsigned short red[GLFW_GAMMA_RAMP_SIZE]; @@ -509,87 +828,716 @@ 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 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 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 */ +/*! @ingroup monitor + */ GLFWAPI GLFWvidmode* glfwGetVideoModes(int* count); + +/*! @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] 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 + * + * @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. + * This is a hard constraint. + * + * The @ref GLFW_FSAA_SAMPLES hint specifies the desired number of samples to + * use for multisampling. + * + * 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. This is a hard constraint. + * + * 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. This is a hard constraint. + * + * 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. This is + * a hard constraint. + * + * 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. 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. + * + * 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 + * + * @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. If @p width + * is zero, it will be set to 4/3 times @p height. If both are zero, it will + * be set to 640. + * @param[in] height The desired height, in pixels, of the window. If @p + * height is zero, it will be set to 3/4 times @p width. If both are zero, it + * will be set to 480. + * @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. + * + * @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 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 + */ 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 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); + +/*! @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. + * + * @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. + * + * @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, this function does nothing. + * + * @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, this function does nothing. + * + * @sa glfwShowWindow + */ GLFWAPI void glfwHideWindow(GLFWwindow window); -GLFWAPI int glfwGetWindowParam(GLFWwindow window, int param); + +/*! @brief Returns a property of the specified window. + * @ingroup window + */ +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 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 + */ 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 + */ 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 + */ 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 + */ 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 + */ GLFWAPI void glfwSetWindowIconifyCallback(GLFWwindow window, GLFWwindowiconifyfun cbfun); -/* Event handling */ +/*! @brief Processes all pending events. + * @ingroup window + * + * @sa glfwWaitEvents + */ GLFWAPI void glfwPollEvents(void); + +/*! @brief Waits until events are pending and processes them. + * @ingroup window + * + * @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. + * @arg @ref GLFW_KEY_REPEAT Sets whether key repeat is 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. + * @arg @ref GLFW_KEY_REPEAT Sets whether key repeat is 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 active. + * + * @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 + * + * @note 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 + * + * @note 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 + */ 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); -/* 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 + * + * @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 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); + +/*! @brief Copies the desired parts of the state of one window's context to another. + * @ingroup opengl + * + * @remarks This function may be called from secondary threads. + */ +GLFWAPI void glfwCopyContext(GLFWwindow src, GLFWwindow dst, unsigned long mask); /************************************************************************* From 14355d692fc4c8ac4446cda6ddeda650a0c36ef4 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Thu, 22 Nov 2012 17:04:44 +0100 Subject: [PATCH 31/41] Fixed active/focused nomenclature mixing. --- include/GL/glfw3.h | 10 +++++----- readme.html | 1 + src/init.c | 4 ++-- src/input.c | 4 ++-- src/internal.h | 4 ++-- src/win32_window.c | 36 ++++++++++++++++++------------------ src/window.c | 26 +++++++++++++------------- src/x11_window.c | 6 +++--- tests/events.c | 4 ++-- tests/fsfocus.c | 6 +++--- tests/iconify.c | 6 +++--- 11 files changed, 54 insertions(+), 53 deletions(-) diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h index 957adbd0..73a84d07 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -462,9 +462,9 @@ extern "C" { * @ingroup window * @{ */ -/*! @brief @c GL_TRUE if the window is active, or @c GL_FALSE otherwise. +/*! @brief @c GL_TRUE if the window has focus, or @c GL_FALSE otherwise. */ -#define GLFW_ACTIVE 0x00020001 +#define GLFW_FOCUSED 0x00020001 /*! @brief @c GL_TRUE if the window is iconified, or @c GL_FALSE otherwise. */ #define GLFW_ICONIFIED 0x00020002 @@ -679,9 +679,9 @@ extern "C" { * more specific categories. */ #define GLFW_PLATFORM_ERROR 0x00070008 -/*! @brief The specified window needed to be active for the call to succeed. +/*! @brief The specified window needed to be focused for the call to succeed. */ -#define GLFW_WINDOW_NOT_ACTIVE 0x00070009 +#define GLFW_WINDOW_NOT_FOCUSED 0x00070009 /*! @brief The clipboard did not contain data in the requested format. */ #define GLFW_FORMAT_UNAVAILABLE 0x0007000A @@ -1332,7 +1332,7 @@ GLFWAPI void glfwGetCursorPos(GLFWwindow window, int* xpos, int* ypos); * client area, or @c NULL. * @ingroup input * - * @note The specified window must be active. + * @note The specified window must be focused. * * @sa glfwGetCursorPos */ diff --git a/readme.html b/readme.html index cf5eb5b8..d73fa539 100644 --- a/readme.html +++ b/readme.html @@ -298,6 +298,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
    • diff --git a/src/init.c b/src/init.c index efcea20c..fd7d5833 100644 --- a/src/init.c +++ b/src/init.c @@ -228,8 +228,8 @@ GLFWAPI const char* glfwErrorString(int error) return "The requested OpenGL 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_WINDOW_NOT_FOCUSED: + return "The specified window is not focused"; case GLFW_FORMAT_UNAVAILABLE: return "The requested format is unavailable"; } diff --git a/src/input.c b/src/input.c index 46c9da6e..66e82b68 100644 --- a/src/input.c +++ b/src/input.c @@ -422,9 +422,9 @@ GLFWAPI void glfwSetCursorPos(GLFWwindow handle, int xpos, int ypos) return; } - if (_glfwLibrary.activeWindow != window) + if (_glfwLibrary.focusedWindow != window) { - _glfwSetError(GLFW_WINDOW_NOT_ACTIVE, NULL); + _glfwSetError(GLFW_WINDOW_NOT_FOCUSED, NULL); return; } diff --git a/src/internal.h b/src/internal.h index 50bfa4c6..c4ac9d2d 100644 --- a/src/internal.h +++ b/src/internal.h @@ -226,7 +226,7 @@ struct _GLFWlibrary _GLFWhints hints; _GLFWwindow* windowListHead; - _GLFWwindow* activeWindow; + _GLFWwindow* focusedWindow; GLFWgammaramp currentRamp; GLFWgammaramp originalRamp; @@ -321,7 +321,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/win32_window.c b/src/win32_window.c index fd342da6..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; @@ -829,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) { @@ -1132,7 +1132,7 @@ void _glfwPlatformPollEvents(void) MSG msg; _GLFWwindow* window; - window = _glfwLibrary.activeWindow; + window = _glfwLibrary.focusedWindow; if (window) { window->Win32.cursorCentered = GL_FALSE; @@ -1168,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; @@ -1186,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 73bc1698..ed6d2435 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); } } } @@ -502,9 +502,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); @@ -700,8 +700,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: diff --git a/src/x11_window.c b/src/x11_window.c index 28724750..01ba91ec 100644 --- a/src/x11_window.c +++ b/src/x11_window.c @@ -632,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; @@ -1134,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/events.c b/tests/events.c index 4e3002cf..3bd0d82e 100644 --- a/tests/events.c +++ b/tests/events.c @@ -248,12 +248,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) 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/iconify.c b/tests/iconify.c index f7a87cba..e10571c8 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) @@ -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); From b8c16e49f1bb677e0b9de44c3b1a4efaf472f42f Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Thu, 22 Nov 2012 17:04:54 +0100 Subject: [PATCH 32/41] Removed window size DWIM. --- include/GL/glfw3.h | 10 ++++------ src/window.c | 19 ++++--------------- tests/clipboard.c | 2 +- tests/defaults.c | 2 +- tests/events.c | 2 +- tests/gamma.c | 4 ++-- tests/glfwinfo.c | 2 +- tests/iconify.c | 4 ++-- tests/joysticks.c | 2 +- tests/peter.c | 2 +- tests/tearing.c | 2 +- tests/title.c | 2 +- 12 files changed, 20 insertions(+), 33 deletions(-) diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h index 73a84d07..ba2184da 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -1063,12 +1063,10 @@ 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. If @p width - * is zero, it will be set to 4/3 times @p height. If both are zero, it will - * be set to 640. - * @param[in] height The desired height, in pixels, of the window. If @p - * height is zero, it will be set to 3/4 times @p width. If both are zero, it - * will be set to 480. + * @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 diff --git a/src/window.c b/src/window.c index ed6d2435..908a2a7c 100644 --- a/src/window.c +++ b/src/window.c @@ -263,22 +263,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)); 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 3bd0d82e..e260cc3b 100644 --- a/tests/events.c +++ b/tests/events.c @@ -353,7 +353,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(); 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 e10571c8..b0b6b6a1 100644 --- a/tests/iconify.c +++ b/tests/iconify.c @@ -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); diff --git a/tests/joysticks.c b/tests/joysticks.c index a41eaa5f..c1abb5f8 100644 --- a/tests/joysticks.c +++ b/tests/joysticks.c @@ -186,7 +186,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/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/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())); From ef1da2dde952278ddc70451fb5031383e2eea0d8 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Thu, 22 Nov 2012 17:06:04 +0100 Subject: [PATCH 33/41] Added credit. --- readme.html | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/readme.html b/readme.html index d73fa539..14531575 100644 --- a/readme.html +++ b/readme.html @@ -935,8 +935,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
    • From c479124e69437f73ffae429eac9b3c3f52923e16 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Thu, 22 Nov 2012 17:14:50 +0100 Subject: [PATCH 34/41] Removed key repeat. --- examples/gears.c | 2 -- examples/wave.c | 2 -- include/GL/glfw3.h | 7 ------- readme.html | 2 +- src/input.c | 17 +---------------- src/internal.h | 1 - tests/events.c | 12 ------------ 7 files changed, 2 insertions(+), 41 deletions(-) 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 ba2184da..4b55ddfe 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -605,11 +605,6 @@ extern "C" { * @ingroup input */ #define GLFW_STICKY_MOUSE_BUTTONS 0x00030003 -/*! @brief Whether to allow key repeat for the @link GLFWkeyfun key callback - * @endlink. - * @ingroup input - */ -#define GLFW_KEY_REPEAT 0x00030004 /*! @} */ /*! @name Cursor modes @@ -1272,7 +1267,6 @@ GLFWAPI void glfwWaitEvents(void); * @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. - * @arg @ref GLFW_KEY_REPEAT Sets whether key repeat is enabled. * @ingroup input * * @sa glfwSetInputMode @@ -1284,7 +1278,6 @@ GLFWAPI int glfwGetInputMode(GLFWwindow window, int mode); * @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. - * @arg @ref GLFW_KEY_REPEAT Sets whether key repeat is enabled. * @ingroup input * * @sa glfwGetInputMode diff --git a/readme.html b/readme.html index 14531575..c2d18be4 100644 --- a/readme.html +++ b/readme.html @@ -313,7 +313,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
    • diff --git a/src/input.c b/src/input.c index 66e82b68..787103a8 100644 --- a/src/input.c +++ b/src/input.c @@ -115,16 +115,6 @@ static void setStickyMouseButtons(_GLFWwindow* window, int enabled) } -//======================================================================== -// Set key repeat for the specified window -//======================================================================== - -static void setKeyRepeat(_GLFWwindow* window, int enabled) -{ - window->keyRepeat = enabled; -} - - ////////////////////////////////////////////////////////////////////////// ////// GLFW internal API ////// ////////////////////////////////////////////////////////////////////////// @@ -154,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); } @@ -277,8 +267,6 @@ GLFWAPI int glfwGetInputMode(GLFWwindow handle, int mode) return window->stickyKeys; case GLFW_STICKY_MOUSE_BUTTONS: return window->stickyMouseButtons; - case GLFW_KEY_REPEAT: - return window->keyRepeat; default: _glfwSetError(GLFW_INVALID_ENUM, NULL); return 0; @@ -311,9 +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_KEY_REPEAT: - setKeyRepeat(window, value ? GL_TRUE : GL_FALSE); - break; default: _glfwSetError(GLFW_INVALID_ENUM, NULL); break; diff --git a/src/internal.h b/src/internal.h index c4ac9d2d..c43ad37f 100644 --- a/src/internal.h +++ b/src/internal.h @@ -185,7 +185,6 @@ struct _GLFWwindow // Window input state GLboolean stickyKeys; GLboolean stickyMouseButtons; - GLboolean keyRepeat; int cursorPosX, cursorPosY; int cursorMode; double scrollX, scrollY; diff --git a/tests/events.c b/tests/events.c index e260cc3b..3150a82e 100644 --- a/tests/events.c +++ b/tests/events.c @@ -41,7 +41,6 @@ #include // These must match the input mode defaults -static GLboolean keyrepeat = GL_FALSE; static GLboolean closeable = GL_TRUE; // Event index @@ -310,15 +309,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_C: { closeable = !closeable; @@ -382,8 +372,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("Main loop starting\n"); while (!glfwGetWindowParam(window, GLFW_CLOSE_REQUESTED)) From 998cb5144e3b69bfc141df302edc048c86f7c7dc Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Thu, 22 Nov 2012 17:20:16 +0100 Subject: [PATCH 35/41] Made glfwSetCursorPos fail silently if lacking focus. --- include/GL/glfw3.h | 5 +---- src/init.c | 2 -- src/input.c | 3 --- 3 files changed, 1 insertion(+), 9 deletions(-) diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h index 4b55ddfe..ce968823 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -674,12 +674,9 @@ extern "C" { * more specific categories. */ #define GLFW_PLATFORM_ERROR 0x00070008 -/*! @brief The specified window needed to be focused for the call to succeed. - */ -#define GLFW_WINDOW_NOT_FOCUSED 0x00070009 /*! @brief The clipboard did not contain data in the requested format. */ -#define GLFW_FORMAT_UNAVAILABLE 0x0007000A +#define GLFW_FORMAT_UNAVAILABLE 0x00070009 /*! @} */ /*! @brief The number of entries in the gamma ramp. diff --git a/src/init.c b/src/init.c index fd7d5833..e0a919c2 100644 --- a/src/init.c +++ b/src/init.c @@ -228,8 +228,6 @@ GLFWAPI const char* glfwErrorString(int error) return "The requested OpenGL version is unavailable"; case GLFW_PLATFORM_ERROR: return "A platform-specific error occurred"; - case GLFW_WINDOW_NOT_FOCUSED: - return "The specified window is not focused"; case GLFW_FORMAT_UNAVAILABLE: return "The requested format is unavailable"; } diff --git a/src/input.c b/src/input.c index 787103a8..2a077502 100644 --- a/src/input.c +++ b/src/input.c @@ -408,10 +408,7 @@ GLFWAPI void glfwSetCursorPos(GLFWwindow handle, int xpos, int ypos) } if (_glfwLibrary.focusedWindow != window) - { - _glfwSetError(GLFW_WINDOW_NOT_FOCUSED, NULL); return; - } // Don't do anything if the cursor position did not change if (xpos == window->cursorPosX && ypos == window->cursorPosY) From 9ad1d979e90716cf79349d29581b2536481c5505 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Thu, 22 Nov 2012 19:08:30 +0100 Subject: [PATCH 36/41] Conservatively tagged functions confined to main thread. --- include/GL/glfw3.h | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h index ce968823..f694e143 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -832,6 +832,8 @@ typedef struct * @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. * @@ -848,6 +850,8 @@ GLFWAPI int glfwInit(void); * * @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. @@ -971,6 +975,8 @@ GLFWAPI void glfwSetGammaRamp(const GLFWgammaramp* ramp); * * @ingroup window * + * @note This function may only be called from the main thread. + * * @sa glfwWindowHint */ GLFWAPI void glfwDefaultWindowHints(void); @@ -1049,6 +1055,8 @@ GLFWAPI void glfwDefaultWindowHints(void); * @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); @@ -1092,6 +1100,8 @@ GLFWAPI void glfwWindowHint(int target, int hint); * 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); @@ -1100,6 +1110,8 @@ GLFWAPI GLFWwindow glfwCreateWindow(int width, int height, int mode, const char* * @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. * @@ -1113,6 +1125,8 @@ GLFWAPI void glfwDestroyWindow(GLFWwindow 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); @@ -1132,6 +1146,8 @@ GLFWAPI void glfwGetWindowSize(GLFWwindow window, int* width, int* height); * @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 @@ -1148,6 +1164,8 @@ GLFWAPI void glfwSetWindowSize(GLFWwindow window, int width, int height); * * @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); @@ -1158,6 +1176,8 @@ GLFWAPI void glfwIconifyWindow(GLFWwindow 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); @@ -1168,6 +1188,8 @@ GLFWAPI void glfwRestoreWindow(GLFWwindow window); * * @remarks If the window is already visible, this function does nothing. * + * @note This function may only be called from the main thread. + * * @sa glfwHideWindow */ GLFWAPI void glfwShowWindow(GLFWwindow window); @@ -1178,6 +1200,8 @@ GLFWAPI void glfwShowWindow(GLFWwindow window); * * @remarks If the window is already hidden, this function does nothing. * + * @note This function may only be called from the main thread. + * * @sa glfwShowWindow */ GLFWAPI void glfwHideWindow(GLFWwindow window); @@ -1247,6 +1271,8 @@ GLFWAPI void glfwSetWindowIconifyCallback(GLFWwindow window, GLFWwindowiconifyfu /*! @brief Processes all pending events. * @ingroup window * + * @note This function may only be called from the main thread. + * * @sa glfwWaitEvents */ GLFWAPI void glfwPollEvents(void); @@ -1254,6 +1280,8 @@ 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); From 06e7a96c61d6013f7717c8a616b7e9c26bb2186b Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Thu, 22 Nov 2012 19:14:27 +0100 Subject: [PATCH 37/41] Fixed documentation spelling errors. --- include/GL/glfw3.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h index f694e143..f20fd1c7 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -76,7 +76,7 @@ extern "C" { /* ------------------- 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. * @@ -736,7 +736,7 @@ typedef void (* GLFWwindowrefreshfun)(GLFWwindow); */ typedef void (* GLFWwindowfocusfun)(GLFWwindow,int); -/*! @brief The function signature for window iconfiy/restore callbacks. +/*! @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. From 2a166c5086684d6e10d52a879aae92d8dbe53e03 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Thu, 22 Nov 2012 20:16:48 +0100 Subject: [PATCH 38/41] Removed glfwCopyContext to map better against EGL. --- include/GL/glfw3.h | 7 ------- readme.html | 1 - src/cocoa_opengl.m | 10 ---------- src/internal.h | 1 - src/opengl.c | 29 ----------------------------- src/win32_opengl.c | 14 -------------- src/x11_opengl.c | 13 ------------- tests/sharing.c | 7 +++++-- 8 files changed, 5 insertions(+), 77 deletions(-) diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h index f20fd1c7..525ba478 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -1548,13 +1548,6 @@ GLFWAPI int glfwExtensionSupported(const char* extension); */ GLFWAPI GLFWglproc glfwGetProcAddress(const char* procname); -/*! @brief Copies the desired parts of the state of one window's context to another. - * @ingroup opengl - * - * @remarks This function may be called from secondary threads. - */ -GLFWAPI void glfwCopyContext(GLFWwindow src, GLFWwindow dst, unsigned long mask); - /************************************************************************* * Global definition cleanup diff --git a/readme.html b/readme.html index c2d18be4..81100df6 100644 --- a/readme.html +++ b/readme.html @@ -279,7 +279,6 @@ version of GLFW.

    • 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_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
    • 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/internal.h b/src/internal.h index c43ad37f..c5a40af3 100644 --- a/src/internal.h +++ b/src/internal.h @@ -309,7 +309,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); //======================================================================== diff --git a/src/opengl.c b/src/opengl.c index 482db6ad..538bcdfb 100644 --- a/src/opengl.c +++ b/src/opengl.c @@ -682,32 +682,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_opengl.c b/src/win32_opengl.c index acbf09f5..7689f9c0 100644 --- a/src/win32_opengl.c +++ b/src/win32_opengl.c @@ -637,17 +637,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/x11_opengl.c b/src/x11_opengl.c index ccd59d87..790ad062 100644 --- a/src/x11_opengl.c +++ b/src/x11_opengl.c @@ -732,16 +732,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/tests/sharing.c b/tests/sharing.c index 74e11478..0042a858 100644 --- a/tests/sharing.c +++ b/tests/sharing.c @@ -158,10 +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); + + glfwMakeContextCurrent(windows[0]); while (!closed) { From 1e9383d0392f216aba306336eafe18a6caa70f81 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Fri, 23 Nov 2012 11:41:53 +0100 Subject: [PATCH 39/41] Documentation work. --- include/GL/glfw3.h | 64 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 55 insertions(+), 9 deletions(-) diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h index 525ba478..6e395670 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -930,11 +930,15 @@ GLFWAPI const char* glfwErrorString(int error); */ GLFWAPI void glfwSetErrorCallback(GLFWerrorfun cbfun); -/*! @ingroup monitor +/*! @brief This function will be replaced when the @c multi-monitor branch is + * merged. + * @ingroup monitor */ GLFWAPI GLFWvidmode* glfwGetVideoModes(int* count); -/*! @ingroup monitor +/*! @brief This function will be replaced when the @c multi-monitor branch is + * merged. + * @ingroup monitor */ GLFWAPI void glfwGetDesktopMode(GLFWvidmode* mode); @@ -1002,14 +1006,13 @@ GLFWAPI void glfwDefaultWindowHints(void); * buffers. * * The @ref GLFW_STEREO hint specifies whether to use stereoscopic rendering. - * This is a hard constraint. * * The @ref GLFW_FSAA_SAMPLES hint specifies the desired number of samples to * use for multisampling. * * 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. This is a hard constraint. + * 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. @@ -1022,15 +1025,14 @@ GLFWAPI void glfwDefaultWindowHints(void); * available. * * The @ref GLFW_OPENGL_FORWARD_COMPAT hint specifies whether the OpenGL - * context should be forward-compatible. This is a hard constraint. + * 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. This is - * a hard constraint. + * 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. @@ -1186,7 +1188,8 @@ GLFWAPI void glfwRestoreWindow(GLFWwindow window); * @param[in] window The window to make visible. * @ingroup window * - * @remarks If the window is already visible, this function does nothing. + * @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. * @@ -1198,7 +1201,8 @@ GLFWAPI void glfwShowWindow(GLFWwindow window); * @param[in] window The window to hide. * @ingroup window * - * @remarks If the window is already hidden, this function does nothing. + * @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. * @@ -1207,7 +1211,49 @@ GLFWAPI void glfwShowWindow(GLFWwindow window); GLFWAPI void glfwHideWindow(GLFWwindow window); /*! @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); From 06c191feea393ed21e9379c77af766caf4ef88b6 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Fri, 23 Nov 2012 12:00:49 +0100 Subject: [PATCH 40/41] Updated error codes to better reflect multi-API support. --- include/GL/glfw3.h | 2 +- src/init.c | 8 ++++---- src/win32_opengl.c | 2 +- src/x11_init.c | 2 +- src/x11_opengl.c | 11 +++++------ 5 files changed, 12 insertions(+), 13 deletions(-) diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h index 6e395670..8759ea79 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -666,7 +666,7 @@ extern "C" { /*! @brief GLFW could not find support for the requested client API on the * system. */ -#define GLFW_OPENGL_UNAVAILABLE 0x00070006 +#define GLFW_API_UNAVAILABLE 0x00070006 /*! @brief The requested OpenGL or GLES version is not available. */ #define GLFW_VERSION_UNAVAILABLE 0x00070007 diff --git a/src/init.c b/src/init.c index e0a919c2..4d7b731e 100644 --- a/src/init.c +++ b/src/init.c @@ -215,17 +215,17 @@ 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_FORMAT_UNAVAILABLE: diff --git a/src/win32_opengl.c b/src/win32_opengl.c index 7689f9c0..f1e911f3 100644 --- a/src/win32_opengl.c +++ b/src/win32_opengl.c @@ -189,7 +189,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; } 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_opengl.c b/src/x11_opengl.c index 790ad062..20b17e0e 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; } @@ -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; } @@ -465,7 +465,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 +473,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; } From fc697218076ad61393f00da253a78f2265267f3c Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Fri, 23 Nov 2012 12:02:09 +0100 Subject: [PATCH 41/41] Tagged comment. --- src/x11_opengl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/x11_opengl.c b/src/x11_opengl.c index 20b17e0e..ad77805a 100644 --- a/src/x11_opengl.c +++ b/src/x11_opengl.c @@ -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; }