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); }