X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_window.c;h=08cb8d97645c8e19da57a19b6a17b3184ed5dd23;hb=fe89df7de1aa6a732a441e983cce03e1fd6fd81a;hp=9e4a9e31ba2a192b01905a20cb2d91ec8bb916cb;hpb=646676b8dbf8ab504ac8a275fe9a63a403a3190b;p=freeglut diff --git a/src/freeglut_window.c b/src/freeglut_window.c index 9e4a9e3..08cb8d9 100644 --- a/src/freeglut_window.c +++ b/src/freeglut_window.c @@ -233,7 +233,7 @@ GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly, unsigned * 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... @@ -363,7 +363,24 @@ void fgOpenWindow( SFG_Window* window, const char* title, int x, int y, int w, i /* * 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 ) { /* @@ -428,11 +445,44 @@ void fgOpenWindow( SFG_Window* window, const char* title, int x, int y, int w, i /* * 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 @@ -552,7 +602,7 @@ void fgOpenWindow( SFG_Window* window, const char* title, int x, int y, int w, i if( gameMode == FALSE ) { - if ( !isSubWindow ) + if ( ( !isSubWindow ) && ( ! window->IsMenu ) ) { /* * Update the window dimensions, taking account of window decorations. @@ -574,7 +624,12 @@ void fgOpenWindow( SFG_Window* window, const char* title, int x, int y, int w, i */ 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; @@ -833,6 +888,12 @@ void FGAPIENTRY glutShowWindow( void ) ShowWindow( fgStructure.Window->Window.Handle, SW_SHOW ); #endif + + /* + * Since the window is visible, we need to redisplay it ... + */ + fgStructure.Window->State.Redisplay = TRUE; + } /* @@ -874,6 +935,11 @@ void FGAPIENTRY glutHideWindow( void ) 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; } /* @@ -897,6 +963,12 @@ void FGAPIENTRY glutIconifyWindow( void ) 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; + } /* @@ -1026,10 +1098,13 @@ void FGAPIENTRY glutReshapeWindow( int width, int height ) 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 */ {