From c5f7eff19019eb7e44704277924d554831ba47d4 Mon Sep 17 00:00:00 2001
From: Camilla Berglund
Date: Thu, 27 Sep 2012 02:35:19 +0200
Subject: [PATCH 01/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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__
}