X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_structure.c;h=482740e2605c1777bab1a263d1707451eab65ff1;hb=4634982c39857ee13ad0c5fa67b3ad197a37daf1;hp=965683683c8030297850e41a9527387b0aed3f98;hpb=4fa63bbb5637f30db8eec9de49c0b2c4830cb866;p=freeglut diff --git a/src/freeglut_structure.c b/src/freeglut_structure.c index 9656836..482740e 100644 --- a/src/freeglut_structure.c +++ b/src/freeglut_structure.c @@ -25,14 +25,9 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - #include #include "freeglut_internal.h" - /* -- GLOBAL EXPORTS ------------------------------------------------------- */ /* @@ -53,7 +48,7 @@ SFG_Structure fgStructure = { { NULL, NULL }, /* The list of windows */ /* -- PRIVATE FUNCTIONS ---------------------------------------------------- */ -void fgClearCallBacks( SFG_Window *window ) +static void fghClearCallBacks( SFG_Window *window ) { if( window ) { @@ -75,16 +70,8 @@ SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title, { /* Have the window object created */ 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... - */ - if( !fgState.Initialised ) - glutInit( &fakeArgc, NULL ); + fghClearCallBacks( window ); /* Initialize the object properties */ window->ID = ++fgStructure.WindowID; @@ -112,7 +99,7 @@ SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title, * dependant, and resides in freeglut_window.c. Uses fgState. */ fgOpenWindow( window, title, x, y, w, h, gameMode, - parent ? GL_TRUE : GL_FALSE ); + (GLboolean)(parent ? GL_TRUE : GL_FALSE) ); return window; } @@ -127,16 +114,8 @@ SFG_Menu* fgCreateMenu( FGCBMenu menuCallback ) /* Have the menu object created */ SFG_Menu* menu = (SFG_Menu *)calloc( sizeof(SFG_Menu), 1 ); - int fakeArgc = 0; - /* - * If the freeglut internals haven't been initialized yet, - * do it now. Hack's idea courtesy of Chris Purnell... - */ - if( !fgState.Initialised ) - glutInit( &fakeArgc, NULL ); - - menu->ParentWindow = fgStructure.Window; + menu->ParentWindow = NULL; /* Create a window for the menu to reside in. */ @@ -187,7 +166,7 @@ void fgAddToWindowDestroyList( SFG_Window* window ) */ { FGCBDestroy destroy = FETCH_WCB( *window, Destroy ); - fgClearCallBacks( window ); + fghClearCallBacks( window ); SET_WCB( *window, Destroy, destroy ); } } @@ -213,10 +192,8 @@ void fgCloseWindows( ) */ void fgDestroyWindow( SFG_Window* window ) { - int menu_index; - - assert( window ); - freeglut_assert_ready; + FREEGLUT_INTERNAL_ERROR_EXIT ( window, "Window destroy function called with null window", + "fgDestroyWindow" ); while( window->Children.First ) fgDestroyWindow( ( SFG_Window * )window->Children.First ); @@ -235,11 +212,7 @@ 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; - - fgClearCallBacks( window ); + fghClearCallBacks( window ); fgCloseWindow( window ); free( window ); if( fgStructure.Window == window ) @@ -255,6 +228,10 @@ static void fghRemoveMenuFromWindow( SFG_Window* window, SFG_Menu* menu ) SFG_Window *subWindow; int i; + /* Check whether this is the active menu in the window */ + if ( menu == window->ActiveMenu ) + window->ActiveMenu = NULL ; + /* * Check if the menu is attached to the current window, * if so, have it detached (by overwriting with a NULL): @@ -294,8 +271,8 @@ void fgDestroyMenu( SFG_Menu* menu ) SFG_Window *window; SFG_Menu *from; - assert( menu ); - freeglut_assert_ready; + FREEGLUT_INTERNAL_ERROR_EXIT ( menu, "Menu destroy function called with null menu", + "fgDestroyMenu" ); /* First of all, have all references to this menu removed from all windows: */ for( window = (SFG_Window *)fgStructure.Windows.First; @@ -339,7 +316,7 @@ void fgDestroyMenu( SFG_Menu* menu ) } if( fgStructure.Window == menu->Window ) - fgSetWindow( menu->ParentWindow ); + fgSetWindow( NULL ); fgDestroyWindow( menu->Window ); fgListRemove( &fgStructure.Menus, &menu->Node ); if( fgStructure.Menu == menu ) @@ -374,8 +351,6 @@ void fgCreateStructure( void ) */ void fgDestroyStructure( void ) { - freeglut_assert_ready; - /* Clean up the WindowsToDestroy list. */ fgCloseWindows( ); @@ -394,8 +369,9 @@ void fgEnumWindows( FGCBenumerator enumCallback, SFG_Enumerator* enumerator ) { SFG_Window *window; - assert( enumCallback && enumerator ); - freeglut_assert_ready; + FREEGLUT_INTERNAL_ERROR_EXIT ( enumCallback && enumerator, + "Enumerator or callback missing from window enumerator call", + "fgEnumWindows" ); /* Check every of the top-level windows */ for( window = ( SFG_Window * )fgStructure.Windows.First; @@ -417,8 +393,10 @@ void fgEnumSubWindows( SFG_Window* window, FGCBenumerator enumCallback, { SFG_Window *child; - assert( enumCallback && enumerator ); - freeglut_assert_ready; + FREEGLUT_INTERNAL_ERROR_EXIT ( enumCallback && enumerator, + "Enumerator or callback missing from subwindow enumerator call", + "fgEnumSubWindows" ); + FREEGLUT_INTERNAL_ERROR_EXIT_IF_NOT_INITIALISED ( "Window Enumeration" ); for( child = ( SFG_Window * )window->Children.First; child; @@ -519,8 +497,6 @@ SFG_Menu* fgMenuByID( int menuID ) { SFG_Menu *menu = NULL; - freeglut_assert_ready; - /* It's enough to check all entries in fgStructure.Menus... */ for( menu = (SFG_Menu *)fgStructure.Menus.First; menu;