* Chooses a visual basing on the current display mode settings
*/
#if TARGET_HOST_UNIX_X11
+
XVisualInfo* fgChooseVisual( void )
{
int bufferSize[] = { 16, 12, 8, 4, 2, 1 };
* It might be the case for us to use double buffering
*/
if( fgState.DisplayMode & GLUT_DOUBLE )
- flags |= PFD_DOUBLEBUFFER;
+ flags |= PFD_DOUBLEBUFFER;
/*
* Specify which pixel format do we opt for...
void fgSetWindow ( SFG_Window *window )
{
#if TARGET_HOST_UNIX_X11
+ if ( window )
+ {
/*
* Make the selected window's GLX context the current one
*/
window->Window.Handle,
window->Window.Context
);
-
+ }
#elif TARGET_HOST_WIN32
/*
* Release the previous' context's device context
/*
* Here we are upon the stage. Have the visual selected.
*/
- window->Window.VisualInfo = fgChooseVisual();
+ if ( fgState.BuildingAMenu )
+ {
+ /*
+ * If there isn't already an OpenGL rendering context for menu windows, make one
+ */
+ if ( !fgStructure.MenuContext )
+ {
+ unsigned int current_DisplayMode = fgState.DisplayMode ;
+ fgState.DisplayMode = GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH ;
+ window->Window.VisualInfo = fgChooseVisual();
+ fgState.DisplayMode = current_DisplayMode ;
+ }
+ else
+ window->Window.VisualInfo = fgChooseVisual();
+ }
+ else
+ window->Window.VisualInfo = fgChooseVisual();
+
if ( ! window->Window.VisualInfo )
{
/*
mask = CWBackPixmap | CWBorderPixel | CWColormap | CWEventMask;
/*
+ * If this is a menu window we want the window manager to ignore it.
+ */
+ if ( fgState.BuildingAMenu )
+ {
+ winAttr.override_redirect = True;
+ mask |= CWOverrideRedirect;
+ }
+
+ /*
* Have the window created now
*/
window->Window.Handle = XCreateWindow(
/*
* The GLX context creation, possibly trying the direct context rendering
+ * or else use the current context if the user has so specified
*/
- window->Window.Context = glXCreateContext(
- fgDisplay.Display, window->Window.VisualInfo,
- NULL, fgState.ForceDirectContext | fgState.TryDirectContext
- );
+ if ( fgState.BuildingAMenu )
+ {
+ /*
+ * If there isn't already an OpenGL rendering context for menu windows, make one
+ */
+ if ( !fgStructure.MenuContext )
+ {
+ fgStructure.MenuContext = (SFG_MenuContext *)malloc ( sizeof(SFG_MenuContext) ) ;
+ fgStructure.MenuContext->VisualInfo = window->Window.VisualInfo ;
+ fgStructure.MenuContext->Context = glXCreateContext(
+ fgDisplay.Display, fgStructure.MenuContext->VisualInfo,
+ NULL, fgState.ForceDirectContext | fgState.TryDirectContext
+ );
+ }
+
+/* window->Window.Context = fgStructure.MenuContext->Context ; */
+ window->Window.Context = glXCreateContext(
+ fgDisplay.Display, window->Window.VisualInfo,
+ NULL, fgState.ForceDirectContext | fgState.TryDirectContext
+ );
+ }
+ else if ( fgState.UseCurrentContext == TRUE )
+ {
+ window->Window.Context = glXGetCurrentContext();
+
+ if ( ! window->Window.Context )
+ window->Window.Context = glXCreateContext(
+ fgDisplay.Display, window->Window.VisualInfo,
+ NULL, fgState.ForceDirectContext | fgState.TryDirectContext
+ );
+ }
+ else
+ window->Window.Context = glXCreateContext(
+ fgDisplay.Display, window->Window.VisualInfo,
+ NULL, fgState.ForceDirectContext | fgState.TryDirectContext
+ );
/*
* Make sure the context is direct when the user wants it forced
*/
XMapWindow( fgDisplay.Display, window->Window.Handle );
- /*
- * In game mode, move the viewport a bit to hide the decorations.
- * This code depends on the XFree86 video mode extensions.
- */
- if( gameMode == TRUE )
- {
- /*
- * This somehow fixes the glutGet() GLUT_WINDOW_X and GLUT_WINDOW_Y problem...
- */
- XMoveWindow( fgDisplay.Display, window->Window.Handle, x, y );
-
-# ifdef X_XF86VidModeSetViewPort
-
- /*
- * Set the newly created window as the current one...
- */
- fgSetWindow( window );
-
- /*
- * Move the viewport a bit down and right from top-left corner to hide the decorations
- */
- XF86VidModeSetViewPort(
- fgDisplay.Display,
- fgDisplay.Screen,
- glutGet( GLUT_WINDOW_X ),
- glutGet( GLUT_WINDOW_Y )
- );
-
-# endif
- }
-
#elif TARGET_HOST_WIN32
WNDCLASS wc;
if( gameMode == FALSE )
{
- if ( !isSubWindow )
+ if ( ( !isSubWindow ) && ( ! window->IsMenu ) )
{
/*
* Update the window dimensions, taking account of window decorations.
*/
flags = WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE;
- if( window->Parent == NULL )
+ /*
+ * If we're a menu, set our flags to include WS_POPUP to remove decorations
+ */
+ if ( window->IsMenu )
+ flags |= WS_POPUP ;
+ else if( window->Parent == NULL )
flags |= WS_OVERLAPPEDWINDOW;
else
flags |= WS_CHILD;
ShowWindow( fgStructure.Window->Window.Handle, SW_SHOW );
#endif
+
+ /*
+ * Since the window is visible, we need to redisplay it ...
+ */
+ fgStructure.Window->State.Redisplay = TRUE;
+
}
/*
ShowWindow( fgStructure.Window->Window.Handle, SW_HIDE );
#endif
+
+ /*
+ * Since the window is hidden, we don't need to redisplay it ...
+ */
+ fgStructure.Window->State.Redisplay = FALSE;
}
/*
ShowWindow( fgStructure.Window->Window.Handle, SW_MINIMIZE );
#endif
+
+ /*
+ * Since the window is just an icon, we don't need to redisplay it ...
+ */
+ fgStructure.Window->State.Redisplay = FALSE;
+
}
/*
if ( fgStructure.Window->Parent == NULL ) /* If this is not a subwindow ... */
{
/*
- * Adjust the size of the window to allow for the size of the frame
+ * Adjust the size of the window to allow for the size of the frame, if we are not a menu
*/
- width += GetSystemMetrics( SM_CXSIZEFRAME ) * 2;
- height += GetSystemMetrics( SM_CYSIZEFRAME ) * 2 + GetSystemMetrics( SM_CYCAPTION );
+ if ( ! fgStructure.Window->IsMenu )
+ {
+ width += GetSystemMetrics( SM_CXSIZEFRAME ) * 2;
+ height += GetSystemMetrics( SM_CYSIZEFRAME ) * 2 + GetSystemMetrics( SM_CYCAPTION );
+ }
}
else /* This is a subwindow, get the parent window's position and subtract it off */
{