X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;ds=inline;f=src%2Ffreeglut_structure.c;h=e11cdf74392a95c9d85377b8b9d9026d104cfc1b;hb=bc762393b1c3421d1f508c03111643e27a1cc8f9;hp=bc88a50376493421466cfa883b5230573df5ed81;hpb=5d724da03c1b5988304888c17c5eba8a40c0a529;p=freeglut diff --git a/src/freeglut_structure.c b/src/freeglut_structure.c index bc88a50..e11cdf7 100644 --- a/src/freeglut_structure.c +++ b/src/freeglut_structure.c @@ -52,6 +52,13 @@ SFG_Structure fgStructure = { { NULL, NULL }, /* The list of windows */ /* -- PRIVATE FUNCTIONS ---------------------------------------------------- */ +void fgClearCallBacks( SFG_Window *window ) +{ + int i; + for( i = 0; i < TOTAL_CALLBACKS; ++i ) + window->CallBacks[ i ] = NULL; +} + /* * This private function creates, opens and adds to the hierarchy * a freeglut window complete with OpenGL context and stuff... @@ -67,6 +74,8 @@ SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title, SFG_Window *window = (SFG_Window *)calloc( sizeof(SFG_Window), 1 ); int fakeArgc = 0; + fgClearCallBacks( window ); + /* * If the freeglut internals haven't been initialized yet, * do it now. Hack's idea courtesy of Chris Purnell... @@ -266,11 +275,14 @@ void fgDestroyWindow( SFG_Window* window, GLboolean needToClose ) while ( (subWindow = (SFG_Window *)window->Children.First) != NULL ) fgDestroyWindow( subWindow, needToClose ); + /* + * 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 ; - /* fgSetWindow ( window ) ; */ - /* window->Callbacks.Destroy () ; */ INVOKE_WCB( *window, Destroy, ( ) ); fgSetWindow ( activeWindow ) ; } @@ -294,6 +306,7 @@ void fgDestroyWindow( SFG_Window* window, GLboolean needToClose ) free( window ); if ( fgStructure.Window == window ) fgStructure.Window = NULL ; + fgClearCallBacks( window ); } /*