X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_init.c;h=9cc6a722b9449f179d0d862d22030e3b0777922d;hb=102d7dff8f914d2e32c099f1bc0db809ef780b5e;hp=ec5b6195622a9edf019e0c1ab563246794820984;hpb=34904da12798fd5b88442c816ac8dd7c41edcc33;p=freeglut diff --git a/src/freeglut_init.c b/src/freeglut_init.c index ec5b619..9cc6a72 100644 --- a/src/freeglut_init.c +++ b/src/freeglut_init.c @@ -25,10 +25,6 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - #include #include "freeglut_internal.h" @@ -85,7 +81,8 @@ SFG_State fgState = { { -1, -1, GL_FALSE }, /* Position */ 72, /* GameModeRefresh */ GLUT_ACTION_EXIT, /* ActionOnWindowClose */ GLUT_EXEC_STATE_INIT, /* ExecState */ - NULL /* ProgramName */ + NULL, /* ProgramName */ + GL_FALSE /* JoysticksInitialised */ }; @@ -94,7 +91,7 @@ SFG_State fgState = { { -1, -1, GL_FALSE }, /* Position */ /* * A call to this function should initialize all the display stuff... */ -void fgInitialize( const char* displayName ) +static void fghInitialize( const char* displayName ) { #if TARGET_HOST_UNIX_X11 fgDisplay.Display = XOpenDisplay( displayName ); @@ -132,9 +129,7 @@ void fgInitialize( const char* displayName ) fgDisplay.Connection = ConnectionNumber( fgDisplay.Display ); - /* - * Create the window deletion atom - */ + /* Create the window deletion atom */ fgDisplay.DeleteWindow = XInternAtom( fgDisplay.Display, "WM_DELETE_WINDOW", @@ -146,9 +141,7 @@ void fgInitialize( const char* displayName ) WNDCLASS wc; ATOM atom; - /* - * What we need to do is to initialize the fgDisplay global structure here. - */ + /* What we need to do is to initialize the fgDisplay global structure here. */ fgDisplay.Instance = GetModuleHandle( NULL ); atom = GetClassInfo( fgDisplay.Instance, _T("FREEGLUT"), &wc ); @@ -184,16 +177,12 @@ void fgInitialize( const char* displayName ) wc.lpszMenuName = NULL; wc.lpszClassName = _T("FREEGLUT"); - /* - * Register the window class - */ + /* Register the window class */ atom = RegisterClass( &wc ); - assert( atom ); + FREEGLUT_INTERNAL_ERROR_EXIT ( atom, "Window Class Not Registered", "fghInitialize" ); } - /* - * The screen dimensions can be obtained via GetSystemMetrics() calls - */ + /* The screen dimensions can be obtained via GetSystemMetrics() calls */ fgDisplay.ScreenWidth = GetSystemMetrics( SM_CXSCREEN ); fgDisplay.ScreenHeight = GetSystemMetrics( SM_CYSCREEN ); @@ -209,11 +198,6 @@ void fgInitialize( const char* displayName ) #endif -#if !TARGET_HOST_WINCE - fgJoystickInit( 0 ); - fgJoystickInit( 1 ); -#endif /* !TARGET_HOST_WINCE */ - fgState.Initialised = GL_TRUE; } @@ -231,11 +215,7 @@ void fgDeinitialize( void ) return; } - /* fgState.Initialised = GL_FALSE; */ - - /* - * If there was a menu created, destroy the rendering context - */ + /* If there was a menu created, destroy the rendering context */ if( fgStructure.MenuContext ) { free( fgStructure.MenuContext ); @@ -244,21 +224,23 @@ void fgDeinitialize( void ) fgDestroyStructure( ); - while( (timer = fgState.Timers.First) ) + while( ( timer = fgState.Timers.First) ) { fgListRemove( &fgState.Timers, &timer->Node ); free( timer ); } - while( (timer = fgState.FreeTimers.First) ) + while( ( timer = fgState.FreeTimers.First) ) { fgListRemove( &fgState.FreeTimers, &timer->Node ); free( timer ); } #if !TARGET_HOST_WINCE - fgJoystickClose( ); + if ( fgState.JoysticksInitialised ) + fgJoystickClose( ); #endif /* !TARGET_HOST_WINCE */ + fgState.JoysticksInitialised = GL_FALSE; fgState.Initialised = GL_FALSE; @@ -280,7 +262,7 @@ void fgDeinitialize( void ) fgState.ActionOnWindowClose = GLUT_ACTION_EXIT; fgState.ExecState = GLUT_EXEC_STATE_INIT; - fgState.KeyRepeat = GL_FALSE; + fgState.KeyRepeat = GL_TRUE; fgState.Modifiers = 0xffffffff; fgState.GameModeSize.X = 640; @@ -323,6 +305,8 @@ void fgDeinitialize( void ) XCloseDisplay( fgDisplay.Display ); #endif + + fgState.Initialised = GL_FALSE; } /* @@ -606,19 +590,14 @@ void FGAPIENTRY glutInit( int* pargc, char** argv ) } } - /* - * Compact {argv}. - */ - j = 2; - for( i = 1; i < *pargc; i++, j++ ) + /* Compact {argv}. */ + for( i = j = 1; i < *pargc; i++, j++ ) { - if( argv[ i ] == NULL ) - { - /* Guaranteed to end because there are "*pargc" arguments left */ - while ( argv[ j ] == NULL ) - j++; + /* Guaranteed to end because there are "*pargc" arguments left */ + while ( argv[ j ] == NULL ) + j++; + if ( i != j ) argv[ i ] = argv[ j ]; - } } #endif /* TARGET_HOST_WINCE */ @@ -628,7 +607,7 @@ void FGAPIENTRY glutInit( int* pargc, char** argv ) * in the program arguments, we will use the DISPLAY environment * variable for opening the X display (see code above): */ - fgInitialize( displayName ); + fghInitialize( displayName ); /* * Geometry parsing deffered until here because we may need the screen @@ -637,9 +616,13 @@ void FGAPIENTRY glutInit( int* pargc, char** argv ) if (geometry ) { + unsigned int parsedWidth, parsedHeight; int mask = XParseGeometry( geometry, &fgState.Position.X, &fgState.Position.Y, - &fgState.Size.X, &fgState.Size.Y ); + &parsedWidth, &parsedHeight ); + /* TODO: Check for overflow? */ + fgState.Size.X = parsedWidth; + fgState.Size.Y = parsedHeight; if( (mask & (WidthValue|HeightValue)) == (WidthValue|HeightValue) ) fgState.Size.Use = GL_TRUE; @@ -688,32 +671,23 @@ void FGAPIENTRY glutInitWindowSize( int width, int height ) */ void FGAPIENTRY glutInitDisplayMode( unsigned int displayMode ) { - /* - * We will make use of this value when creating a new OpenGL context... - */ + /* We will make use of this value when creating a new OpenGL context... */ fgState.DisplayMode = displayMode; } /* -- INIT DISPLAY STRING PARSING ------------------------------------------ */ -#define NUM_TOKENS 28 +#define NUM_TOKENS 36 static char* Tokens[] = { "alpha", "acca", "acc", "blue", "buffer", "conformant", "depth", "double", "green", "index", "num", "red", "rgba", "rgb", "luminance", "stencil", - "single", "stereo", "samples", "slow", "win32pdf", "xvisual", + "single", "stereo", "samples", "slow", "win32pdf", "win32pfd", "xvisual", "xstaticgray", "xgrayscale", "xstaticcolor", "xpseudocolor", - "xtruecolor", "xdirectcolor" -}; - -static int TokenLengths[] = -{ - 5, 4, 3, 4, 6, 10, 5, 6, - 5, 5, 3, 3, 4, 3, 9, 7, - 6, 6, 7, 4, 8, 7, - 11, 10, 12, 12, - 10, 12 + "xtruecolor", "xdirectcolor", + "xstaticgrey", "xgreyscale", "xstaticcolour", "xpseudocolour", + "xtruecolour", "xdirectcolour", "borderless", "aux" }; void FGAPIENTRY glutInitDisplayString( const char* displayMode ) @@ -732,13 +706,11 @@ void FGAPIENTRY glutInitDisplayString( const char* displayMode ) token = strtok ( buffer, " \t" ); while ( token ) { - /* - * Process this token - */ + /* Process this token */ int i ; for ( i = 0; i < NUM_TOKENS; i++ ) { - if ( strncmp ( token, Tokens[i], TokenLengths[i] ) == 0 ) break ; + if ( strcmp ( token, Tokens[i] ) == 0 ) break ; } switch ( i ) @@ -832,56 +804,72 @@ void FGAPIENTRY glutInitDisplayString( const char* displayMode ) configuration is slow or not */ break ; - case 20 : /* "win32pdf": matches the Win32 Pixel Format Descriptor by + case 20 : /* "win32pdf": (incorrect spelling but was there before */ + case 21 : /* "win32pfd": matches the Win32 Pixel Format Descriptor by number */ #if TARGET_HOST_WIN32 #endif break ; - case 21 : /* "xvisual": matches the X visual ID by number */ + case 22 : /* "xvisual": matches the X visual ID by number */ #if TARGET_HOST_UNIX_X11 #endif break ; - case 22 : /* "xstaticgray": boolean indicating if the frame buffer + case 23 : /* "xstaticgray": */ + case 29 : /* "xstaticgrey": boolean indicating if the frame buffer configuration's X visual is of type StaticGray */ #if TARGET_HOST_UNIX_X11 #endif break ; - case 23 : /* "xgrayscale": boolean indicating if the frame buffer + case 24 : /* "xgrayscale": */ + case 30 : /* "xgreyscale": boolean indicating if the frame buffer configuration's X visual is of type GrayScale */ #if TARGET_HOST_UNIX_X11 #endif break ; - case 24 : /* "xstaticcolor": boolean indicating if the frame buffer + case 25 : /* "xstaticcolor": */ + case 31 : /* "xstaticcolour": boolean indicating if the frame buffer configuration's X visual is of type StaticColor */ #if TARGET_HOST_UNIX_X11 #endif break ; - case 25 : /* "xpseudocolor": boolean indicating if the frame buffer + case 26 : /* "xpseudocolor": */ + case 32 : /* "xpseudocolour": boolean indicating if the frame buffer configuration's X visual is of type PseudoColor */ #if TARGET_HOST_UNIX_X11 #endif break ; - case 26 : /* "xtruecolor": boolean indicating if the frame buffer + case 27 : /* "xtruecolor": */ + case 33 : /* "xtruecolour": boolean indicating if the frame buffer configuration's X visual is of type TrueColor */ #if TARGET_HOST_UNIX_X11 #endif break ; - case 27 : /* "xdirectcolor": boolean indicating if the frame buffer + case 28 : /* "xdirectcolor": */ + case 34 : /* "xdirectcolour": boolean indicating if the frame buffer configuration's X visual is of type DirectColor */ #if TARGET_HOST_UNIX_X11 #endif break ; - case 28 : /* Unrecognized */ - printf ( "WARNING - Display string token not recognized: %s\n", - token ); + case 35 : /* "borderless": windows should not have borders */ +#if TARGET_HOST_UNIX_X11 +#endif + break ; + + case 36 : /* "aux": some number of aux buffers */ + glut_state_flag |= GLUT_AUX1; + break ; + + case 37 : /* Unrecognized */ + fgWarning ( "WARNING - Display string token not recognized: %s", + token ); break ; } @@ -890,9 +878,7 @@ void FGAPIENTRY glutInitDisplayString( const char* displayMode ) free ( buffer ); - /* - * We will make use of this value when creating a new OpenGL context... - */ + /* We will make use of this value when creating a new OpenGL context... */ fgState.DisplayMode = glut_state_flag; }