X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_window.c;h=5e9d791423b8511161290ac81887197daa7085be;hb=6f5c26d4ca8c520af1905fd23cd157cf37ee1ace;hp=3815716bb87c2e7289d3fdba2754e8e6a68d766c;hpb=8d37a4ab509e21043db7ce4ef886d1934ce2ada1;p=freeglut diff --git a/src/freeglut_window.c b/src/freeglut_window.c index 3815716..5e9d791 100644 --- a/src/freeglut_window.c +++ b/src/freeglut_window.c @@ -127,6 +127,16 @@ XVisualInfo* fgChooseVisual( void ) ATTRIB_VAL( GLX_ACCUM_ALPHA_SIZE, 1 ); } + if( fgState.DisplayMode & GLUT_AUX1 ) + ATTRIB_VAL( GLX_AUX_BUFFERS, 1 ); + if( fgState.DisplayMode & GLUT_AUX2 ) + ATTRIB_VAL( GLX_AUX_BUFFERS, 2 ); + if( fgState.DisplayMode & GLUT_AUX3 ) + ATTRIB_VAL( GLX_AUX_BUFFERS, 3 ); + if( fgState.DisplayMode & GLUT_AUX4 ) + ATTRIB_VAL( GLX_AUX_BUFFERS, 4 ); + + /* Push a null at the end of the list */ ATTRIB( None ); @@ -204,7 +214,17 @@ GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly, pfd.cDepthBits = 24; pfd.cStencilBits = 8; #endif - pfd.cAuxBuffers = 0; + if( fgState.DisplayMode & GLUT_AUX4 ) + pfd.cAuxBuffers = 4; + else if( fgState.DisplayMode & GLUT_AUX3 ) + pfd.cAuxBuffers = 3; + else if( fgState.DisplayMode & GLUT_AUX2 ) + pfd.cAuxBuffers = 2; + else if( fgState.DisplayMode & GLUT_AUX1 ) + pfd.cAuxBuffers = 1; + else + pfd.cAuxBuffers = 0; + pfd.iLayerType = layer_type; pfd.bReserved = 0; pfd.dwLayerMask = 0; @@ -239,9 +259,9 @@ void fgSetWindow ( SFG_Window *window ) window->Window.Context ); #elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE - if( fgStructure.Window ) - ReleaseDC( fgStructure.Window->Window.Handle, - fgStructure.Window->Window.Device ); + if( fgStructure.CurrentWindow ) + ReleaseDC( fgStructure.CurrentWindow->Window.Handle, + fgStructure.CurrentWindow->Window.Device ); if ( window ) { @@ -252,7 +272,7 @@ void fgSetWindow ( SFG_Window *window ) ); } #endif - fgStructure.Window = window; + fgStructure.CurrentWindow = window; } @@ -316,7 +336,7 @@ void fgOpenWindow( SFG_Window* window, const char* title, */ winAttr.event_mask = StructureNotifyMask | SubstructureNotifyMask | ExposureMask | - ButtonPressMask | ButtonReleaseMask | KeyPressMask | KeyRelease | + ButtonPressMask | ButtonReleaseMask | KeyPressMask | KeyReleaseMask | VisibilityChangeMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask | ButtonMotionMask; winAttr.background_pixmap = None; @@ -330,7 +350,7 @@ void fgOpenWindow( SFG_Window* window, const char* title, mask = CWBackPixmap | CWBorderPixel | CWColormap | CWEventMask; - if( window->IsMenu ) + if( window->IsMenu || ( gameMode == GL_TRUE ) ) { winAttr.override_redirect = True; mask |= CWOverrideRedirect; @@ -401,12 +421,6 @@ void fgOpenWindow( SFG_Window* window, const char* title, } #endif - glXMakeCurrent( - fgDisplay.Display, - window->Window.Handle, - window->Window.Context - ); - /* * XXX Assume the new window is visible by default * XXX Is this a safe assumption? @@ -452,6 +466,12 @@ void fgOpenWindow( SFG_Window* window, const char* title, XSetWMProtocols( fgDisplay.Display, window->Window.Handle, &fgDisplay.DeleteWindow, 1 ); + glXMakeCurrent( + fgDisplay.Display, + window->Window.Handle, + window->Window.Context + ); + XMapWindow( fgDisplay.Display, window->Window.Handle ); #elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE @@ -573,7 +593,7 @@ void fgOpenWindow( SFG_Window* window, const char* title, #endif /* TARGET_HOST_WINCE */ UpdateWindow( window->Window.Handle ); - ShowCursor( TRUE ); /* XXX Old comments say "hide cusror"! */ + ShowCursor( TRUE ); /* XXX Old comments say "hide cursor"! */ #endif @@ -603,7 +623,7 @@ void fgCloseWindow( SFG_Window* window ) #elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE /* Make sure we don't close a window with current context active */ - if( fgStructure.Window == window ) + if( fgStructure.CurrentWindow == window ) wglMakeCurrent( NULL, NULL ); /* @@ -688,8 +708,8 @@ void FGAPIENTRY glutSetWindow( int ID ) SFG_Window* window = NULL; FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetWindow" ); - if( fgStructure.Window != NULL ) - if( fgStructure.Window->ID == ID ) + if( fgStructure.CurrentWindow != NULL ) + if( fgStructure.CurrentWindow->ID == ID ) return; window = fgWindowByID( ID ); @@ -708,9 +728,9 @@ void FGAPIENTRY glutSetWindow( int ID ) int FGAPIENTRY glutGetWindow( void ) { FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGetWindow" ); - if( fgStructure.Window == NULL ) + if( fgStructure.CurrentWindow == NULL ) return 0; - return fgStructure.Window->ID; + return fgStructure.CurrentWindow->ID; } /* @@ -723,16 +743,16 @@ void FGAPIENTRY glutShowWindow( void ) #if TARGET_HOST_UNIX_X11 - XMapWindow( fgDisplay.Display, fgStructure.Window->Window.Handle ); + XMapWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle ); XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ #elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE - ShowWindow( fgStructure.Window->Window.Handle, SW_SHOW ); + ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_SHOW ); #endif - fgStructure.Window->State.Redisplay = GL_TRUE; + fgStructure.CurrentWindow->State.Redisplay = GL_TRUE; } /* @@ -745,22 +765,22 @@ void FGAPIENTRY glutHideWindow( void ) #if TARGET_HOST_UNIX_X11 - if( fgStructure.Window->Parent == NULL ) + if( fgStructure.CurrentWindow->Parent == NULL ) XWithdrawWindow( fgDisplay.Display, - fgStructure.Window->Window.Handle, + fgStructure.CurrentWindow->Window.Handle, fgDisplay.Screen ); else XUnmapWindow( fgDisplay.Display, - fgStructure.Window->Window.Handle ); + fgStructure.CurrentWindow->Window.Handle ); XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ #elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE - ShowWindow( fgStructure.Window->Window.Handle, SW_HIDE ); + ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_HIDE ); #endif - fgStructure.Window->State.Redisplay = GL_FALSE; + fgStructure.CurrentWindow->State.Redisplay = GL_FALSE; } /* @@ -771,20 +791,20 @@ void FGAPIENTRY glutIconifyWindow( void ) FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutIconifyWindow" ); FREEGLUT_EXIT_IF_NO_WINDOW ( "glutIconifyWindow" ); - fgStructure.Window->State.Visible = GL_FALSE; + fgStructure.CurrentWindow->State.Visible = GL_FALSE; #if TARGET_HOST_UNIX_X11 - XIconifyWindow( fgDisplay.Display, fgStructure.Window->Window.Handle, + XIconifyWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle, fgDisplay.Screen ); XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ #elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE - ShowWindow( fgStructure.Window->Window.Handle, SW_MINIMIZE ); + ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_MINIMIZE ); #endif - fgStructure.Window->State.Redisplay = GL_FALSE; + fgStructure.CurrentWindow->State.Redisplay = GL_FALSE; } /* @@ -794,7 +814,7 @@ void FGAPIENTRY glutSetWindowTitle( const char* title ) { FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetWindowTitle" ); FREEGLUT_EXIT_IF_NO_WINDOW ( "glutSetWindowTitle" ); - if( ! fgStructure.Window->Parent ) + if( ! fgStructure.CurrentWindow->Parent ) { #if TARGET_HOST_UNIX_X11 @@ -807,7 +827,7 @@ void FGAPIENTRY glutSetWindowTitle( const char* title ) XSetWMName( fgDisplay.Display, - fgStructure.Window->Window.Handle, + fgStructure.CurrentWindow->Window.Handle, &text ); @@ -815,13 +835,13 @@ void FGAPIENTRY glutSetWindowTitle( const char* title ) #elif TARGET_HOST_WIN32 - SetWindowText( fgStructure.Window->Window.Handle, title ); + SetWindowText( fgStructure.CurrentWindow->Window.Handle, title ); #elif TARGET_HOST_WINCE { wchar_t* wstr = fghWstrFromStr(title); - SetWindowText( fgStructure.Window->Window.Handle, wstr ); + SetWindowText( fgStructure.CurrentWindow->Window.Handle, wstr ); free(wstr); } @@ -837,7 +857,7 @@ void FGAPIENTRY glutSetIconTitle( const char* title ) FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetIconTitle" ); FREEGLUT_EXIT_IF_NO_WINDOW ( "glutSetIconTitle" ); - if( ! fgStructure.Window->Parent ) + if( ! fgStructure.CurrentWindow->Parent ) { #if TARGET_HOST_UNIX_X11 @@ -850,7 +870,7 @@ void FGAPIENTRY glutSetIconTitle( const char* title ) XSetWMIconName( fgDisplay.Display, - fgStructure.Window->Window.Handle, + fgStructure.CurrentWindow->Window.Handle, &text ); @@ -858,13 +878,13 @@ void FGAPIENTRY glutSetIconTitle( const char* title ) #elif TARGET_HOST_WIN32 - SetWindowText( fgStructure.Window->Window.Handle, title ); + SetWindowText( fgStructure.CurrentWindow->Window.Handle, title ); #elif TARGET_HOST_WINCE { wchar_t* wstr = fghWstrFromStr(title); - SetWindowText( fgStructure.Window->Window.Handle, wstr ); + SetWindowText( fgStructure.CurrentWindow->Window.Handle, wstr ); free(wstr); } @@ -880,9 +900,9 @@ void FGAPIENTRY glutReshapeWindow( int width, int height ) FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutReshapeWindow" ); FREEGLUT_EXIT_IF_NO_WINDOW ( "glutReshapeWindow" ); - fgStructure.Window->State.NeedToResize = GL_TRUE; - fgStructure.Window->State.Width = width ; - fgStructure.Window->State.Height = height; + fgStructure.CurrentWindow->State.NeedToResize = GL_TRUE; + fgStructure.CurrentWindow->State.Width = width ; + fgStructure.CurrentWindow->State.Height = height; } /* @@ -895,7 +915,7 @@ void FGAPIENTRY glutPositionWindow( int x, int y ) #if TARGET_HOST_UNIX_X11 - XMoveWindow( fgDisplay.Display, fgStructure.Window->Window.Handle, + XMoveWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle, x, y ); XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ @@ -905,9 +925,9 @@ void FGAPIENTRY glutPositionWindow( int x, int y ) RECT winRect; /* "GetWindowRect" returns the pixel coordinates of the outside of the window */ - GetWindowRect( fgStructure.Window->Window.Handle, &winRect ); + GetWindowRect( fgStructure.CurrentWindow->Window.Handle, &winRect ); MoveWindow( - fgStructure.Window->Window.Handle, + fgStructure.CurrentWindow->Window.Handle, x, y, winRect.right - winRect.left, @@ -929,12 +949,12 @@ void FGAPIENTRY glutPushWindow( void ) #if TARGET_HOST_UNIX_X11 - XLowerWindow( fgDisplay.Display, fgStructure.Window->Window.Handle ); + XLowerWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle ); #elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE SetWindowPos( - fgStructure.Window->Window.Handle, + fgStructure.CurrentWindow->Window.Handle, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE @@ -953,12 +973,12 @@ void FGAPIENTRY glutPopWindow( void ) #if TARGET_HOST_UNIX_X11 - XRaiseWindow( fgDisplay.Display, fgStructure.Window->Window.Handle ); + XRaiseWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle ); #elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE SetWindowPos( - fgStructure.Window->Window.Handle, + fgStructure.CurrentWindow->Window.Handle, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE @@ -982,7 +1002,7 @@ void FGAPIENTRY glutFullScreen( void ) XMoveResizeWindow( fgDisplay.Display, - fgStructure.Window->Window.Handle, + fgStructure.CurrentWindow->Window.Handle, 0, 0, fgDisplay.ScreenWidth, fgDisplay.ScreenHeight @@ -992,7 +1012,7 @@ void FGAPIENTRY glutFullScreen( void ) XTranslateCoordinates( fgDisplay.Display, - fgStructure.Window->Window.Handle, + fgStructure.CurrentWindow->Window.Handle, fgDisplay.RootWindow, 0, 0, &x, &y, &w ); @@ -1001,7 +1021,7 @@ void FGAPIENTRY glutFullScreen( void ) { XMoveWindow( fgDisplay.Display, - fgStructure.Window->Window.Handle, + fgStructure.CurrentWindow->Window.Handle, -x, -y ); XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ @@ -1029,7 +1049,7 @@ void FGAPIENTRY glutFullScreen( void ) * SWP_NOZORDER Retains the current Z order (ignore 2nd param) */ - SetWindowPos( fgStructure.Window->Window.Handle, + SetWindowPos( fgStructure.CurrentWindow->Window.Handle, HWND_TOP, rect.left, rect.top, @@ -1049,14 +1069,14 @@ void* FGAPIENTRY glutGetWindowData( void ) { FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGetWindowData" ); FREEGLUT_EXIT_IF_NO_WINDOW ( "glutGetWindowData" ); - return fgStructure.Window->UserData; + return fgStructure.CurrentWindow->UserData; } void FGAPIENTRY glutSetWindowData(void* data) { FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetWindowData" ); FREEGLUT_EXIT_IF_NO_WINDOW ( "glutSetWindowData" ); - fgStructure.Window->UserData = data; + fgStructure.CurrentWindow->UserData = data; } /*** END OF FILE ***/