X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_structure.c;h=583f74493b6f7d273206846d167bbb2b86224e8e;hb=e914664550e34587f4b10d3fe52c61fbe6d61771;hp=949747ba0da11bfcea01b08b578bf64292b098ee;hpb=594e633aada7577825541f70447451e0007f80f9;p=freeglut diff --git a/src/freeglut_structure.c b/src/freeglut_structure.c index 949747b..583f744 100644 --- a/src/freeglut_structure.c +++ b/src/freeglut_structure.c @@ -69,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 @@ -83,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.Initialised ) glutInit( &fakeArgc, NULL ); /* @@ -92,7 +93,7 @@ SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title, window->ID = ++fgStructure.WindowID; fgListInit( &window->Children ); - if( parent != NULL ) + if( parent ) { fgListAppend( &parent->Children, &window->Node ); window->Parent = parent; @@ -104,16 +105,15 @@ SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title, * Set the default mouse cursor and reset the modifiers value */ 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; } @@ -136,28 +136,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.Initialised ) 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 ); @@ -192,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; @@ -220,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; } /* @@ -263,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; @@ -280,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 ; @@ -289,18 +250,12 @@ 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, ( ) ); - fgSetWindow ( activeWindow ) ; + fgSetWindow ( activeWindow ); } if( window->Parent ) @@ -313,13 +268,12 @@ void fgDestroyWindow( SFG_Window* window, GLboolean needToClose ) for ( menu_index = 0; menu_index < 3; menu_index ++ ) { - if ( window->Menu[menu_index] != NULL ) + if ( window->Menu[menu_index] ) window->Menu[menu_index]->ParentWindow = NULL ; } fgClearCallBacks( window ); - if( needToClose == TRUE ) - fgCloseWindow( window ); + fgCloseWindow( window ); free( window ); if( fgStructure.Window == window ) fgStructure.Window = NULL; @@ -425,7 +379,7 @@ void fgDestroyMenu( SFG_Menu* menu ) if( fgStructure.Window == menu->Window ) fgSetWindow( menu->ParentWindow ); - fgDestroyWindow( menu->Window, TRUE ); + fgDestroyWindow( menu->Window ); fgListRemove( &fgStructure.Menus, &menu->Node ); if( fgStructure.Menu == menu ) fgStructure.Menu = NULL; @@ -470,7 +424,7 @@ void fgDestroyStructure( void ) fgDestroyMenu( menu ); while( window = ( SFG_Window * )fgStructure.Windows.First ) - fgDestroyWindow( window, TRUE ); + fgDestroyWindow( window ); } /* @@ -491,7 +445,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; } } @@ -513,7 +467,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; } } @@ -524,20 +478,15 @@ void fgEnumSubWindows( SFG_Window* window, FGCBenumerator enumCallback, static void fghcbWindowByHandle( SFG_Window *window, SFG_Enumerator *enumerator ) { - freeglut_return_if_fail( enumerator->found == FALSE ); - -#if TARGET_HOST_UNIX_X11 - #define WBHANDLE (Window) -#elif TARGET_HOST_WIN32 - #define WBHANDLE (HWND) -#endif + if ( enumerator->found ) + return; /* * Check the window's handle. Hope this works. Looks ugly. That's for sure. */ - if( window->Window.Handle == WBHANDLE (enumerator->data) ) + if( window->Window.Handle == (SFG_WindowHandleType) (enumerator->data) ) { - enumerator->found = TRUE; + enumerator->found = GL_TRUE; enumerator->data = window; return; @@ -547,8 +496,6 @@ static void fghcbWindowByHandle( SFG_Window *window, * Otherwise, check this window's children */ fgEnumSubWindows( window, fghcbWindowByHandle, enumerator ); - -#undef WBHANDLE } /* @@ -556,23 +503,18 @@ static void fghcbWindowByHandle( SFG_Window *window, * first window in the queue matching the specified window handle. * The function is defined in freeglut_structure.c file. */ -SFG_Window* fgWindowByHandle -#if TARGET_HOST_UNIX_X11 -( Window hWindow ) -#elif TARGET_HOST_WIN32 -( HWND hWindow ) -#endif +SFG_Window* fgWindowByHandle ( SFG_WindowHandleType hWindow ) { SFG_Enumerator enumerator; /* * 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; } @@ -585,14 +527,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; @@ -616,10 +559,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; } @@ -658,7 +601,7 @@ void fgListAppend(SFG_List *list, SFG_Node *node) { SFG_Node *ln; - if ( (ln = (SFG_Node *)list->Last) != NULL ) + if ( ln = (SFG_Node *)list->Last ) { ln->Next = node; node->Prev = ln; @@ -681,9 +624,9 @@ void fgListRemove(SFG_List *list, SFG_Node *node) ln->Prev = node->Prev; if( ln = (SFG_Node *)node->Prev ) ln->Next = node->Next; - if( ( ln = (SFG_Node *)list->First ) == node ) + if( (ln = (SFG_Node *)list->First) == node ) list->First = node->Next; - if( ( ln = (SFG_Node *)list->Last ) == node ) + if( (ln = (SFG_Node *)list->Last) == node ) list->Last = node->Prev; } @@ -700,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 ***/