Putting in Jocelyn Frechot's X11 visual context changes. THIS WILL BREAK THE BUILD...
[freeglut] / src / freeglut_structure.c
index 1610056..1d064b6 100644 (file)
  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
 #include <GL/freeglut.h>
 #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 */
@@ -104,8 +102,8 @@ 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.
      */
-    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 +114,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 +140,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 +158,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 +170,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 +197,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 +204,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 +217,17 @@ 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 );
+#if TARGET_HOST_UNIX_X11
+    if (window->Window.FBConfig != NULL)
+    {
+        XFree( window->Window.FBConfig );
+    }
+#endif
     free( window );
-    if( fgStructure.Window == window )
-        fgStructure.Window = NULL;
+    if( fgStructure.CurrentWindow == window )
+        fgStructure.CurrentWindow = NULL;
 }
 
 /*
@@ -241,11 +239,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 +303,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 +326,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 +353,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;
 }
 
 /*