Window close fix.
authorChristopher John Purnell <cjp@lost.org.uk>
Thu, 27 Nov 2003 19:49:53 +0000 (19:49 +0000)
committerChristopher John Purnell <cjp@lost.org.uk>
Thu, 27 Nov 2003 19:49:53 +0000 (19:49 +0000)
The default behaiour should now be the same as with glut.

git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@369 7f0cb862-5218-0410-a997-914c9d46530a

src/freeglut_gamemode.c
src/freeglut_internal.h
src/freeglut_main.c
src/freeglut_structure.c
src/freeglut_window.c

index 7c9b7eb..41b241b 100644 (file)
@@ -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
 
index b511d0d..e7f1100 100644 (file)
@@ -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 );
 
 /*
index e5b7c50..8350e32 100644 (file)
@@ -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:
index 55ce297..292ce7b 100644 (file)
@@ -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 );
 }
 
 /*
index 99f871f..c9d73ea 100644 (file)
@@ -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;
     }
 }