X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_structure.c;h=3e55bfde85d316daf3faa6f7fb586e09b7396ba1;hb=113c06a96687cf466979972f5780c3ddd4d5dee5;hp=21b6cfb976637df472a657982fdd8fc5cd5b8b40;hpb=9092fad9f750e8bab3ce7d7fc5a30f2b036a1cfb;p=freeglut diff --git a/src/freeglut_structure.c b/src/freeglut_structure.c index 21b6cfb..3e55bfd 100644 --- a/src/freeglut_structure.c +++ b/src/freeglut_structure.c @@ -54,9 +54,12 @@ SFG_Structure fgStructure = { { NULL, NULL }, /* The list of windows */ void fgClearCallBacks( SFG_Window *window ) { - int i; - for( i = 0; i < TOTAL_CALLBACKS; ++i ) - window->CallBacks[ i ] = NULL; + if( window ) + { + int i; + for( i = 0; i < TOTAL_CALLBACKS; ++i ) + window->CallBacks[ i ] = NULL; + } } /* @@ -66,7 +69,8 @@ void fgClearCallBacks( SFG_Window *window ) * If parent is set to NULL, the window created will be a topmost one. */ SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title, - int x, int y, int w, int h, GLboolean gameMode ) + int x, int y, int w, int h, + GLboolean gameMode, GLboolean isMenu ) { /* * Have the window object created @@ -80,7 +84,7 @@ SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title, * If the freeglut internals haven't been initialized yet, * do it now. Hack's idea courtesy of Chris Purnell... */ - if( !fgState.Time.Set ) + if( !fgState.Initalized ) glutInit( &fakeArgc, NULL ); /* @@ -103,14 +107,14 @@ SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title, window->State.Cursor = GLUT_CURSOR_INHERIT; window->State.Modifiers = 0xffffffff; - window->IsMenu = fgState.BuildingAMenu ; + window->IsMenu = isMenu; /* * Open the window now. The fgOpenWindow() function is system * dependant, and resides in freeglut_window.c. Uses fgState. */ fgOpenWindow( window, title, x, y, w, h, gameMode, - (parent != NULL) ? TRUE : FALSE ); + parent ? GL_TRUE : GL_FALSE ); return window; } @@ -133,28 +137,19 @@ SFG_Menu* fgCreateMenu( FGCBMenu menuCallback ) * If the freeglut internals haven't been initialized yet, * do it now. Hack's idea courtesy of Chris Purnell... */ - if( !fgState.Time.Set ) + if( !fgState.Initalized ) glutInit( &fakeArgc, NULL ); menu->ParentWindow = fgStructure.Window; /* - * Create a window for the menu to reside in. Set the - * global variable BuildingAMenu to true so we can ensure - * it is created without decorations. + * Create a window for the menu to reside in. */ - fgState.BuildingAMenu = TRUE; - fgCreateWindow( NULL, NULL, x, y, w, h, FALSE ); + fgCreateWindow( NULL, NULL, x, y, w, h, GL_FALSE, GL_TRUE ); menu->Window = fgStructure.Window; glutDisplayFunc( fgDisplayMenu ); - /* - * While BuildingAMenu is true, all windows built have no decorations. - * That's not a good default behavior, so let's set it false again. - */ - fgState.BuildingAMenu = FALSE; - glutHideWindow( ); /* Hide the window for now */ fgSetWindow( current_window ); @@ -314,12 +309,12 @@ void fgDestroyWindow( SFG_Window* window, GLboolean needToClose ) window->Menu[menu_index]->ParentWindow = NULL ; } - if( needToClose == TRUE ) + fgClearCallBacks( window ); + if( needToClose ) fgCloseWindow( window ); free( window ); if( fgStructure.Window == window ) fgStructure.Window = NULL; - fgClearCallBacks( window ); } /* @@ -422,7 +417,7 @@ void fgDestroyMenu( SFG_Menu* menu ) if( fgStructure.Window == menu->Window ) fgSetWindow( menu->ParentWindow ); - fgDestroyWindow( menu->Window, TRUE ); + fgDestroyWindow( menu->Window, GL_TRUE ); fgListRemove( &fgStructure.Menus, &menu->Node ); if( fgStructure.Menu == menu ) fgStructure.Menu = NULL; @@ -467,7 +462,7 @@ void fgDestroyStructure( void ) fgDestroyMenu( menu ); while( window = ( SFG_Window * )fgStructure.Windows.First ) - fgDestroyWindow( window, TRUE ); + fgDestroyWindow( window, GL_TRUE ); } /* @@ -488,7 +483,7 @@ void fgEnumWindows( FGCBenumerator enumCallback, SFG_Enumerator* enumerator ) window = ( SFG_Window * )window->Node.Next ) { enumCallback( window, enumerator ); - if( enumerator->found == TRUE ) + if( enumerator->found ) return; } } @@ -510,7 +505,7 @@ void fgEnumSubWindows( SFG_Window* window, FGCBenumerator enumCallback, child = ( SFG_Window * )child->Node.Next ) { enumCallback( child, enumerator ); - if( enumerator->found == TRUE ) + if( enumerator->found ) return; } } @@ -521,7 +516,8 @@ void fgEnumSubWindows( SFG_Window* window, FGCBenumerator enumCallback, static void fghcbWindowByHandle( SFG_Window *window, SFG_Enumerator *enumerator ) { - freeglut_return_if_fail( enumerator->found == FALSE ); + if ( enumerator->found ) + return; #if TARGET_HOST_UNIX_X11 #define WBHANDLE (Window) @@ -534,7 +530,7 @@ static void fghcbWindowByHandle( SFG_Window *window, */ if( window->Window.Handle == WBHANDLE (enumerator->data) ) { - enumerator->found = TRUE; + enumerator->found = GL_TRUE; enumerator->data = window; return; @@ -565,11 +561,11 @@ SFG_Window* fgWindowByHandle /* * This is easy and makes use of the windows enumeration defined above */ - enumerator.found = FALSE; + enumerator.found = GL_FALSE; enumerator.data = (void *)hWindow; fgEnumWindows( fghcbWindowByHandle, &enumerator ); - if( enumerator.found == TRUE ) + if( enumerator.found ) return( SFG_Window *) enumerator.data; return NULL; } @@ -582,14 +578,15 @@ static void fghcbWindowByID( SFG_Window *window, SFG_Enumerator *enumerator ) /* * Make sure we do not overwrite our precious results... */ - freeglut_return_if_fail( enumerator->found == FALSE ); + 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! */ { - enumerator->found = TRUE; + enumerator->found = GL_TRUE; enumerator->data = window; return; @@ -613,10 +610,10 @@ SFG_Window* fgWindowByID( int windowID ) /* * Uses a method very similiar for fgWindowByHandle... */ - enumerator.found = FALSE; + enumerator.found = GL_FALSE; enumerator.data = (void *) windowID; /* XXX int/pointer conversion! */ fgEnumWindows( fghcbWindowByID, &enumerator ); - if( enumerator.found == TRUE ) + if( enumerator.found ) return( SFG_Window *) enumerator.data; return NULL; }