strlen expects (char *), rather than (unsigned char *)
[freeglut] / src / freeglut_structure.c
index 6aa02fd..8b0a837 100644 (file)
@@ -42,6 +42,7 @@
 
 SFG_Structure fgStructure = { { NULL, NULL },  /* The list of windows       */
                               { NULL, NULL },  /* The list of menus         */
+                              { NULL, NULL },  /* Windows to Destroy list   */
                               NULL,            /* The current window        */
                               NULL,            /* The current menu          */
                               NULL,            /* The menu OpenGL context   */
@@ -172,14 +173,6 @@ SFG_Menu* fgCreateMenu( FGCBMenu menuCallback )
 }
 
 /*
- * Linked list of windows to destroy ... this is so we don't destroy a
- * window from the middle of its callback.  Some C compilers take an
- * extremely dim view of this.
- */
-
-static SFG_WindowList* WindowsToDestroy = ( SFG_WindowList* )NULL;
-
-/*
  * Function to add a window to the linked list of windows to destroy.
  * Subwindows are automatically added because they hang from the window
  * structure.
@@ -189,8 +182,7 @@ void fgAddToWindowDestroyList( SFG_Window* window )
     SFG_WindowList *new_list_entry =
         ( SFG_WindowList* )malloc( sizeof(SFG_WindowList ) );
     new_list_entry->window = window;
-    new_list_entry->next = WindowsToDestroy;
-    WindowsToDestroy = new_list_entry;
+    fgListAppend( &fgStructure.WindowsToDestroy, &new_list_entry->node );
 
     /*
      * Check if the window is the current one...
@@ -209,7 +201,7 @@ void fgAddToWindowDestroyList( SFG_Window* window )
     {
         void *destroy = FETCH_WCB( *window, Destroy );
         fgClearCallBacks( window );
-        FETCH_WCB( *window, Destroy ) = destroy;
+        SET_WCB( *window, Destroy, destroy );
     }
 }
 
@@ -218,22 +210,12 @@ void fgAddToWindowDestroyList( SFG_Window* window )
  */
 void fgCloseWindows( )
 {
-    SFG_WindowList *window_ptr = WindowsToDestroy;
-    WindowsToDestroy = ( SFG_WindowList* )NULL;
-    /* In case the destroy callbacks cause more windows to be closed */
-
-    while( window_ptr )
+    while( fgStructure.WindowsToDestroy.First )
     {
-        SFG_WindowList *next = window_ptr->next;
+        SFG_WindowList *window_ptr = fgStructure.WindowsToDestroy.First;
         fgDestroyWindow( window_ptr->window );
+        fgListRemove( &fgStructure.WindowsToDestroy, &window_ptr->node );
         free( window_ptr );
-        window_ptr = next;
-
-        if( !window_ptr )
-        {
-            window_ptr = WindowsToDestroy;
-            WindowsToDestroy = ( SFG_WindowList* )NULL;
-        }
     }
 }
 
@@ -244,19 +226,18 @@ void fgCloseWindows( )
  */
 void fgDestroyWindow( SFG_Window* window )
 {
-    SFG_Window* subWindow;
-    int menu_index ;
+    int menu_index;
 
     assert( window );
     freeglut_assert_ready;
 
-    while( subWindow = ( SFG_Window * )window->Children.First )
-        fgDestroyWindow( subWindow );
+    while( window->Children.First )
+        fgDestroyWindow( ( SFG_Window * )window->Children.First );
 
     {
-        SFG_Window *activeWindow = fgStructure.Window ;
+        SFG_Window *activeWindow = fgStructure.Window;
         INVOKE_WCB( *window, Destroy, ( ) );
-        fgSetWindow ( activeWindow );
+        fgSetWindow( activeWindow );
     }
 
     if( window->Parent )
@@ -267,11 +248,9 @@ void fgDestroyWindow( SFG_Window* window )
     if( window->ActiveMenu )
       fgDeactivateMenu( window );
 
-    for ( menu_index = 0; menu_index < 3; menu_index ++ )
-    {
-      if ( window->Menu[menu_index] )
-        window->Menu[menu_index]->ParentWindow = NULL ;
-    }
+    for( menu_index = 0; menu_index < 3; menu_index ++ )
+        if( window->Menu[ menu_index ] )
+            window->Menu[ menu_index ]->ParentWindow = NULL;
 
     fgClearCallBacks( window );
     fgCloseWindow( window );
@@ -404,6 +383,7 @@ void fgCreateStructure( void )
 
     fgListInit(&fgStructure.Windows);
     fgListInit(&fgStructure.Menus);
+    fgListInit(&fgStructure.WindowsToDestroy);
 }
 
 /*
@@ -413,19 +393,21 @@ void fgCreateStructure( void )
  */
 void fgDestroyStructure( void )
 {
-    SFG_Window *window;
-    SFG_Menu *menu;
-
     freeglut_assert_ready;
 
     /*
-     * Make sure all windows and menus have been deallocated
+     * Clean up the WindowsToDestroy list.
      */
-    while( menu = ( SFG_Menu * )fgStructure.Menus.First )
-        fgDestroyMenu( menu );
+    fgCloseWindows( );
 
-    while( window = ( SFG_Window * )fgStructure.Windows.First )
-        fgDestroyWindow( window );
+    /*
+     * Make sure all windows and menus have been deallocated
+     */
+    while( fgStructure.Menus.First )
+        fgDestroyMenu( ( SFG_Menu * )fgStructure.Menus.First );
+    
+    while( fgStructure.Windows.First )
+        fgDestroyWindow( ( SFG_Window * )fgStructure.Windows.First );
 }
 
 /*
@@ -528,13 +510,13 @@ static void fghcbWindowByID( SFG_Window *window, SFG_Enumerator *enumerator )
     /*
      * Make sure we do not overwrite our precious results...
      */
-    if ( enumerator->found )
+    if( enumerator->found )
         return;
 
     /*
      * Check the window's handle. Hope this works. Looks ugly. That's for sure.
      */
-    if( window->ID == (int) (enumerator->data) ) /* XXX int/ptr conversion! */
+    if( window->ID == *( int *)(enumerator->data) )
     {
         enumerator->found = GL_TRUE;
         enumerator->data = window;
@@ -561,10 +543,10 @@ SFG_Window* fgWindowByID( int windowID )
      * Uses a method very similiar for fgWindowByHandle...
      */
     enumerator.found = GL_FALSE;
-    enumerator.data = (void *) windowID; /* XXX int/pointer conversion! */
+    enumerator.data = ( void * )&windowID;
     fgEnumWindows( fghcbWindowByID, &enumerator );
     if( enumerator.found )
-        return( SFG_Window *) enumerator.data;
+        return ( SFG_Window * )enumerator.data;
     return NULL;
 }