X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_window.c;h=af294254ce7f0ae41fd7a28b0c5d762bd4bd88f7;hb=fe6b05020a6274423643f766f6d7b651a6264cbb;hp=e2e7f3bb9d029b45eb4443de7b974b592f816a52;hpb=102d7dff8f914d2e32c099f1bc0db809ef780b5e;p=freeglut diff --git a/src/freeglut_window.c b/src/freeglut_window.c index e2e7f3b..af29425 100644 --- a/src/freeglut_window.c +++ b/src/freeglut_window.c @@ -184,6 +184,9 @@ GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly, if( fgState.DisplayMode & GLUT_DOUBLE ) flags |= PFD_DOUBLEBUFFER; + if( fgState.DisplayMode & GLUT_STEREO ) + flags |= PFD_STEREO; + #if defined(_MSC_VER) #pragma message( "fgSetupPixelFormat(): there is still some work to do here!" ) #endif @@ -259,9 +262,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 ) { @@ -272,7 +275,7 @@ void fgSetWindow ( SFG_Window *window ) ); } #endif - fgStructure.Window = window; + fgStructure.CurrentWindow = window; } @@ -350,7 +353,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; @@ -380,14 +383,14 @@ void fgOpenWindow( SFG_Window* window, const char* title, { fgStructure.MenuContext = (SFG_MenuContext *)malloc( sizeof(SFG_MenuContext) ); - fgStructure.MenuContext->VisualInfo = window->Window.VisualInfo; - fgStructure.MenuContext->Context = glXCreateContext( - fgDisplay.Display, fgStructure.MenuContext->VisualInfo, + fgStructure.MenuContext->MVisualInfo = window->Window.VisualInfo; + fgStructure.MenuContext->MContext = glXCreateContext( + fgDisplay.Display, fgStructure.MenuContext->MVisualInfo, NULL, ( fgState.DirectContext != GLUT_FORCE_INDIRECT_CONTEXT ) ); } - /* window->Window.Context = fgStructure.MenuContext->Context; */ + /* window->Window.Context = fgStructure.MenuContext->MContext; */ window->Window.Context = glXCreateContext( fgDisplay.Display, window->Window.VisualInfo, NULL, ( fgState.DirectContext != GLUT_FORCE_INDIRECT_CONTEXT ) @@ -462,6 +465,7 @@ void fgOpenWindow( SFG_Window* window, const char* title, &wmHints, NULL ); + XFree( textProperty.value ); XSetWMProtocols( fgDisplay.Display, window->Window.Handle, &fgDisplay.DeleteWindow, 1 ); @@ -593,7 +597,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 @@ -617,13 +621,14 @@ void fgCloseWindow( SFG_Window* window ) #if TARGET_HOST_UNIX_X11 glXDestroyContext( fgDisplay.Display, window->Window.Context ); + XFree( window->Window.VisualInfo ); XDestroyWindow( fgDisplay.Display, window->Window.Handle ); XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ #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 ); /* @@ -659,6 +664,12 @@ void fgCloseWindow( SFG_Window* window ) */ int FGAPIENTRY glutCreateWindow( const char* title ) { + /* XXX GLUT does not exit; it simply calls "glutInit" quietly if the + * XXX application has not already done so. The "freeglut" community + * XXX decided not to go this route (freeglut-developer e-mail from + * XXX Steve Baker, 12/16/04, 4:22 PM CST, "Re: [Freeglut-developer] + * XXX Desired 'freeglut' behaviour when there is no current window" + */ FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutCreateWindow" ); return fgCreateWindow( NULL, title, fgState.Position.X, fgState.Position.Y, @@ -678,6 +689,32 @@ int FGAPIENTRY glutCreateSubWindow( int parentID, int x, int y, int w, int h ) FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutCreateSubWindow" ); parent = fgWindowByID( parentID ); freeglut_return_val_if_fail( parent != NULL, 0 ); + if ( x < 0 ) + { + x = parent->State.Width + x ; + if ( w >= 0 ) x -= w ; + } + + if ( w < 0 ) w = parent->State.Width - x + w ; + if ( w < 0 ) + { + x += w ; + w = -w ; + } + + if ( y < 0 ) + { + y = parent->State.Height + y ; + if ( h >= 0 ) y -= h ; + } + + if ( h < 0 ) h = parent->State.Height - y + h ; + if ( h < 0 ) + { + y += h ; + h = -h ; + } + window = fgCreateWindow( parent, "", x, y, w, h, GL_FALSE, GL_FALSE ); ret = window->ID; @@ -708,8 +745,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 ); @@ -728,9 +765,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; } /* @@ -743,16 +780,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; } /* @@ -765,22 +802,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; } /* @@ -791,20 +828,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; } /* @@ -814,7 +851,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 @@ -827,7 +864,7 @@ void FGAPIENTRY glutSetWindowTitle( const char* title ) XSetWMName( fgDisplay.Display, - fgStructure.Window->Window.Handle, + fgStructure.CurrentWindow->Window.Handle, &text ); @@ -835,13 +872,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); } @@ -857,7 +894,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 @@ -870,7 +907,7 @@ void FGAPIENTRY glutSetIconTitle( const char* title ) XSetWMIconName( fgDisplay.Display, - fgStructure.Window->Window.Handle, + fgStructure.CurrentWindow->Window.Handle, &text ); @@ -878,13 +915,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); } @@ -900,9 +937,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; } /* @@ -915,7 +952,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 */ @@ -925,9 +962,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, @@ -949,12 +986,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 @@ -973,12 +1010,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 @@ -1002,7 +1039,7 @@ void FGAPIENTRY glutFullScreen( void ) XMoveResizeWindow( fgDisplay.Display, - fgStructure.Window->Window.Handle, + fgStructure.CurrentWindow->Window.Handle, 0, 0, fgDisplay.ScreenWidth, fgDisplay.ScreenHeight @@ -1012,7 +1049,7 @@ void FGAPIENTRY glutFullScreen( void ) XTranslateCoordinates( fgDisplay.Display, - fgStructure.Window->Window.Handle, + fgStructure.CurrentWindow->Window.Handle, fgDisplay.RootWindow, 0, 0, &x, &y, &w ); @@ -1021,7 +1058,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 */ @@ -1049,7 +1086,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, @@ -1069,14 +1106,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 ***/