X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_structure.c;h=583f74493b6f7d273206846d167bbb2b86224e8e;hb=935d65c3d5a7c332d7dcba970b9f432a622f316c;hp=3a7be97c8683f63075f629447aa3c903ad5ba244;hpb=a5e39e2546cb979ef5a224a808229f27963537c7;p=freeglut diff --git a/src/freeglut_structure.c b/src/freeglut_structure.c index 3a7be97..583f744 100644 --- a/src/freeglut_structure.c +++ b/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,35 +210,6 @@ void fgAddToWindowDestroyList( SFG_Window* window, GLboolean needToClose ) fgClearCallBacks( window ); FETCH_WCB( *window, Destroy ) = destroy; } - - - /* - * If the destroyed window has the highest window ID number, decrement - * the window ID number. - * - * XXX Do we REALLY want to *ever* recycle window IDs? Integers are - * XXX plentiful, and clients may rely upon the implied promise in - * XXX the GLUT docs to not recycle these. (I can't remember if it - * XXX is explicit.) - * - * XXX If we *do* want to do this, we should actually recompute the - * XXX highest window-ID; the new highest may not in fact be one less - * XXX than what we have just deleted. - */ - 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. - */ - 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; } /* @@ -254,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; @@ -271,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 ; @@ -280,14 +250,8 @@ void fgDestroyWindow( SFG_Window* window, GLboolean needToClose ) freeglut_assert_ready; while( subWindow = ( SFG_Window * )window->Children.First ) - fgDestroyWindow( subWindow, needToClose ); + fgDestroyWindow( subWindow ); - /* - * XXX Since INVOKE_WCB() tests the function pointer, why not make - * XXX this unconditional? Overhead is close to nil, and it would - * XXX clarify the code by omitting a conditional test. - */ - if( FETCH_WCB( *window, Destroy ) ) { SFG_Window *activeWindow = fgStructure.Window ; INVOKE_WCB( *window, Destroy, ( ) ); @@ -309,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; @@ -416,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; @@ -461,7 +424,7 @@ void fgDestroyStructure( void ) fgDestroyMenu( menu ); while( window = ( SFG_Window * )fgStructure.Windows.First ) - fgDestroyWindow( window, GL_TRUE ); + fgDestroyWindow( window ); } /* @@ -680,4 +643,26 @@ int fgListLength(SFG_List *list) return length; } + +void fgListInsert(SFG_List *list, SFG_Node *next, SFG_Node *node) +{ + SFG_Node *prev; + + if( (node->Next = next) ) + { + prev = next->Prev; + next->Prev = node; + } + else + { + prev = list->Last; + list->Last = node; + } + + if( (node->Prev = prev) ) + prev->Next = node; + else + list->First = node; +} + /*** END OF FILE ***/