X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_window.c;h=04e4b0b11542c8eca30b7a90cb4027a4ac22faf2;hb=fc6f0b39d73b3d9f6ee900f23015fac4f692c644;hp=7b87792cf9ade6c67823bdaa1f485fe3a7daf4f7;hpb=b5e287f854ce6bdaf4b949ddb15cd756cd59d089;p=freeglut diff --git a/src/freeglut_window.c b/src/freeglut_window.c index 7b87792..04e4b0b 100644 --- a/src/freeglut_window.c +++ b/src/freeglut_window.c @@ -25,6 +25,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +#define FREEGLUT_BUILDING_LIB #include #include "freeglut_internal.h" @@ -132,14 +133,22 @@ GLXFBConfig* fgChooseFBConfig( void ) ATTRIB_VAL( GLX_ACCUM_ALPHA_SIZE, 1 ); } - if ((fgState.DisplayMode & GLUT_AUX) - || (fgState.DisplayMode & GLUT_AUX1) - || (fgState.DisplayMode & GLUT_AUX2) - || (fgState.DisplayMode & GLUT_AUX3) - || (fgState.DisplayMode & GLUT_AUX4)) - { - ATTRIB_VAL(GLX_AUX_BUFFERS, fgState.AuxiliaryBufferNumber) - } + if( fgState.DisplayMode & GLUT_AUX4 ) + { + ATTRIB_VAL(GLX_AUX_BUFFERS, 4); + } + else if( fgState.DisplayMode & GLUT_AUX3 ) + { + ATTRIB_VAL(GLX_AUX_BUFFERS, 3); + } + else if( fgState.DisplayMode & GLUT_AUX2 ) + { + ATTRIB_VAL(GLX_AUX_BUFFERS, 2); + } + else if( fgState.DisplayMode & GLUT_AUX1 ) /* NOTE: Same as GLUT_AUX! */ + { + ATTRIB_VAL(GLX_AUX_BUFFERS, fgState.AuxiliaryBufferNumber); + } if (fgState.DisplayMode & GLUT_MULTISAMPLE) { @@ -300,14 +309,18 @@ typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShar #endif -GLboolean fgNewWGLCreateContext( SFG_Window* window ) +void fgNewWGLCreateContext( SFG_Window* window ) { PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetEntensionsStringARB; + HGLRC context; + int attribs[7]; + PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB; + const char * pWglExtString; - if( (fgState.ContextFlags & GLUT_FORWARD_COMPATIBLE) && - (fgState.MajorVersion > 2) ) + /* If nothing fancy has been required, leave the context as it is */ + if ( fgState.MajorVersion == 1 && fgState.MinorVersion == 0 && fgState.ContextFlags == 0 ) { - return GL_TRUE; + return; } wglMakeCurrent( window->Window.Device, @@ -316,25 +329,16 @@ GLboolean fgNewWGLCreateContext( SFG_Window* window ) wglGetEntensionsStringARB=(PFNWGLGETEXTENSIONSSTRINGARBPROC)wglGetProcAddress("wglGetExtensionsStringARB"); if ( wglGetEntensionsStringARB == NULL ) { - return GL_TRUE; - } - - const char * pWglExtString=wglGetEntensionsStringARB(window->Window.Device); - if ( pWglExtString == NULL ) - { - return GL_TRUE; + return; } - if ( strstr(pWglExtString, "WGL_ARB_create_context") == NULL ) + pWglExtString=wglGetEntensionsStringARB(window->Window.Device); + if (( pWglExtString == NULL ) || ( strstr(pWglExtString, "WGL_ARB_create_context") == NULL )) { - return GL_TRUE; + return; } /* new context creation */ - HGLRC context; - int attribs[7]; - PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB; - attribs[0] = WGL_CONTEXT_MAJOR_VERSION_ARB; attribs[1] = fgState.MajorVersion; attribs[2] = WGL_CONTEXT_MINOR_VERSION_ARB; @@ -356,15 +360,10 @@ GLboolean fgNewWGLCreateContext( SFG_Window* window ) fgError( "Unable to create OpenGL %d.%d context (flags %x)", fgState.MajorVersion, fgState.MinorVersion, fgState.ContextFlags ); } - else - { - fgWarning( "Success 3.0" ); - wglMakeCurrent( NULL, NULL ); - wglDeleteContext( window->Window.Context ); - window->Window.Context = context; - } - return GL_TRUE; + wglMakeCurrent( NULL, NULL ); + wglDeleteContext( window->Window.Context ); + window->Window.Context = context; } @@ -437,8 +436,8 @@ GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly, pfd.cAuxBuffers = 3; else if( fgState.DisplayMode & GLUT_AUX2 ) pfd.cAuxBuffers = 2; - else if( fgState.DisplayMode & GLUT_AUX1 ) - pfd.cAuxBuffers = 1; + else if( fgState.DisplayMode & GLUT_AUX1 ) /* NOTE: Same as GLUT_AUX! */ + pfd.cAuxBuffers = fgState.AuxiliaryBufferNumber; else pfd.cAuxBuffers = 0; @@ -507,7 +506,7 @@ GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly, pAttributes[iCounter++]=WGL_DOUBLE_BUFFER_ARB; pAttributes[iCounter++]=(fgState.DisplayMode & GLUT_DOUBLE)!=0; pAttributes[iCounter++]=WGL_SAMPLE_BUFFERS_ARB; pAttributes[iCounter++]=GL_TRUE; - pAttributes[iCounter++]=WGL_SAMPLES_ARB; pAttributes[iCounter++]=4; + pAttributes[iCounter++]=WGL_SAMPLES_ARB; pAttributes[iCounter++]=fgState.SampleNumber; pAttributes[iCounter++]=0; pAttributes[iCounter++]=0; /* terminator */ bValid = wglChoosePixelFormatARBProc(window->Window.Device,pAttributes,fAttributes,1,&iPixelFormat,&numFormats); @@ -1035,7 +1034,8 @@ void fgCloseWindow( SFG_Window* window ) { #if TARGET_HOST_POSIX_X11 - glXDestroyContext( fgDisplay.Display, window->Window.Context ); + if( window->Window.Context ) + glXDestroyContext( fgDisplay.Display, window->Window.Context ); XFree( window->Window.FBConfig ); XDestroyWindow( fgDisplay.Display, window->Window.Handle ); /* XFlush( fgDisplay.Display ); */ /* XXX Shouldn't need this */ @@ -1093,6 +1093,14 @@ int FGAPIENTRY glutCreateWindow( const char* title ) GL_FALSE, GL_FALSE )->ID; } +#if TARGET_HOST_MS_WINDOWS +int FGAPIENTRY __glutCreateWindowWithExit( const char *title, void (__cdecl *exit_function)(int) ) +{ + __glutExitFunc = exit_function; + return glutCreateWindow( title ); +} +#endif + /* * This function creates a sub window. */