diff --git a/examples/boing.c b/examples/boing.c
index 8348df66..c0d3f0ee 100644
--- a/examples/boing.c
+++ b/examples/boing.c
@@ -89,7 +89,6 @@ DRAW_BALL_ENUM drawBallHow;
double t;
double t_old = 0.f;
double dt;
-static GLboolean running = GL_TRUE;
/* Random number generator */
#ifndef RAND_MAX
@@ -246,16 +245,6 @@ void reshape( GLFWwindow window, int w, int h )
}
-/*****************************************************************************
- * Window close callback
- *****************************************************************************/
-static int window_close_callback(GLFWwindow window)
-{
- running = GL_FALSE;
- return GL_TRUE;
-}
-
-
/*****************************************************************************
* Draw the Boing ball.
*
@@ -588,7 +577,6 @@ int main( void )
exit( EXIT_FAILURE );
}
- glfwSetWindowCloseCallback( window_close_callback );
glfwSetWindowSizeCallback( reshape );
glfwWindowHint(GLFW_DEPTH_BITS, 16);
@@ -611,7 +599,7 @@ int main( void )
init();
/* Main loop */
- do
+ for (;;)
{
/* Timing */
t = glfwGetTime();
@@ -627,9 +615,10 @@ int main( void )
/* Check if we are still running */
if (glfwGetKey( window, GLFW_KEY_ESCAPE ))
- running = GL_FALSE;
+ break;
+ if (glfwGetWindowParam(window, GLFW_CLOSE_REQUESTED))
+ break;
}
- while( running );
glfwTerminate();
exit( EXIT_SUCCESS );
diff --git a/examples/splitview.c b/examples/splitview.c
index e3f01806..2f53f45d 100644
--- a/examples/splitview.c
+++ b/examples/splitview.c
@@ -42,9 +42,6 @@ static int rot_x = 0, rot_y = 0, rot_z = 0;
// Do redraw?
static int do_redraw = 1;
-// Keep running?
-static GLboolean running = GL_TRUE;
-
//========================================================================
// Draw a solid torus (use a display list for the model)
@@ -438,17 +435,6 @@ static void mouseButtonFun(GLFWwindow window, int button, int action)
}
-//========================================================================
-// Window close callback function
-//========================================================================
-
-static int windowCloseFun(GLFWwindow window)
-{
- running = GL_FALSE;
- return GL_TRUE;
-}
-
-
//========================================================================
// main
//========================================================================
@@ -466,7 +452,6 @@ int main(void)
}
// Set callback functions
- glfwSetWindowCloseCallback(windowCloseFun);
glfwSetWindowSizeCallback(windowSizeFun);
glfwSetWindowRefreshCallback(windowRefreshFun);
glfwSetCursorPosCallback(cursorPosFun);
@@ -495,7 +480,7 @@ int main(void)
glfwSetInputMode(window, GLFW_CURSOR_MODE, GLFW_CURSOR_NORMAL);
// Main loop
- do
+ for (;;)
{
// Only redraw if we need to
if (do_redraw)
@@ -512,11 +497,12 @@ int main(void)
// Wait for new events
glfwWaitEvents();
+ // Check if the ESC key was pressed or the window should be closed
if (glfwGetKey(window, GLFW_KEY_ESCAPE))
- running = GL_FALSE;
-
- } // Check if the ESC key was pressed or the window was closed
- while (running);
+ break;
+ if (glfwGetWindowParam(window, GLFW_CLOSE_REQUESTED))
+ break;
+ }
// Close OpenGL window and terminate GLFW
glfwTerminate();
diff --git a/examples/triangle.c b/examples/triangle.c
index 8a352ca9..9ebfbcac 100644
--- a/examples/triangle.c
+++ b/examples/triangle.c
@@ -10,14 +10,6 @@
#define GLFW_INCLUDE_GLU
#include
-static GLboolean running = GL_TRUE;
-
-static int window_close_callback(GLFWwindow window)
-{
- running = GL_FALSE;
- return GL_TRUE;
-}
-
int main(void)
{
int width, height, x;
@@ -44,9 +36,7 @@ int main(void)
// Enable vertical sync (on cards that support it)
glfwSwapInterval(1);
- glfwSetWindowCloseCallback(window_close_callback);
-
- do
+ for (;;)
{
double t = glfwGetTime();
glfwGetCursorPos(window, &x, NULL);
@@ -92,11 +82,12 @@ int main(void)
glfwSwapBuffers(window);
glfwPollEvents();
+ // Check if the ESC key was pressed or the window should be closed
if (glfwGetKey(window, GLFW_KEY_ESCAPE))
- running = GL_FALSE;
-
- } // Check if the ESC key was pressed or the window was closed
- while (running);
+ break;
+ if (glfwGetWindowParam(window, GLFW_CLOSE_REQUESTED))
+ break;
+ }
// Close OpenGL window and terminate GLFW
glfwTerminate();
diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h
index d5a55fdd..050f0c30 100644
--- a/include/GL/glfw3.h
+++ b/include/GL/glfw3.h
@@ -388,6 +388,7 @@ extern "C" {
/* glfwGetWindowParam tokens */
#define GLFW_ACTIVE 0x00020001
#define GLFW_ICONIFIED 0x00020002
+#define GLFW_CLOSE_REQUESTED 0x00020003
#define GLFW_OPENGL_REVISION 0x00020004
/* glfwWindowHint tokens */
diff --git a/readme.html b/readme.html
index b93b7c6b..39d0739b 100644
--- a/readme.html
+++ b/readme.html
@@ -307,6 +307,7 @@ version of GLFW.
Replaced mouse wheel interface with two-dimensional, floating point scrolling interface
Replaced glfwEnable
and glfwDisable
with glfwGetInputMode
and glfwSetInputMode
Replaced joystick
test with graphical version
+ Replaced automatic closing of windows with GLFW_CLOSE_REQUESTED
window parameter
Made Unicode character input unaffected by GLFW_KEY_REPEAT
Removed event auto-polling and the GLFW_AUTO_POLL_EVENTS
window enable
Removed the Win32 port .def files
diff --git a/src/cocoa_window.m b/src/cocoa_window.m
index 0d8ec67d..446d718e 100644
--- a/src/cocoa_window.m
+++ b/src/cocoa_window.m
@@ -59,8 +59,7 @@
- (BOOL)windowShouldClose:(id)sender
{
- window->closeRequested = GL_TRUE;
-
+ _glfwInputWindowCloseRequest(window);
return NO;
}
@@ -127,7 +126,7 @@
_GLFWwindow* window;
for (window = _glfwLibrary.windowListHead; window; window = window->next)
- window->closeRequested = GL_TRUE;
+ _glfwInputWindowCloseRequest(window);
return NSTerminateCancel;
}
diff --git a/src/internal.h b/src/internal.h
index 982d868c..89ac48b2 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -337,6 +337,7 @@ void _glfwInputWindowPos(_GLFWwindow* window, int x, int y);
void _glfwInputWindowSize(_GLFWwindow* window, int width, int height);
void _glfwInputWindowIconify(_GLFWwindow* window, int iconified);
void _glfwInputWindowDamage(_GLFWwindow* window);
+void _glfwInputWindowCloseRequest(_GLFWwindow* window);
// Input event notification (input.c)
void _glfwInputKey(_GLFWwindow* window, int key, int action);
diff --git a/src/win32_window.c b/src/win32_window.c
index 62a53c03..00fb269d 100644
--- a/src/win32_window.c
+++ b/src/win32_window.c
@@ -532,8 +532,7 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
case WM_CLOSE:
{
- // Flag this window for closing (handled in glfwPollEvents)
- window->closeRequested = GL_TRUE;
+ _glfwInputWindowCloseRequest(window);
return 0;
}
@@ -1249,7 +1248,7 @@ void _glfwPlatformPollEvents(void)
window = _glfwLibrary.windowListHead;
while (window)
{
- window->closeRequested = GL_TRUE;
+ _glfwInputWindowCloseRequest(window);
window = window->next;
}
diff --git a/src/window.c b/src/window.c
index 5fc2b32f..81b525bd 100644
--- a/src/window.c
+++ b/src/window.c
@@ -44,31 +44,6 @@ static int Max(int a, int b)
}
-//========================================================================
-// Close all GLFW windows with the closed flag set
-//========================================================================
-
-static void closeFlaggedWindows(void)
-{
- _GLFWwindow* window;
-
- for (window = _glfwLibrary.windowListHead; window; )
- {
- if (window->closeRequested && _glfwLibrary.windowCloseCallback)
- window->closeRequested = _glfwLibrary.windowCloseCallback(window);
-
- if (window->closeRequested)
- {
- _GLFWwindow* next = window->next;
- glfwDestroyWindow(window);
- window = next;
- }
- else
- window = window->next;
- }
-}
-
-
//========================================================================
// Clear scroll offsets for all windows
//========================================================================
@@ -206,6 +181,19 @@ void _glfwInputWindowDamage(_GLFWwindow* window)
}
+//========================================================================
+// Register window close request events
+//========================================================================
+
+void _glfwInputWindowCloseRequest(_GLFWwindow* window)
+{
+ if (_glfwLibrary.windowCloseCallback)
+ window->closeRequested = _glfwLibrary.windowCloseCallback(window);
+ else
+ window->closeRequested = GL_TRUE;
+}
+
+
//////////////////////////////////////////////////////////////////////////
////// GLFW public API //////
//////////////////////////////////////////////////////////////////////////
@@ -662,6 +650,8 @@ GLFWAPI int glfwGetWindowParam(GLFWwindow handle, int param)
return window == _glfwLibrary.activeWindow;
case GLFW_ICONIFIED:
return window->iconified;
+ case GLFW_CLOSE_REQUESTED:
+ return window->closeRequested;
case GLFW_REFRESH_RATE:
return window->refreshRate;
case GLFW_WINDOW_RESIZABLE:
@@ -818,8 +808,6 @@ GLFWAPI void glfwPollEvents(void)
clearScrollOffsets();
_glfwPlatformPollEvents();
-
- closeFlaggedWindows();
}
@@ -838,7 +826,5 @@ GLFWAPI void glfwWaitEvents(void)
clearScrollOffsets();
_glfwPlatformWaitEvents();
-
- closeFlaggedWindows();
}
diff --git a/src/x11_window.c b/src/x11_window.c
index e90790f7..05d1be83 100644
--- a/src/x11_window.c
+++ b/src/x11_window.c
@@ -711,7 +711,7 @@ static void processSingleEvent(void)
// The window manager was asked to close the window, for example by
// the user pressing a 'close' window decoration button
- window->closeRequested = GL_TRUE;
+ _glfwInputWindowCloseRequest(window);
}
else if (_glfwLibrary.X11.wmPing != None &&
(Atom) event.xclient.data.l[0] == _glfwLibrary.X11.wmPing)
diff --git a/tests/accuracy.c b/tests/accuracy.c
index 079a88b8..acf9be2f 100644
--- a/tests/accuracy.c
+++ b/tests/accuracy.c
@@ -106,7 +106,7 @@ int main(void)
set_swap_interval(window, swap_interval);
- while (glfwGetCurrentContext())
+ while (!glfwGetWindowParam(window, GLFW_CLOSE_REQUESTED))
{
glClear(GL_COLOR_BUFFER_BIT);
diff --git a/tests/clipboard.c b/tests/clipboard.c
index 8ab90dbb..654de5f9 100644
--- a/tests/clipboard.c
+++ b/tests/clipboard.c
@@ -136,7 +136,7 @@ int main(int argc, char** argv)
glClearColor(0.5f, 0.5f, 0.5f, 0);
- while (glfwGetCurrentContext())
+ while (!glfwGetWindowParam(window, GLFW_CLOSE_REQUESTED))
{
glClear(GL_COLOR_BUFFER_BIT);
diff --git a/tests/events.c b/tests/events.c
index bd8b1546..20051a24 100644
--- a/tests/events.c
+++ b/tests/events.c
@@ -48,9 +48,6 @@ static GLboolean closeable = GL_TRUE;
// Event index
static unsigned int counter = 0;
-// Should we keep running?
-static GLboolean running = GL_TRUE;
-
static const char* get_key_name(int key)
{
switch (key)
@@ -238,9 +235,6 @@ static int window_close_callback(GLFWwindow window)
{
printf("%08x at %0.3f: Window close\n", counter++, glfwGetTime());
- if (closeable)
- running = GL_FALSE;
-
return closeable;
}
@@ -399,7 +393,7 @@ int main(void)
printf("Main loop starting\n");
- while (running)
+ while (!glfwGetWindowParam(window, GLFW_CLOSE_REQUESTED))
glfwWaitEvents();
glfwTerminate();
diff --git a/tests/fsaa.c b/tests/fsaa.c
index 93377b59..2a9ccfb5 100644
--- a/tests/fsaa.c
+++ b/tests/fsaa.c
@@ -127,7 +127,7 @@ int main(int argc, char** argv)
gluOrtho2D(0.f, 1.f, 0.f, 0.5f);
glMatrixMode(GL_MODELVIEW);
- while (glfwGetCurrentContext())
+ while (!glfwGetWindowParam(window, GLFW_CLOSE_REQUESTED))
{
GLfloat time = (GLfloat) glfwGetTime();
diff --git a/tests/gamma.c b/tests/gamma.c
index 1f3ca5e1..b2f1f2b8 100644
--- a/tests/gamma.c
+++ b/tests/gamma.c
@@ -151,7 +151,7 @@ int main(int argc, char** argv)
glClearColor(0.5f, 0.5f, 0.5f, 0);
- while (glfwGetCurrentContext())
+ while (!glfwGetWindowParam(window, GLFW_CLOSE_REQUESTED))
{
glClear(GL_COLOR_BUFFER_BIT);
diff --git a/tests/iconify.c b/tests/iconify.c
index 4f1c7d22..221d558f 100644
--- a/tests/iconify.c
+++ b/tests/iconify.c
@@ -126,7 +126,7 @@ int main(int argc, char** argv)
glEnable(GL_SCISSOR_TEST);
- while (glfwGetCurrentContext())
+ while (!glfwGetWindowParam(window, GLFW_CLOSE_REQUESTED))
{
int width, height;
diff --git a/tests/joysticks.c b/tests/joysticks.c
index 36952038..374ec82d 100644
--- a/tests/joysticks.c
+++ b/tests/joysticks.c
@@ -198,7 +198,7 @@ int main(void)
glfwSetWindowSizeCallback(window_size_callback);
glfwSwapInterval(1);
- while (glfwGetCurrentContext())
+ while (!glfwGetWindowParam(window, GLFW_CLOSE_REQUESTED))
{
glClear(GL_COLOR_BUFFER_BIT);
diff --git a/tests/peter.c b/tests/peter.c
index 7e0be921..be772e94 100644
--- a/tests/peter.c
+++ b/tests/peter.c
@@ -127,7 +127,7 @@ int main(void)
glClearColor(0.f, 0.f, 0.f, 0.f);
- while (glfwGetCurrentContext())
+ while (!glfwGetWindowParam(window_handle, GLFW_CLOSE_REQUESTED))
{
glClear(GL_COLOR_BUFFER_BIT);
diff --git a/tests/tearing.c b/tests/tearing.c
index 19ffe531..51e110ac 100644
--- a/tests/tearing.c
+++ b/tests/tearing.c
@@ -90,7 +90,7 @@ int main(void)
glOrtho(-1.f, 1.f, -1.f, 1.f, 1.f, -1.f);
glMatrixMode(GL_MODELVIEW);
- while (glfwGetCurrentContext())
+ while (!glfwGetWindowParam(window, GLFW_CLOSE_REQUESTED))
{
glClear(GL_COLOR_BUFFER_BIT);
diff --git a/tests/title.c b/tests/title.c
index 918d7eed..1370b338 100644
--- a/tests/title.c
+++ b/tests/title.c
@@ -58,7 +58,7 @@ int main(void)
glfwSetWindowSizeCallback(window_size_callback);
- while (glfwGetCurrentContext())
+ while (!glfwGetWindowParam(window, GLFW_CLOSE_REQUESTED))
{
glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(window);
diff --git a/tests/windows.c b/tests/windows.c
index 27c1bd30..ce0609af 100644
--- a/tests/windows.c
+++ b/tests/windows.c
@@ -32,14 +32,6 @@
#include
#include
-static GLboolean running = GL_TRUE;
-
-static int window_close_callback(GLFWwindow window)
-{
- running = GL_FALSE;
- return GL_TRUE;
-}
-
static const char* titles[] =
{
"Foo",
@@ -51,6 +43,7 @@ static const char* titles[] =
int main(void)
{
int i;
+ GLboolean running = GL_TRUE;
GLFWwindow windows[4];
if (!glfwInit())
@@ -60,8 +53,6 @@ int main(void)
exit(EXIT_FAILURE);
}
- glfwSetWindowCloseCallback(window_close_callback);
-
for (i = 0; i < 4; i++)
{
windows[i] = glfwCreateWindow(200, 200, GLFW_WINDOWED, titles[i], NULL);
@@ -88,6 +79,9 @@ int main(void)
glfwMakeContextCurrent(windows[i]);
glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(windows[i]);
+
+ if (glfwGetWindowParam(windows[i], GLFW_CLOSE_REQUESTED))
+ running = GL_FALSE;
}
glfwPollEvents();