X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_init.c;h=fbf906508c9923b2c7af92a46ed61226875756ac;hb=7fdce1253e14170b6cb933f13c1f2a1644c93793;hp=7b49169a7f5cb221eca28b13a0dc6d2bde4c27c6;hpb=191f167c1b44679707028d96aae8a2d67fecce30;p=freeglut diff --git a/src/freeglut_init.c b/src/freeglut_init.c index 7b49169..fbf9065 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" @@ -64,12 +60,12 @@ SFG_State fgState = { { -1, -1, GL_FALSE }, /* Position */ GL_FALSE, /* UseCurrentContext */ GL_FALSE, /* GLDebugSwitch */ GL_FALSE, /* XSyncSwitch */ - GL_TRUE, /* KeyRepeat */ - 0xffffffff, /* Modifiers */ + GLUT_KEY_REPEAT_ON, /* KeyRepeat */ + INVALID_MODIFIERS, /* Modifiers */ 0, /* FPSInterval */ 0, /* SwapCount */ 0, /* SwapTime */ -#if TARGET_HOST_WIN32 || TARGET_HOST_WINCE +#if TARGET_HOST_MS_WINDOWS { 0, GL_FALSE }, /* Time */ #else { { 0, 0 }, GL_FALSE }, @@ -86,7 +82,8 @@ SFG_State fgState = { { -1, -1, GL_FALSE }, /* Position */ GLUT_ACTION_EXIT, /* ActionOnWindowClose */ GLUT_EXEC_STATE_INIT, /* ExecState */ NULL, /* ProgramName */ - GL_FALSE /* JoysticksInitialised */ + GL_FALSE, /* JoysticksInitialised */ + GL_FALSE /* InputDevsInitialised */ }; @@ -97,7 +94,7 @@ SFG_State fgState = { { -1, -1, GL_FALSE }, /* Position */ */ static void fghInitialize( const char* displayName ) { -#if TARGET_HOST_UNIX_X11 +#if TARGET_HOST_POSIX_X11 fgDisplay.Display = XOpenDisplay( displayName ); if( fgDisplay.Display == NULL ) @@ -140,7 +137,7 @@ static void fghInitialize( const char* displayName ) FALSE ); -#elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE +#elif TARGET_HOST_MS_WINDOWS WNDCLASS wc; ATOM atom; @@ -168,12 +165,12 @@ static void fghInitialize( const char* displayName ) wc.hInstance = fgDisplay.Instance; wc.hIcon = LoadIcon( fgDisplay.Instance, _T("GLUT_ICON") ); -#if TARGET_HOST_WIN32 +#if defined(_WIN32_WCE) + wc.style = CS_HREDRAW | CS_VREDRAW; +#else wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW; if (!wc.hIcon) wc.hIcon = LoadIcon( NULL, IDI_WINLOGO ); -#else /* TARGET_HOST_WINCE */ - wc.style = CS_HREDRAW | CS_VREDRAW; #endif wc.hCursor = LoadCursor( NULL, IDC_ARROW ); @@ -183,7 +180,7 @@ static void fghInitialize( const char* displayName ) /* 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 */ @@ -200,9 +197,15 @@ static void fghInitialize( const char* displayName ) ReleaseDC( desktop, context ); } + /* Set the timer granularity to 1 ms */ + timeBeginPeriod ( 1 ); + #endif fgState.Initialised = GL_TRUE; + + /* InputDevice uses GlutTimerFunc(), so fgState.Initialised must be TRUE */ + fgInitialiseInputDevices(); } /* @@ -219,34 +222,40 @@ void fgDeinitialize( void ) return; } - /* fgState.Initialised = GL_FALSE; */ - /* If there was a menu created, destroy the rendering context */ if( fgStructure.MenuContext ) { +#if TARGET_HOST_POSIX_X11 + /* Note that the MVisualInfo is not owned by the MenuContext! */ + glXDestroyContext( fgDisplay.Display, fgStructure.MenuContext->MContext ); +#endif free( fgStructure.MenuContext ); fgStructure.MenuContext = NULL; } 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 +#if !defined(_WIN32_WCE) if ( fgState.JoysticksInitialised ) fgJoystickClose( ); -#endif /* !TARGET_HOST_WINCE */ + + if ( fgState.InputDevsInitialised ) + fgInputDeviceClose( ); +#endif /* !defined(_WIN32_WCE) */ fgState.JoysticksInitialised = GL_FALSE; + fgState.InputDevsInitialised = GL_FALSE; fgState.Initialised = GL_FALSE; @@ -268,8 +277,8 @@ void fgDeinitialize( void ) fgState.ActionOnWindowClose = GLUT_ACTION_EXIT; fgState.ExecState = GLUT_EXEC_STATE_INIT; - fgState.KeyRepeat = GL_FALSE; - fgState.Modifiers = 0xffffffff; + fgState.KeyRepeat = GLUT_KEY_REPEAT_ON; + fgState.Modifiers = INVALID_MODIFIERS; fgState.GameModeSize.X = 640; fgState.GameModeSize.Y = 480; @@ -295,8 +304,7 @@ void fgDeinitialize( void ) fgState.ProgramName = NULL; } - -#if TARGET_HOST_UNIX_X11 +#if TARGET_HOST_POSIX_X11 /* * Make sure all X-client data we have created will be destroyed on @@ -310,14 +318,21 @@ void fgDeinitialize( void ) */ XCloseDisplay( fgDisplay.Display ); +#elif TARGET_HOST_MS_WINDOWS + + /* Reset the timer granularity */ + timeEndPeriod ( 1 ); + #endif + + fgState.Initialised = GL_FALSE; } /* * Everything inside the following #ifndef is copied from the X sources. */ -#if TARGET_HOST_WIN32 || TARGET_HOST_WINCE +#if TARGET_HOST_MS_WINDOWS /* @@ -512,7 +527,7 @@ void FGAPIENTRY glutInit( int* pargc, char** argv ) fgElapsedTime( ); /* check if GLUT_FPS env var is set */ -#if !TARGET_HOST_WINCE +#ifndef _WIN32_WCE { const char *fps = getenv( "GLUT_FPS" ); if( fps ) @@ -594,20 +609,17 @@ void FGAPIENTRY glutInit( int* pargc, char** argv ) } } - /* - * Compact {argv}. - */ - j = 1; - for( i = 1; i < *pargc; i++, j++ ) + /* Compact {argv}. */ + for( i = j = 1; i < *pargc; i++, j++ ) { /* Guaranteed to end because there are "*pargc" arguments left */ while ( argv[ j ] == NULL ) j++; - if (i != j) + if ( i != j ) argv[ i ] = argv[ j ]; } -#endif /* TARGET_HOST_WINCE */ +#endif /* _WIN32_WCE */ /* * Have the display created now. If there wasn't a "-display" @@ -623,9 +635,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; @@ -681,24 +697,17 @@ void FGAPIENTRY glutInitDisplayMode( unsigned int displayMode ) /* -- INIT DISPLAY STRING PARSING ------------------------------------------ */ -#define NUM_TOKENS 28 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" }; +#define NUM_TOKENS (sizeof(Tokens) / sizeof(*Tokens)) void FGAPIENTRY glutInitDisplayString( const char* displayMode ) { @@ -720,7 +729,7 @@ void FGAPIENTRY glutInitDisplayString( const char* displayMode ) 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 ) @@ -814,54 +823,70 @@ 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 +#if TARGET_HOST_MS_WINDOWS #endif break ; - case 21 : /* "xvisual": matches the X visual ID by number */ -#if TARGET_HOST_UNIX_X11 + case 22 : /* "xvisual": matches the X visual ID by number */ +#if TARGET_HOST_POSIX_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 +#if TARGET_HOST_POSIX_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 +#if TARGET_HOST_POSIX_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 +#if TARGET_HOST_POSIX_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 +#if TARGET_HOST_POSIX_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 +#if TARGET_HOST_POSIX_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 +#if TARGET_HOST_POSIX_X11 +#endif + break ; + + case 35 : /* "borderless": windows should not have borders */ +#if TARGET_HOST_POSIX_X11 #endif break ; - case 28 : /* Unrecognized */ + 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 ;