X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_structure.c;h=e092429d77651e04ee327b0d15eb27a6a0a3543d;hb=846e7692343b1bd4473ded068f4b86056baedb77;hp=16100560e53843150f5e4ca4f07f948290b89895;hpb=d296a46a2dccdd99048541e1f8ca0ef010ac8545;p=freeglut diff --git a/src/freeglut_structure.c b/src/freeglut_structure.c index 1610056..e092429 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 ------------------------------------------------------- */ /* @@ -70,13 +65,16 @@ static void fghClearCallBacks( 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 positionUse, int x, int y, + GLboolean sizeUse, int w, int h, GLboolean gameMode, GLboolean isMenu ) { /* Have the window object created */ SFG_Window *window = (SFG_Window *)calloc( sizeof(SFG_Window), 1 ); - int fakeArgc = 0; +#if TARGET_HOST_UNIX_X11 + window->Window.FBConfig = NULL; +#endif fghClearCallBacks( window ); /* Initialize the object properties */ @@ -99,13 +97,14 @@ SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title, window->State.IgnoreKeyRepeat = GL_FALSE; window->State.KeyRepeating = GL_FALSE; + window->State.IsFullscreen = GL_FALSE; /* * 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 ? GL_TRUE : GL_FALSE ); + fgOpenWindow( window, title, positionUse, x, y, sizeUse, w, h, gameMode, + (GLboolean)(parent ? GL_TRUE : GL_FALSE) ); return window; } @@ -116,18 +115,18 @@ SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title, SFG_Menu* fgCreateMenu( FGCBMenu menuCallback ) { int x = 100, y = 100, w = 100, h = 100; - SFG_Window *current_window = fgStructure.Window; + SFG_Window *current_window = fgStructure.CurrentWindow; /* Have the menu object created */ SFG_Menu* menu = (SFG_Menu *)calloc( sizeof(SFG_Menu), 1 ); - int fakeArgc = 0; - menu->ParentWindow = fgStructure.Window; + menu->ParentWindow = NULL; /* Create a window for the menu to reside in. */ - fgCreateWindow( NULL, "freeglut menu", x, y, w, h, GL_FALSE, GL_TRUE ); - menu->Window = fgStructure.Window; + fgCreateWindow( NULL, "freeglut menu", GL_TRUE, x, y, GL_TRUE, w, h, + GL_FALSE, GL_TRUE ); + menu->Window = fgStructure.CurrentWindow; glutDisplayFunc( fgDisplayMenu ); glutHideWindow( ); /* Hide the window for now */ @@ -142,7 +141,7 @@ SFG_Menu* fgCreateMenu( FGCBMenu menuCallback ) fgListAppend( &fgStructure.Menus, &menu->Node ); /* Newly created menus implicitly become current ones */ - fgStructure.Menu = menu; + fgStructure.CurrentMenu = menu; return menu; } @@ -160,8 +159,8 @@ void fgAddToWindowDestroyList( SFG_Window* window ) fgListAppend( &fgStructure.WindowsToDestroy, &new_list_entry->node ); /* Check if the window is the current one... */ - if( fgStructure.Window == window ) - fgStructure.Window = NULL; + if( fgStructure.CurrentWindow == window ) + fgStructure.CurrentWindow = NULL; /* * Clear all window callbacks except Destroy, which will @@ -172,7 +171,7 @@ void fgAddToWindowDestroyList( SFG_Window* window ) * to ensure that they are no longer called after this point. */ { - FGCBDestroy destroy = FETCH_WCB( *window, Destroy ); + FGCBDestroy destroy = (FGCBDestroy)FETCH_WCB( *window, Destroy ); fghClearCallBacks( window ); SET_WCB( *window, Destroy, destroy ); } @@ -199,8 +198,6 @@ void fgCloseWindows( ) */ void fgDestroyWindow( SFG_Window* window ) { - int menu_index; - FREEGLUT_INTERNAL_ERROR_EXIT ( window, "Window destroy function called with null window", "fgDestroyWindow" ); @@ -208,7 +205,7 @@ void fgDestroyWindow( SFG_Window* window ) fgDestroyWindow( ( SFG_Window * )window->Children.First ); { - SFG_Window *activeWindow = fgStructure.Window; + SFG_Window *activeWindow = fgStructure.CurrentWindow; INVOKE_WCB( *window, Destroy, ( ) ); fgSetWindow( activeWindow ); } @@ -221,15 +218,11 @@ 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; - fghClearCallBacks( window ); fgCloseWindow( window ); free( window ); - if( fgStructure.Window == window ) - fgStructure.Window = NULL; + if( fgStructure.CurrentWindow == window ) + fgStructure.CurrentWindow = NULL; } /* @@ -241,11 +234,15 @@ 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): */ - for( i = 0; i < 3; i++ ) + for( i = 0; i < FREEGLUT_MAX_MENUS; i++ ) if( window->Menu[ i ] == menu ) window->Menu[ i ] = NULL; @@ -301,10 +298,10 @@ void fgDestroyMenu( SFG_Menu* menu ) */ if( menu->Destroy ) { - SFG_Menu *activeMenu=fgStructure.Menu; - fgStructure.Menu = menu; + SFG_Menu *activeMenu=fgStructure.CurrentMenu; + fgStructure.CurrentMenu = menu; menu->Destroy( ); - fgStructure.Menu = activeMenu; + fgStructure.CurrentMenu = activeMenu; } /* @@ -324,12 +321,12 @@ void fgDestroyMenu( SFG_Menu* menu ) free( entry ); } - if( fgStructure.Window == menu->Window ) - fgSetWindow( menu->ParentWindow ); + if( fgStructure.CurrentWindow == menu->Window ) + fgSetWindow( NULL ); fgDestroyWindow( menu->Window ); fgListRemove( &fgStructure.Menus, &menu->Node ); - if( fgStructure.Menu == menu ) - fgStructure.Menu = NULL; + if( fgStructure.CurrentMenu == menu ) + fgStructure.CurrentMenu = NULL; free( menu ); } @@ -351,6 +348,13 @@ void fgCreateStructure( void ) fgListInit(&fgStructure.Windows); fgListInit(&fgStructure.Menus); fgListInit(&fgStructure.WindowsToDestroy); + + fgStructure.CurrentWindow = NULL; + fgStructure.CurrentMenu = NULL; + fgStructure.MenuContext = NULL; + fgStructure.GameModeWindow = NULL; + fgStructure.WindowID = 0; + fgStructure.MenuID = 0; } /*