Changed the overlay (freeglut_state.c:662) to return FALSE, as it's not imp
[freeglut] / freeglut-1.3 / freeglut_structure.c
index d3696ba..6b54d50 100644 (file)
@@ -32,7 +32,7 @@
 #define  G_LOG_DOMAIN  "freeglut-structure"
 
 #include "../include/GL/freeglut.h"
-#include "../include/GL/freeglut_internal.h"
+#include "freeglut_internal.h"
 
 
 /* -- GLOBAL EXPORTS ------------------------------------------------------- */
@@ -179,6 +179,17 @@ void fgAddToWindowDestroyList ( SFG_Window* window, GLboolean needToClose )
   WindowsToDestroy = new_list_entry ;
 
   /*
+   * Check if the window is the current one...
+   */
+  if ( fgStructure.Window == window )
+    fgStructure.Window = NULL;
+
+  /*
+   * If the destroyed window has the highest window ID number, decrement the window ID number
+   */
+  if ( window->ID == fgStructure.WindowID ) fgStructure.WindowID-- ;
+
+  /*
    * Check the execution state.  If this has been called from "glutDestroyWindow",
    * a statement in that function will reset the "ExecState" after this function returns.
    */
@@ -197,10 +208,8 @@ void fgAddToWindowDestroyList ( SFG_Window* window, GLboolean needToClose )
  */
 void fgCloseWindows ()
 {
-  fgExecutionState ExecState = fgState.ExecState ;
-
   SFG_WindowList *window_ptr = WindowsToDestroy ;
-  WindowsToDestroy = (SFG_WindowList*)NULL ;  // In case the destroy callbacks cause more windows to be closed
+  WindowsToDestroy = (SFG_WindowList*)NULL ;  /* In case the destroy callbacks cause more windows to be closed */
 
   while ( window_ptr )
   {
@@ -209,14 +218,12 @@ void fgCloseWindows ()
     free ( window_ptr ) ;
     window_ptr = next ;
 
-    if ( !window_ptr ) window_ptr = WindowsToDestroy ;
+    if ( !window_ptr )
+    {
+      window_ptr = WindowsToDestroy ;
+      WindowsToDestroy = (SFG_WindowList*)NULL ;
+    }
   }
-
-  /*
-   * Since the "fgDestroyWindow" function could easily have set the "ExecState" to stop,
-   * let's set it back to what it was.
-   */
-  fgState.ExecState = ExecState ;
 }
 
 /*
@@ -245,9 +252,15 @@ void fgDestroyWindow( SFG_Window* window, GLboolean needToClose )
 
     /*
      * If the programmer defined a destroy callback, call it
+     * A. Donev: But first make this the active window
      */
     if ( window->Callbacks.Destroy != NULL )
+    {
+      SFG_Window *activeWindow = fgStructure.Window ;
+      fgStructure.Window = window ;
       window->Callbacks.Destroy () ;
+      fgStructure.Window = activeWindow ;
+    }
 
     /*
      * Now we should remove the reference to this window from its parent
@@ -265,12 +278,6 @@ void fgDestroyWindow( SFG_Window* window, GLboolean needToClose )
         fgCloseWindow( window );
 
     /*
-     * Check if the window is the current one...
-     */
-    if( fgStructure.Window == window )
-        fgStructure.Window = NULL;
-
-    /*
      * Finally, we can delete the window's object. It hopefully does
      * have everything inside it freed and we do not have to care...
      */
@@ -353,6 +360,18 @@ void fgDestroyMenu( SFG_Menu* menu )
   }
 
   /*
+   * If the programmer defined a destroy callback, call it
+   * A. Donev: But first make this the active menu
+   */    
+  if ( menu->Destroy != NULL )
+  {
+    SFG_Menu *activeMenu=fgStructure.Menu;
+    fgStructure.Menu = menu;    
+    menu->Destroy () ;  
+    fgStructure.Menu = activeMenu;     
+  }        
+
+  /*
    * Now we are pretty sure the menu is not used anywhere
    * and that we can remove all of its entries
    */