* 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 )
{
/*
*/
fgState.DisplayMode |= GLUT_DOUBLE ;
window->Window.VisualInfo = fgChooseVisual();
+ /* OK, we got a double-buffered window, but we only wanted
+ * single-buffered. Clear the double-buffer flag now.
+ */
+ fgState.DisplayMode &= ~GLUT_DOUBLE ;
}
/*
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
*/
- if ( fgState.UseCurrentContext == TRUE )
+ 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();
*/
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.
h += (GetSystemMetrics( SM_CYSIZEFRAME ) )*2 + GetSystemMetrics( SM_CYCAPTION );
}
-
/*
* Check if the user wants us to use the default position/size
*/
if( fgState.Position.Use == FALSE ) { x = CW_USEDEFAULT; y = CW_USEDEFAULT; }
-
- if( fgState.Size .Use == FALSE ) { w = CW_USEDEFAULT; h = CW_USEDEFAULT; }
+ if( fgState.Size .Use == FALSE ) { w = CW_USEDEFAULT; h = CW_USEDEFAULT; }
-
- /*
+ /*
* There's a small difference between creating the top, child and game mode windows
*/
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;
}
-
else
{
/*
flags = WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE;
}
-
/*
* Create the window now, passing the freeglut window structure as the parameter
*/
glReadBuffer ( GL_FRONT ) ;
}
-
/*
* Set the newly created window as the current one
*/
fgSetWindow( window );
}
-
/*
* Closes a window, destroying the frame and OpenGL context
*/
}
-
/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
/*
fgState.Size.X, fgState.Size.Y, FALSE )->ID );
}
-
/*
* This function creates a sub window.
*/
return( window->ID );
}
-
/*
* Destroys a window and all of its subwindows
*/
fgState.ExecState = ExecState ;
}
-
/*
* This function selects the current window
*/
return;
}
-
fgSetWindow ( window ) ;
}
-
/*
* This function returns the ID number of the current window, 0 if none exists
*/
return( 0 );
}
-
/*
* Otherwise, return the ID of the current window
*/
return( fgStructure.Window->ID );
}
-
/*
* This function makes the current window visible
*/
ShowWindow( fgStructure.Window->Window.Handle, SW_SHOW );
#endif
-}
+ /*
+ * Since the window is visible, we need to redisplay it ...
+ */
+ fgStructure.Window->State.Redisplay = TRUE;
+
+}
/*
* This function hides the current window
*/
XWithdrawWindow( fgDisplay.Display, fgStructure.Window->Window.Handle, fgDisplay.Screen );
}
-
else
{
/*
XUnmapWindow( fgDisplay.Display, fgStructure.Window->Window.Handle );
}
-
/*
* Flush the X state now
*/
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;
+}
/*
* Iconify the current window (top-level windows only)
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;
+
+}
/*
* Set the current window's title
XFlush( fgDisplay.Display );
}
-
#elif TARGET_HOST_WIN32
/*
* This seems to be a bit easier under Win32
#endif
}
-
/*
* Set the current window's iconified title
*/
XFlush( fgDisplay.Display );
}
-
#elif TARGET_HOST_WIN32
/*
* This seems to be a bit easier under Win32
#endif
}
-
/*
* Change the current window's size
*/
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 */
{
GetWindowRect ( fgStructure.Window->Parent->Window.Handle, &winRect ) ;
y -= winRect.top + GetSystemMetrics( SM_CYSIZEFRAME ) + GetSystemMetrics( SM_CYCAPTION ) ;
}
-
/*
* Resize the window, forcing a redraw to happen
*/
TRUE
);
}
-
#endif
}
-
/*
* Change the current window's position
*/
);
}
-
#endif
}
-
/*
* Lowers the current window (by Z order change)
*/
#endif
}
-
/*
* Raises the current window (by Z order change)
*/
#endif
}
-
/*
* Resize the current window so that it fits the whole screen
*/
);
}
-
/*
* A.Donev: Set and retrieve the window's user data
*/
return(fgStructure.Window->UserData);
}
-
void FGAPIENTRY glutSetWindowData(void* data)
{
fgStructure.Window->UserData=data;
}
-
/*** END OF FILE ***/
+
+
+
+
+
+
+
+
+