X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffg_structure.c;h=f0bc9a2a840abd69d78dbbaf15aabe3b832df5c8;hb=ba0b3e4f7c57925fea4b418356a283a3d8135f2d;hp=88b26149d46f47027d93286b7acad2949aff899a;hpb=f0ba4e97608a444ae0a94e2408ed1a647ee38672;p=freeglut diff --git a/src/fg_structure.c b/src/fg_structure.c index 88b2614..f0bc9a2 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,6 +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); static void fghClearCallBacks( SFG_Window *window ) { @@ -72,11 +73,17 @@ SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title, GLboolean gameMode, GLboolean isMenu ) { /* Have the window object created */ - SFG_Window *window = (SFG_Window *)calloc( sizeof(SFG_Window), 1 ); + SFG_Window *window = (SFG_Window *)calloc( 1, sizeof(SFG_Window) ); + + if( !window ) + { + fgError( "Out of memory. Could not create window." ); + } fgPlatformCreateWindow ( window ); fghClearCallBacks( window ); + SET_WCB( *window, Reshape, fghDefaultReshape); /* Initialize the object properties */ window->ID = ++fgStructure.WindowID; @@ -90,22 +97,15 @@ SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title, else fgListAppend( &fgStructure.Windows, &window->Node ); - /* Set the default mouse cursor and reset the modifiers value */ + /* Set the default mouse cursor */ window->State.Cursor = GLUT_CURSOR_INHERIT; - - window->State.IgnoreKeyRepeat = GL_FALSE; - window->State.KeyRepeating = GL_FALSE; - window->State.IsFullscreen = GL_FALSE; - window->State.VisualizeNormals= GL_FALSE; - window->State.pWState.WindowTitle = NULL; - window->State.pWState.IconTitle = NULL; - - window->IsMenu = isMenu; + /* Mark window as menu if a menu is to be created */ + window->IsMenu = isMenu; /* * 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) ); @@ -118,7 +118,6 @@ SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title, */ SFG_Menu* fgCreateMenu( FGCBMenu menuCallback ) { - int x = 100, y = 100, w = 1, h = 1; SFG_Window *current_window = fgStructure.CurrentWindow; /* Have the menu object created */ @@ -127,19 +126,18 @@ 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->Font = fgState.MenuFont; fgListInit( &menu->Entries ); fgListAppend( &fgStructure.Menus, &menu->Node ); @@ -197,7 +195,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 ) @@ -339,7 +337,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 ) { @@ -472,7 +470,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 ) { @@ -513,7 +511,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 ) { @@ -538,7 +536,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; @@ -557,7 +555,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 ) @@ -575,7 +573,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; @@ -587,6 +585,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( )