diff --git a/freeglut/freeglut/src/freeglut_gamemode.c b/freeglut/freeglut/src/freeglut_gamemode.c index 7c9b7eb..41b241b 100644 --- a/freeglut/freeglut/src/freeglut_gamemode.c +++ b/freeglut/freeglut/src/freeglut_gamemode.c @@ -413,7 +413,7 @@ void FGAPIENTRY glutGameModeString( const char* string ) int FGAPIENTRY glutEnterGameMode( void ) { if( fgStructure.GameMode ) - fgAddToWindowDestroyList( fgStructure.GameMode, GL_TRUE ); + fgAddToWindowDestroyList( fgStructure.GameMode ); else fghRememberState( ); @@ -534,7 +534,7 @@ void FGAPIENTRY glutLeaveGameMode( void ) { freeglut_return_if_fail( fgStructure.GameMode ); - fgAddToWindowDestroyList( fgStructure.GameMode, GL_TRUE ); + fgAddToWindowDestroyList( fgStructure.GameMode ); #if TARGET_HOST_UNIX_X11 diff --git a/freeglut/freeglut/src/freeglut_internal.h b/freeglut/freeglut/src/freeglut_internal.h index b511d0d..e7f1100 100644 --- a/freeglut/freeglut/src/freeglut_internal.h +++ b/freeglut/freeglut/src/freeglut_internal.h @@ -544,7 +544,6 @@ typedef struct tagSFG_WindowList SFG_WindowList ; struct tagSFG_WindowList { SFG_Window *window ; - GLboolean needToClose ; SFG_WindowList *next ; }; @@ -721,10 +720,9 @@ void fgOpenWindow( SFG_Window* window, const char* title, int x, int y, int w, int h, GLboolean gameMode, GLboolean isSubWindow ); void fgCloseWindow( SFG_Window* window ); -void fgAddToWindowDestroyList ( SFG_Window* window, - GLboolean needToClose ); +void fgAddToWindowDestroyList ( SFG_Window* window ); void fgCloseWindows (); -void fgDestroyWindow( SFG_Window* window, GLboolean needToClose ); +void fgDestroyWindow( SFG_Window* window ); void fgClearCallBacks( SFG_Window *window ); /* diff --git a/freeglut/freeglut/src/freeglut_main.c b/freeglut/freeglut/src/freeglut_main.c index e5b7c50..8350e32 100644 --- a/freeglut/freeglut/src/freeglut_main.c +++ b/freeglut/freeglut/src/freeglut_main.c @@ -553,8 +553,16 @@ void FGAPIENTRY glutMainLoopEvent( void ) { GETWINDOW( xclient ); - fgCloseWindow ( window ); - fgAddToWindowDestroyList ( window, GL_FALSE ); + fgDestroyWindow ( window ); + + if( fgState.ActionOnWindowClose == GLUT_ACTION_EXIT ) + { + fgDeinitialize( ); + exit( 0 ); + } + + fgState.ExecState = GLUT_EXEC_STATE_STOP; + return; } break; @@ -584,7 +592,7 @@ void FGAPIENTRY glutMainLoopEvent( void ) * This is sent to confirm the XDestroyWindow call. * XXX WHY is this commented out? Should we re-enable it? */ - /* fgAddToWindowDestroyList ( window, GL_FALSE ); */ + /* fgAddToWindowDestroyList ( window ); */ break; case Expose: @@ -988,7 +996,15 @@ void FGAPIENTRY glutMainLoopEvent( void ) while( PeekMessage( &stMsg, NULL, 0, 0, PM_NOREMOVE ) ) { if( GetMessage( &stMsg, NULL, 0, 0 ) == 0 ) - fgState.ExecState = GLUT_EXEC_STATE_STOP ; + { + if( fgState.ActionOnWindowClose == GLUT_ACTION_EXIT ) + { + fgDeinitialize( ); + exit( 0 ); + } + fgState.ExecState = GLUT_EXEC_STATE_STOP; + return; + } TranslateMessage( &stMsg ); DispatchMessage( &stMsg ); @@ -1054,18 +1070,11 @@ void FGAPIENTRY glutMainLoop( void ) } } - { - fgExecutionState execState = fgState.ExecState; - - /* - * When this loop terminates, destroy the display, state and structure - * of a freeglut session, so that another glutInit() call can happen - */ - fgDeinitialize( ); - - if( execState == GLUT_ACTION_EXIT ) - exit( 0 ); - } + /* + * When this loop terminates, destroy the display, state and structure + * of a freeglut session, so that another glutInit() call can happen + */ + fgDeinitialize( ); } /* @@ -1248,38 +1257,9 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, break; case WM_CLOSE: - /* - * Make sure we don't close a window with current context active - */ - if( fgStructure.Window == window ) - { - int used = FALSE ; - SFG_Window *iter ; - - wglMakeCurrent( NULL, NULL ); - /* - * Step through the list of windows. If the rendering context - * is not being used by another window, then we delete it. - */ - for( iter = (SFG_Window *)fgStructure.Windows.First; - iter; - iter = (SFG_Window *)iter->Node.Next ) - { - if( ( iter->Window.Context == window->Window.Context ) && - ( iter != window ) ) - used = TRUE; - } - - if( ! used ) - wglDeleteContext( window->Window.Context ); - } - - /* - * Put on a linked list of windows to be removed after all the - * callbacks have returned - */ - fgAddToWindowDestroyList( window, GL_FALSE ); - DestroyWindow( hWnd ); + fgDestroyWindow ( window ); + if ( fgState.ActionOnWindowClose != GLUT_ACTION_CONTINUE_EXECUTION ) + PostQuitMessage(0); break; case WM_DESTROY: diff --git a/freeglut/freeglut/src/freeglut_structure.c b/freeglut/freeglut/src/freeglut_structure.c index 55ce297..292ce7b 100644 --- a/freeglut/freeglut/src/freeglut_structure.c +++ b/freeglut/freeglut/src/freeglut_structure.c @@ -183,12 +183,11 @@ static SFG_WindowList* WindowsToDestroy = ( SFG_WindowList* )NULL; * Subwindows are automatically added because they hang from the window * structure. */ -void fgAddToWindowDestroyList( SFG_Window* window, GLboolean needToClose ) +void fgAddToWindowDestroyList( SFG_Window* window ) { SFG_WindowList *new_list_entry = ( SFG_WindowList* )malloc( sizeof(SFG_WindowList ) ); new_list_entry->window = window; - new_list_entry->needToClose = needToClose; new_list_entry->next = WindowsToDestroy; WindowsToDestroy = new_list_entry; @@ -211,18 +210,6 @@ void fgAddToWindowDestroyList( SFG_Window* window, GLboolean needToClose ) fgClearCallBacks( window ); FETCH_WCB( *window, Destroy ) = destroy; } - - /* - * Check the execution state. If this has been called from - * "glutDestroyWindow", a statement in that function will reset the - * "ExecState" after this function returns. - */ - if( fgState.ActionOnWindowClose != GLUT_ACTION_CONTINUE_EXECUTION ) - /* - * Set the execution state flag to drop out of the main loop. - */ - if( fgState.ActionOnWindowClose == GLUT_ACTION_EXIT ) - fgState.ExecState = GLUT_EXEC_STATE_STOP; } /* @@ -237,7 +224,7 @@ void fgCloseWindows( ) while( window_ptr ) { SFG_WindowList *next = window_ptr->next; - fgDestroyWindow( window_ptr->window, window_ptr->needToClose ); + fgDestroyWindow( window_ptr->window ); free( window_ptr ); window_ptr = next; @@ -254,7 +241,7 @@ void fgCloseWindows( ) * another function, defined in freeglut_window.c is called, but this is * a whole different story... */ -void fgDestroyWindow( SFG_Window* window, GLboolean needToClose ) +void fgDestroyWindow( SFG_Window* window ) { SFG_Window* subWindow; int menu_index ; @@ -263,7 +250,7 @@ void fgDestroyWindow( SFG_Window* window, GLboolean needToClose ) freeglut_assert_ready; while( subWindow = ( SFG_Window * )window->Children.First ) - fgDestroyWindow( subWindow, needToClose ); + fgDestroyWindow( subWindow ); { SFG_Window *activeWindow = fgStructure.Window ; @@ -286,8 +273,7 @@ void fgDestroyWindow( SFG_Window* window, GLboolean needToClose ) } fgClearCallBacks( window ); - if( needToClose ) - fgCloseWindow( window ); + fgCloseWindow( window ); free( window ); if( fgStructure.Window == window ) fgStructure.Window = NULL; @@ -393,7 +379,7 @@ void fgDestroyMenu( SFG_Menu* menu ) if( fgStructure.Window == menu->Window ) fgSetWindow( menu->ParentWindow ); - fgDestroyWindow( menu->Window, GL_TRUE ); + fgDestroyWindow( menu->Window ); fgListRemove( &fgStructure.Menus, &menu->Node ); if( fgStructure.Menu == menu ) fgStructure.Menu = NULL; @@ -438,7 +424,7 @@ void fgDestroyStructure( void ) fgDestroyMenu( menu ); while( window = ( SFG_Window * )fgStructure.Windows.First ) - fgDestroyWindow( window, GL_TRUE ); + fgDestroyWindow( window ); } /* diff --git a/freeglut/freeglut/src/freeglut_window.c b/freeglut/freeglut/src/freeglut_window.c index 99f871f..c9d73ea 100644 --- a/freeglut/freeglut/src/freeglut_window.c +++ b/freeglut/freeglut/src/freeglut_window.c @@ -554,13 +554,34 @@ void fgCloseWindow( SFG_Window* window ) #elif TARGET_HOST_WIN32 - SendMessage( - window->Window.Handle, - WM_CLOSE, - 0, - 0 - ); + /* + * Make sure we don't close a window with current context active + */ + if( fgStructure.Window == window ) + wglMakeCurrent( NULL, NULL ); + /* + * Step through the list of windows. If the rendering context + * is not being used by another window, then we delete it. + */ + { + int used = FALSE ; + SFG_Window *iter ; + + for( iter = (SFG_Window *)fgStructure.Windows.First; + iter; + iter = (SFG_Window *)iter->Node.Next ) + { + if( ( iter->Window.Context == window->Window.Context ) && + ( iter != window ) ) + used = TRUE; + } + + if( ! used ) + wglDeleteContext( window->Window.Context ); + } + + DestroyWindow( hWnd ); #endif } @@ -601,7 +622,7 @@ void FGAPIENTRY glutDestroyWindow( int windowID ) freeglut_return_if_fail( window != NULL ); { fgExecutionState ExecState = fgState.ExecState; - fgAddToWindowDestroyList( window, GL_TRUE ); + fgAddToWindowDestroyList( window ); fgState.ExecState = ExecState; } }