Major menu changes (they appear in their own window, have own rendering context)...
[freeglut] / src / freeglut_internal.h
index 5b9df43..26ee0c2 100644 (file)
@@ -29,8 +29,8 @@
 #define  FREEGLUT_INTERNAL_H
 
 /* XXX Update these for each release! */
-#define  VERSION_MAJOR 1
-#define  VERSION_MINOR 4
+#define  VERSION_MAJOR 2
+#define  VERSION_MINOR 0
 #define  VERSION_PATCH 0 
 
 /*
     #include <X11/keysym.h>
 
     #ifndef __sgi
+    #ifndef SOLARIS
     #include <X11/extensions/xf86vmode.h>
     #endif
+    #endif
 #endif
 
 /*
@@ -219,6 +221,7 @@ struct tagSFG_State
     GLboolean        TryDirectContext;     /* What about giving a try to?       */
 
     GLboolean        ForceIconic;          /* All new top windows are iconified */
+    GLboolean        UseCurrentContext;    /* New windows use current window's rendering context */
 
     GLboolean        GLDebugSwitch;        /* OpenGL state debugging switch     */
     GLboolean        XSyncSwitch;          /* X11 sync protocol switch          */
@@ -234,6 +237,7 @@ struct tagSFG_State
 
     FGCBidle         IdleCallback;         /* The global idle callback          */
 
+    GLboolean        BuildingAMenu;        /* True if we are presently making a menu */
     FGCBmenuState    MenuStateCallback;    /* Menu callbacks are global         */
     FGCBmenuStatus   MenuStatusCallback;
 
@@ -260,6 +264,11 @@ struct tagSFG_Display
     Atom            DeleteWindow;       /* The window deletion atom          */
 
 #ifdef X_XF86VidModeGetModeLine
+    /*
+     * XF86VidMode may be compilable even if it fails at runtime.  Therefore,
+     * the validity of the VidMode has to be tracked
+     */
+    int             DisplayModeValid;   /* Flag that indicates runtime status*/
     XF86VidModeModeLine DisplayMode;    /* Current screen's display settings */
     int             DisplayModeClock;   /* The display mode's refresh rate   */
 #endif
@@ -378,8 +387,25 @@ struct tagSFG_WindowCallbacks
 };
 
 /*
+ * This structure holds the OpenGL rendering context for all the menu windows
+ */
+typedef struct tagSFG_MenuContext SFG_MenuContext;
+struct tagSFG_MenuContext
+{
+#if TARGET_HOST_UNIX_X11
+    GLXContext          Context;                /* The menu OpenGL context   */
+    XVisualInfo*        VisualInfo;             /* The window's visual information */
+#elif TARGET_HOST_WIN32
+    HGLRC               Context;                /* The menu window's WGL context    */
+#endif
+
+};
+
+/*
  * This structure describes a menu
  */
+typedef struct tagSFG_Window SFG_Window;
+typedef struct tagSFG_MenuEntry SFG_MenuEntry;
 typedef struct tagSFG_Menu SFG_Menu;
 struct tagSFG_Menu
 {
@@ -393,12 +419,15 @@ struct tagSFG_Menu
     int                 Width;                  /* Menu box width in pixels  */
     int                 Height;                 /* Menu box height in pixels */
     int                 X, Y;                   /* Menu box raster position  */
+
+    SFG_MenuEntry      *ActiveEntry ;           /* Currently active entry in the menu */
+    SFG_Window         *Window ;                /* OpenGL window for menu    */
+    SFG_Window         *ParentWindow ;          /* OpenGL window in which the menu is defined */
 };
 
 /*
  * This is a menu entry
  */
-typedef struct tagSFG_MenuEntry SFG_MenuEntry;
 struct tagSFG_MenuEntry
 {
     SFG_Node            Node;
@@ -413,7 +442,6 @@ struct tagSFG_MenuEntry
 /*
  * A window, making part of freeglut windows hierarchy. Should be kept portable.
  */
-typedef struct tagSFG_Window SFG_Window;
 struct tagSFG_Window
 {
     SFG_Node            Node;
@@ -429,6 +457,8 @@ struct tagSFG_Window
 
     SFG_Window*         Parent;                 /* The parent to this window */
     SFG_List            Children;               /* The subwindows d.l. list  */
+
+    GLboolean           IsMenu;                 /* Set to 1 if we are a menu */
 };
 
 /*
@@ -454,6 +484,8 @@ struct tagSFG_Structure
     SFG_Window*         Window;                 /* The currently active win. */
     SFG_Menu*           Menu;                   /* Same, but menu...         */
 
+    SFG_MenuContext*    MenuContext;            /* OpenGL rendering context for menus */
+
     SFG_Window*         GameMode;               /* The game mode window      */
 
     int                 WindowID;               /* The new current window ID */
@@ -667,6 +699,7 @@ void fgActivateMenu( SFG_Window* window, int button );
 void fgExecuteMenuCallback( SFG_Menu* menu ) ;
 GLboolean fgCheckActiveMenu ( SFG_Window *window, SFG_Menu *menu ) ;
 void fgDeactivateMenu( SFG_Window *window );
+void fgDeactivateSubMenu( SFG_MenuEntry *menuEntry );
 
 /*
  * This function gets called just before the buffers swap, so that