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/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 5139a493..6abaa1ec 100644
--- a/examples/heightmap.c
+++ b/examples/heightmap.c
@@ -595,12 +595,14 @@ int main(int argc, char** argv)
free(vertex_shader_src);
free(fragment_shader_src);
+
+ glfwTerminate();
exit(EXIT_FAILURE);
}
/* 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())
@@ -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..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
@@ -463,9 +457,17 @@ int main(void)
if (!window)
{
fprintf(stderr, "Failed to open GLFW window\n");
+
+ glfwTerminate();
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/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/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 6fac278c..6e8340be 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
@@ -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
@@ -525,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);
@@ -540,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);
@@ -558,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/readme.html b/readme.html
index c6047bb7..cf5eb5b8 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
@@ -279,10 +280,10 @@ 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_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
@@ -317,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/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/src/cocoa_window.m b/src/cocoa_window.m
index efdc0c6b..fd60d0ee 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];
@@ -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 ||
@@ -962,7 +969,6 @@ void _glfwPlatformDestroyWindow(_GLFWwindow* window)
[window->NSGL.pixelFormat release];
window->NSGL.pixelFormat = nil;
- [NSOpenGLContext clearCurrentContext];
[window->NSGL.context release];
window->NSGL.context = nil;
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/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;
diff --git a/src/init.c b/src/init.c
index 7e9fe4e7..efcea20c 100644
--- a/src/init.c
+++ b/src/init.c
@@ -121,19 +121,17 @@ GLFWAPI int glfwInit(void)
memset(&_glfwLibrary, 0, sizeof(_glfwLibrary));
- // Not all window hints have zero as their default value
- _glfwSetDefaultWindowHints();
-
if (!_glfwPlatformInit())
{
_glfwPlatformTerminate();
return GL_FALSE;
}
- atexit(glfwTerminate);
-
_glfwInitialized = GL_TRUE;
+ // Not all window hints have zero as their default value
+ glfwDefaultWindowHints();
+
return GL_TRUE;
}
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 0183975e..0fbd4b87 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;
@@ -170,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
@@ -188,12 +190,25 @@ struct _GLFWwindow
char key[GLFW_KEY_LAST + 1];
// OpenGL extensions and context attributes
+ int clientAPI;
int glMajor, glMinor, glRevision;
GLboolean glForward, glDebug;
int glProfile;
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;
@@ -210,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;
@@ -348,9 +351,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/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_fullscreen.c b/src/win32_fullscreen.c
index 35d75054..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;
@@ -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;
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_opengl.c b/src/win32_opengl.c
index d6e1b490..acbf09f5 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;
@@ -407,7 +411,7 @@ static GLboolean createContext(_GLFWwindow* window,
if (wndconfig->glRobustness)
{
- int strategy;
+ int strategy = 0;
if (!window->WGL.ARB_create_context_robustness)
{
@@ -524,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..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();
@@ -947,8 +950,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 e9da2367..b86dcfec 100644
--- a/src/window.c
+++ b/src/window.c
@@ -68,30 +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 minimum OpenGL version is 1.0
- _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 depth, 8 bits of color
- _glfwLibrary.hints.depthBits = 24;
- _glfwLibrary.hints.redBits = 8;
- _glfwLibrary.hints.greenBits = 8;
- _glfwLibrary.hints.blueBits = 8;
-}
-
-
//========================================================================
// Register window focus events
//========================================================================
@@ -104,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
@@ -130,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);
}
}
}
@@ -160,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);
}
@@ -176,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);
}
@@ -197,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);
}
@@ -208,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;
}
@@ -262,16 +238,14 @@ 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;
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;
-
- // Reset to default values for the next call
- _glfwSetDefaultWindowHints();
+ wndconfig.share = (_GLFWwindow*) share;
// Check the OpenGL bits of the window config
if (!_glfwIsValidContextConfig(&wndconfig))
@@ -305,15 +279,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;
@@ -374,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
//========================================================================
@@ -436,6 +440,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;
@@ -479,8 +486,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);
@@ -740,6 +747,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:
@@ -801,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;
}
@@ -817,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;
}
@@ -833,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;
}
@@ -849,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;
}
@@ -865,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/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 67bca947..d9b0116b 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
@@ -42,7 +42,7 @@
#include
#include
#include
-#endif // _GLFW_HAS_LINUX_JOYSTICKS
+#endif // __linux__
//========================================================================
@@ -51,7 +51,7 @@
static int openJoystickDevice(int joy, const char* path)
{
-#ifdef _GLFW_HAS_LINUX_JOYSTICKS
+#ifdef __linux__
char numAxes, numButtons;
char name[256];
int fd, version;
@@ -104,7 +104,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;
}
@@ -116,7 +116,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;
@@ -167,7 +167,7 @@ static void pollJoystickEvents(void)
}
}
}
-#endif // _GLFW_HAS_LINUX_JOYSTICKS
+#endif // __linux__
}
@@ -181,7 +181,7 @@ static void pollJoystickEvents(void)
int _glfwInitJoysticks(void)
{
-#ifdef _GLFW_HAS_LINUX_JOYSTICKS
+#ifdef __linux__
int i, joy = 0;
regex_t regex;
DIR* dir;
@@ -222,7 +222,7 @@ int _glfwInitJoysticks(void)
}
regfree(®ex);
-#endif // _GLFW_HAS_LINUX_JOYSTICKS
+#endif // __linux__
return GL_TRUE;
}
@@ -234,7 +234,7 @@ int _glfwInitJoysticks(void)
void _glfwTerminateJoysticks(void)
{
-#ifdef _GLFW_HAS_LINUX_JOYSTICKS
+#ifdef __linux__
int i;
for (i = 0; i <= GLFW_JOYSTICK_LAST; i++)
@@ -249,7 +249,7 @@ void _glfwTerminateJoysticks(void)
_glfwLibrary.X11.joystick[i].present = GL_FALSE;
}
}
-#endif // _GLFW_HAS_LINUX_JOYSTICKS
+#endif // __linux__
}
diff --git a/src/x11_opengl.c b/src/x11_opengl.c
index af1e0ffb..ccd59d87 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);
}
@@ -614,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;
}
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;
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/glfwinfo.c b/tests/glfwinfo.c
index d11c861d..792e4bd5 100644
--- a/tests/glfwinfo.c
+++ b/tests/glfwinfo.c
@@ -42,60 +42,74 @@
#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");
}
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_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)
+static const char* get_profile_name_gl(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 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;
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)
+ {
+ glfwTerminate();
exit(EXIT_FAILURE);
+ }
glGetIntegerv(GL_NUM_EXTENSIONS, &count);
@@ -147,7 +161,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 +169,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 +206,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 +248,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);
@@ -245,66 +270,88 @@ int main(int argc, char** argv)
window = glfwCreateWindow(0, 0, GLFW_WINDOWED, "Version", NULL);
if (!window)
+ {
+ glfwTerminate();
exit(EXIT_FAILURE);
+ }
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))
+ {
+ 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_gl(mask));
+
+ printf("%s profile mask parsed by GLFW: %s\n",
+ get_client_api_name(api),
+ get_profile_name_glfw(profile));
+ }
}
- 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);
diff --git a/tests/iconify.c b/tests/iconify.c
index 77815358..f7a87cba 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)
@@ -131,26 +144,20 @@ 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);
+ glfwSetWindowFocusCallback(window, window_focus_callback);
+ glfwSetWindowIconifyCallback(window, 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);
diff --git a/tests/joysticks.c b/tests/joysticks.c
index f2ba7452..639f8503 100644
--- a/tests/joysticks.c
+++ b/tests/joysticks.c
@@ -200,7 +200,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 ef1db71c..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);
@@ -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..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;
}
@@ -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..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),
@@ -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..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;
}
@@ -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..e3149c35 100644
--- a/tests/tearing.c
+++ b/tests/tearing.c
@@ -73,17 +73,17 @@ 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);
}
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/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;
diff --git a/tests/title.c b/tests/title.c
index c7539033..a9abebb2 100644
--- a/tests/title.c
+++ b/tests/title.c
@@ -51,13 +51,15 @@ int main(void)
if (!window)
{
fprintf(stderr, "Failed to open GLFW window: %s\n", glfwErrorString(glfwGetError()));
+
+ glfwTerminate();
exit(EXIT_FAILURE);
}
glfwMakeContextCurrent(window);
glfwSwapInterval(1);
- glfwSetWindowSizeCallback(window_size_callback);
+ glfwSetWindowSizeCallback(window, window_size_callback);
while (!glfwGetWindowParam(window, GLFW_CLOSE_REQUESTED))
{
@@ -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);
}