diff --git a/examples/boing.c b/examples/boing.c index 8dc6ac95..a5914f9d 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, "Boing (classic Amiga demo)", NULL, 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 d5d93251..4b814b79 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, "Gears", NULL, 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 43f8da8a..60ac99d2 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 86339e4e..9b3e0858 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 6d15c7b3..52e11498 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 3dfce8ef..4ac443cc 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, "Wave Simulation", NULL, 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 a1341ea4..1021412c 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -546,6 +546,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, const char* title, GLFWmonitor monitor, GLFWwindow share); GLFWAPI void glfwDestroyWindow(GLFWwindow window); @@ -562,11 +563,11 @@ GLFWAPI int glfwGetWindowParam(GLFWwindow window, int param); GLFWAPI GLFWmonitor glfwGetWindowMonitor(GLFWwindow window); 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); @@ -580,12 +581,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 5b5e2214..f1dbb5b7 100644 --- a/readme.html +++ b/readme.html @@ -273,6 +273,7 @@ version of GLFW.

  • Added glfwSetMonitorUserPointer and glfwGetMonitorUserPointer for per-monitor user pointers
  • Added glfwSetMonitorCallback and GLFWmonitorfun for notification of changes in the set of available monitors
  • 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
  • @@ -323,6 +324,7 @@ version of GLFW.

  • Removed the entire threading API
  • Removed the entire image loading API
  • Removed deprecated Carbon port
  • +
  • Removed registering glfwTerminate with atexit
  • Removed glfwSleep function
  • Removed glfwGetNumberOfProcessors function
  • Removed glfwGetGLVersion function
  • diff --git a/src/init.c b/src/init.c index 453c2c66..02ccc111 100644 --- a/src/init.c +++ b/src/init.c @@ -121,9 +121,6 @@ GLFWAPI int glfwInit(void) memset(&_glfwLibrary, 0, sizeof(_glfwLibrary)); - // Not all window hints have zero as their default value - _glfwSetDefaultWindowHints(); - if (!_glfwPlatformInit()) { _glfwPlatformTerminate(); @@ -137,10 +134,11 @@ GLFWAPI int glfwInit(void) 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 df8fd249..ee82f5df 100644 --- a/src/internal.h +++ b/src/internal.h @@ -173,7 +173,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 @@ -199,6 +199,18 @@ struct _GLFWwindow int glRobustness; PFNGLGETSTRINGIPROC GetStringi; + GLFWwindowsizefun windowSizeCallback; + GLFWwindowclosefun windowCloseCallback; + GLFWwindowrefreshfun windowRefreshCallback; + GLFWwindowfocusfun windowFocusCallback; + GLFWwindowiconifyfun windowIconifyCallback; + GLFWmousebuttonfun mouseButtonCallback; + GLFWcursorposfun cursorPosCallback; + GLFWcursorenterfun cursorEnterCallback; + GLFWscrollfun scrollCallback; + GLFWkeyfun keyCallback; + GLFWcharfun charCallback; + // These are defined in the current port's platform.h _GLFW_PLATFORM_WINDOW_STATE; _GLFW_PLATFORM_CONTEXT_STATE; @@ -241,19 +253,7 @@ struct _GLFWlibrary _GLFWmonitor** monitors; int monitorCount; - - GLFWwindowsizefun windowSizeCallback; - GLFWwindowclosefun windowCloseCallback; - GLFWwindowrefreshfun windowRefreshCallback; - GLFWwindowfocusfun windowFocusCallback; - GLFWwindowiconifyfun windowIconifyCallback; - GLFWmousebuttonfun mouseButtonCallback; - GLFWcursorposfun cursorPosCallback; - GLFWcursorenterfun cursorEnterCallback; - GLFWscrollfun scrollCallback; - GLFWkeyfun keyCallback; - GLFWcharfun charCallback; - GLFWmonitorfun monitorCallback; + GLFWmonitorfun monitorCallback; GLFWgammaramp currentRamp; GLFWgammaramp originalRamp; @@ -385,9 +385,6 @@ void _glfwSplitBPP(int bpp, int* red, int* green, int* blue); // Error handling (init.c) void _glfwSetError(int error, const char* format, ...); -// Window management (window.c) -void _glfwSetDefaultWindowHints(void); - // OpenGL context helpers (opengl.c) int _glfwStringInExtensionString(const char* string, const GLubyte* extensions); const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired, diff --git a/src/window.c b/src/window.c index 7c85dc82..10a77f9b 100644 --- a/src/window.c +++ b/src/window.c @@ -68,32 +68,6 @@ static void clearScrollOffsets(void) ////// GLFW internal API ////// ////////////////////////////////////////////////////////////////////////// -//======================================================================== -// Reset all window hints to their default values -//======================================================================== - -void _glfwSetDefaultWindowHints(void) -{ - memset(&_glfwLibrary.hints, 0, sizeof(_glfwLibrary.hints)); - - // The default is OpenGL with minimum version 1.0 - _glfwLibrary.hints.clientAPI = GLFW_OPENGL_API; - _glfwLibrary.hints.glMajor = 1; - _glfwLibrary.hints.glMinor = 0; - - // The default is to show the window and allow window resizing - _glfwLibrary.hints.resizable = GL_TRUE; - _glfwLibrary.hints.visible = GL_TRUE; - - // The default is 24 bits of color, 24 bits of depth and 8 bits of stencil - _glfwLibrary.hints.redBits = 8; - _glfwLibrary.hints.greenBits = 8; - _glfwLibrary.hints.blueBits = 8; - _glfwLibrary.hints.depthBits = 24; - _glfwLibrary.hints.stencilBits = 8; -} - - //======================================================================== // Register window focus events //======================================================================== @@ -107,8 +81,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 { @@ -133,8 +107,8 @@ void _glfwInputWindowFocus(_GLFWwindow* window, GLboolean activated) _glfwLibrary.activeWindow = NULL; - if (_glfwLibrary.windowFocusCallback) - _glfwLibrary.windowFocusCallback(window, activated); + if (window->windowFocusCallback) + window->windowFocusCallback(window, activated); } } @@ -162,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); } @@ -178,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); } @@ -199,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); } @@ -210,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; } @@ -274,9 +248,6 @@ GLFWAPI GLFWwindow glfwCreateWindow(int width, int height, wndconfig.monitor = (_GLFWmonitor*) monitor; wndconfig.share = (_GLFWwindow*) share; - // Reset to default values for the next call - _glfwSetDefaultWindowHints(); - // Check the OpenGL bits of the window config if (!_glfwIsValidContextConfig(&wndconfig)) return GL_FALSE; @@ -369,6 +340,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 //======================================================================== @@ -819,15 +822,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; } @@ -835,15 +840,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; } @@ -851,15 +858,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; } @@ -867,15 +876,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; } @@ -883,15 +894,17 @@ GLFWAPI void glfwSetWindowFocusCallback(GLFWwindowfocusfun cbfun) // Set callback function for window iconification events //======================================================================== -GLFWAPI void glfwSetWindowIconifyCallback(GLFWwindowiconifyfun cbfun) +GLFWAPI void glfwSetWindowIconifyCallback(GLFWwindow handle, GLFWwindowiconifyfun cbfun) { + _GLFWwindow* window = (_GLFWwindow*) handle; + if (!_glfwInitialized) { _glfwSetError(GLFW_NOT_INITIALIZED, NULL); return; } - _glfwLibrary.windowIconifyCallback = cbfun; + window->windowIconifyCallback = cbfun; } diff --git a/tests/accuracy.c b/tests/accuracy.c index f9c485c9..e26d0456 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, "", NULL, 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 eafce3f7..9d4e2c18 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 a006e447..9febb2d0 100644 --- a/tests/events.c +++ b/tests/events.c @@ -386,19 +386,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); - glfwSetMonitorCallback(monitor_callback); - window = glfwCreateWindow(0, 0, "Event Linter", NULL, NULL); if (!window) { @@ -410,6 +397,20 @@ int main(void) printf("Window opened\n"); + glfwSetMonitorCallback(monitor_callback); + + 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 060d0b7b..a80f79ec 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, "Aliasing Detector", NULL, 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 a00e4fa4..72570ca3 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 aaed81d9..e65bd96f 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 f6e1aa75..3a4526c8 100644 --- a/tests/glfwinfo.c +++ b/tests/glfwinfo.c @@ -106,7 +106,10 @@ static void list_extensions(int api, int major, int minor) { PFNGLGETSTRINGIPROC glGetStringi = (PFNGLGETSTRINGIPROC) glfwGetProcAddress("glGetStringi"); if (!glGetStringi) + { + glfwTerminate(); exit(EXIT_FAILURE); + } glGetIntegerv(GL_NUM_EXTENSIONS, &count); @@ -267,7 +270,10 @@ int main(int argc, char** argv) window = glfwCreateWindow(0, 0, "Version", NULL, NULL); if (!window) + { + glfwTerminate(); exit(EXIT_FAILURE); + } glfwMakeContextCurrent(window); diff --git a/tests/iconify.c b/tests/iconify.c index d5544b07..06016bb3 100644 --- a/tests/iconify.c +++ b/tests/iconify.c @@ -144,11 +144,11 @@ int main(int argc, char** argv) glfwMakeContextCurrent(window); glfwSwapInterval(1); - glfwSetKeyCallback(key_callback); - glfwSetWindowSizeCallback(window_size_callback); - glfwSetWindowCloseCallback(window_close_callback); - glfwSetWindowFocusCallback(window_focus_callback); - glfwSetWindowIconifyCallback(window_iconify_callback); + glfwSetKeyCallback(window, key_callback); + glfwSetWindowSizeCallback(window, window_size_callback); + glfwSetWindowCloseCallback(window, window_close_callback); + glfwSetWindowFocusCallback(window, window_focus_callback); + glfwSetWindowIconifyCallback(window, window_iconify_callback); printf("Window is %s and %s\n", glfwGetWindowParam(window, GLFW_ICONIFIED) ? "iconified" : "restored", diff --git a/tests/joysticks.c b/tests/joysticks.c index 78bcb702..3f8c06cb 100644 --- a/tests/joysticks.c +++ b/tests/joysticks.c @@ -195,7 +195,7 @@ int main(void) exit(EXIT_FAILURE); } - glfwSetWindowSizeCallback(window_size_callback); + glfwSetWindowSizeCallback(window, window_size_callback); glfwMakeContextCurrent(window); glfwSwapInterval(1); diff --git a/tests/modes.c b/tests/modes.c index 478a9354..ecf54258 100644 --- a/tests/modes.c +++ b/tests/modes.c @@ -127,10 +127,6 @@ static void test_modes(GLFWmonitor monitor) int i, count; GLFWvidmode* modes = glfwGetVideoModes(monitor, &count); - glfwSetWindowSizeCallback(window_size_callback); - glfwSetWindowCloseCallback(window_close_callback); - glfwSetKeyCallback(key_callback); - for (i = 0; i < count; i++) { GLFWvidmode* mode = modes + i; @@ -157,6 +153,10 @@ static void test_modes(GLFWmonitor monitor) continue; } + glfwSetWindowSizeCallback(window_handle, window_size_callback); + glfwSetWindowCloseCallback(window_handle, window_close_callback); + glfwSetKeyCallback(window_handle, key_callback); + glfwMakeContextCurrent(window_handle); glfwSwapInterval(1); @@ -171,6 +171,8 @@ static void test_modes(GLFWmonitor monitor) if (!window_handle) { printf("User terminated program\n"); + + glfwTerminate(); exit(EXIT_SUCCESS); } } @@ -244,6 +246,7 @@ int main(int argc, char** argv) test_modes(monitors[i]); } + glfwTerminate(); exit(EXIT_SUCCESS); } diff --git a/tests/peter.c b/tests/peter.c index 6515d2e4..68cbcd2d 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 c095424e..5097b65b 100644 --- a/tests/reopen.c +++ b/tests/reopen.c @@ -85,9 +85,9 @@ static GLboolean open_window(int width, int height, GLFWmonitor monitor) 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", monitor ? "fullscreen" : "windowed", @@ -124,7 +124,10 @@ int main(int argc, char** argv) monitor = glfwGetPrimaryMonitor(); if (!open_window(640, 480, monitor)) + { + glfwTerminate(); exit(EXIT_FAILURE); + } glMatrixMode(GL_PROJECTION); glOrtho(-1.f, 1.f, -1.f, 1.f, 1.f, -1.f); @@ -148,6 +151,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 6989105b..e02128f5 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 734b96c8..81b7738d 100644 --- a/tests/tearing.c +++ b/tests/tearing.c @@ -73,17 +73,17 @@ int main(void) window = glfwCreateWindow(0, 0, "", NULL, 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/title.c b/tests/title.c index b151d751..4c5a9163 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 46481dfb..a49cb727 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); }