X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffg_structure.c;h=747a8b5ec34943caba19fe2e38eaa1cd50dcff96;hb=b1ed93dd348f7b8f3bd2c75474f5d4151d502f1f;hp=be9d1ce5e9975f5a037394b67b3eb73fa013d14b;hpb=bac05204a224d9cabe6b7d52c00d2e0601825cb4;p=freeglut diff --git a/src/fg_structure.c b/src/fg_structure.c index be9d1ce..747a8b5 100644 --- a/src/fg_structure.c +++ b/src/fg_structure.c @@ -1,5 +1,5 @@ /* - * freeglut_structure.c + * fg_structure.c * * Windows and menus need tree structure * @@ -49,7 +49,7 @@ SFG_Structure fgStructure = { { NULL, NULL }, /* The list of windows */ /* -- PRIVATE FUNCTIONS ---------------------------------------------------- */ extern void fgPlatformCreateWindow ( SFG_Window *window ); -extern void fghDefaultReshape(int width, int height); +extern void fghDefaultReshape(int width, int height, FGCBUserData userData); static void fghClearCallBacks( SFG_Window *window ) { @@ -57,7 +57,10 @@ static void fghClearCallBacks( SFG_Window *window ) { int i; for( i = 0; i < TOTAL_CALLBACKS; ++i ) + { window->CallBacks[ i ] = NULL; + window->CallbackDatas[ i ] = NULL; + } } } @@ -75,10 +78,15 @@ SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title, /* Have the window object created */ SFG_Window *window = (SFG_Window *)calloc( 1, sizeof(SFG_Window) ); - fgPlatformCreateWindow ( window ); + if( !window ) + { + fgError( "Out of memory. Could not create window." ); + } + + fgPlatformCreateWindow ( window ); fghClearCallBacks( window ); - SET_WCB( *window, Reshape, fghDefaultReshape); + SET_WCB( *window, Reshape, fghDefaultReshape, NULL); /* Initialize the object properties */ window->ID = ++fgStructure.WindowID; @@ -100,7 +108,7 @@ SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title, /* * Open the window now. The fgOpenWindow() function is system - * dependant, and resides in freeglut_window.c. Uses fgState. + * dependent, and resides in fg_window.c. Uses fgState. */ fgOpenWindow( window, title, positionUse, x, y, sizeUse, w, h, gameMode, (GLboolean)(parent ? GL_TRUE : GL_FALSE) ); @@ -111,9 +119,8 @@ SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title, /* * This private function creates a menu and adds it to the menus list */ -SFG_Menu* fgCreateMenu( FGCBMenu menuCallback ) +SFG_Menu* fgCreateMenu( FGCBMenuUC menuCallback, FGCBUserData userData ) { - int x = 100, y = 100, w = 1, h = 1; SFG_Window *current_window = fgStructure.CurrentWindow; /* Have the menu object created */ @@ -122,19 +129,19 @@ SFG_Menu* fgCreateMenu( FGCBMenu menuCallback ) menu->ParentWindow = NULL; /* Create a window for the menu to reside in. */ - - fgCreateWindow( NULL, "freeglut menu", GL_TRUE, x, y, GL_TRUE, w, h, + fgCreateWindow( NULL, "freeglut menu", GL_FALSE, 0, 0, GL_FALSE, 0, 0, GL_FALSE, GL_TRUE ); menu->Window = fgStructure.CurrentWindow; glutDisplayFunc( fgDisplayMenu ); - glutHideWindow( ); /* Hide the window for now */ fgSetWindow( current_window ); /* Initialize the object properties: */ - menu->ID = ++fgStructure.MenuID; - menu->Callback = menuCallback; - menu->ActiveEntry = NULL; + menu->ID = ++fgStructure.MenuID; + menu->Callback = menuCallback; + menu->CallbackData = userData; + menu->ActiveEntry = NULL; + menu->Font = fgState.MenuFont; fgListInit( &menu->Entries ); fgListAppend( &fgStructure.Menus, &menu->Node ); @@ -170,10 +177,16 @@ void fgAddToWindowDestroyList( SFG_Window* window ) * to ensure that they are no longer called after this point. */ { - FGCBDestroy destroy = (FGCBDestroy)FETCH_WCB( *window, Destroy ); + FGCBDestroyUC destroy = (FGCBDestroyUC)FETCH_WCB( *window, Destroy ); + FGCBUserData destroyData = FETCH_USER_DATA_WCB( *window, Destroy ); fghClearCallBacks( window ); - SET_WCB( *window, Destroy, destroy ); + SET_WCB( *window, Destroy, destroy, destroyData ); } + + /* + * Similarly, clear all work set for the window, none of this has to be executed anymore + */ + window->State.WorkMask = 0; } /* @@ -192,7 +205,7 @@ void fgCloseWindows( ) /* * This function destroys a window and all of its subwindows. Actually, - * another function, defined in freeglut_window.c is called, but this is + * another function, defined in fg_window.c is called, but this is * a whole different story... */ void fgDestroyWindow( SFG_Window* window ) @@ -299,7 +312,7 @@ void fgDestroyMenu( SFG_Menu* menu ) { SFG_Menu *activeMenu=fgStructure.CurrentMenu; fgStructure.CurrentMenu = menu; - menu->Destroy( ); + menu->Destroy( menu->DestroyData ); fgStructure.CurrentMenu = activeMenu; } @@ -334,7 +347,7 @@ void fgDestroyMenu( SFG_Menu* menu ) * This function should be called on glutInit(). It will prepare the internal * structure of freeglut to be used in the application. The structure will be * destroyed using fgDestroyStructure() on glutMainLoop() return. In that - * case further use of freeglut should be preceeded with a glutInit() call. + * case further use of freeglut should be preceded with a glutInit() call. */ void fgCreateStructure( void ) { @@ -467,7 +480,7 @@ static void fghcbWindowByHandle( SFG_Window *window, /* * fgWindowByHandle returns a (SFG_Window *) value pointing to the * first window in the queue matching the specified window handle. - * The function is defined in freeglut_structure.c file. + * The function is defined in fg_structure.c file. */ SFG_Window* fgWindowByHandle ( SFG_WindowHandleType hWindow ) { @@ -508,7 +521,7 @@ static void fghcbWindowByID( SFG_Window *window, SFG_Enumerator *enumerator ) /* * This function is similar to the previous one, except it is * looking for a specified (sub)window identifier. The function - * is defined in freeglut_structure.c file. + * is defined in fg_structure.c file. */ SFG_Window* fgWindowByID( int windowID ) { @@ -533,7 +546,7 @@ static void fghcbMenuByID( SFG_Menu *menu, return; /* Check the menu's ID. */ - if( menu->ID == (int)(enumerator->data) ) + if( menu->ID == *( int *)(enumerator->data) ) { enumerator->found = GL_TRUE; enumerator->data = menu; @@ -552,7 +565,7 @@ SFG_Menu* fgMenuByID( int menuID ) /* This is easy and makes use of the menus enumeration defined above */ enumerator.found = GL_FALSE; - enumerator.data = (void *)menuID; + enumerator.data = (void *)&menuID; fgEnumMenus( fghcbMenuByID, &enumerator ); if( enumerator.found ) @@ -570,7 +583,7 @@ static void fghcbGetActiveMenu( SFG_Menu *menu, if ( enumerator->found ) return; - /* Check the menu's ID. */ + /* Check the menu's is active */ if( menu->IsActive ) { enumerator->found = GL_TRUE; @@ -582,6 +595,7 @@ static void fghcbGetActiveMenu( SFG_Menu *menu, /* * Returns active menu, if any. Assumption: only one menu active throughout application at any one time. + * This is false when a submenu is also open. * This is easier than fgWindowByXXX as all menus are placed in one doubly linked list... */ SFG_Menu* fgGetActiveMenu( )