X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_init.c;h=054285e81ff4568e7fa50cf47f9877f44ac80c3c;hb=30971e75717f3d7b826714fbbb1171dfaf9164cf;hp=9cc6a722b9449f179d0d862d22030e3b0777922d;hpb=102d7dff8f914d2e32c099f1bc0db809ef780b5e;p=freeglut diff --git a/src/freeglut_init.c b/src/freeglut_init.c index 9cc6a72..054285e 100644 --- a/src/freeglut_init.c +++ b/src/freeglut_init.c @@ -60,16 +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 - { 0, GL_FALSE }, /* Time */ -#else - { { 0, 0 }, GL_FALSE }, -#endif + 0, /* Time */ { NULL, NULL }, /* Timers */ { NULL, NULL }, /* FreeTimers */ NULL, /* IdleCallback */ @@ -82,7 +78,10 @@ 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 */ + 0, /* AuxiliaryBufferNumber */ + 0 /* SampleNumber */ }; @@ -93,7 +92,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 ) @@ -136,7 +135,7 @@ static void fghInitialize( const char* displayName ) FALSE ); -#elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE +#elif TARGET_HOST_MS_WINDOWS WNDCLASS wc; ATOM atom; @@ -164,12 +163,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 ); @@ -196,9 +195,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(); } /* @@ -218,6 +223,10 @@ void fgDeinitialize( void ) /* 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; } @@ -236,11 +245,15 @@ void fgDeinitialize( void ) 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; @@ -262,16 +275,14 @@ void fgDeinitialize( void ) fgState.ActionOnWindowClose = GLUT_ACTION_EXIT; fgState.ExecState = GLUT_EXEC_STATE_INIT; - fgState.KeyRepeat = GL_TRUE; - fgState.Modifiers = 0xffffffff; + fgState.KeyRepeat = GLUT_KEY_REPEAT_ON; + fgState.Modifiers = INVALID_MODIFIERS; fgState.GameModeSize.X = 640; fgState.GameModeSize.Y = 480; fgState.GameModeDepth = 16; fgState.GameModeRefresh = 72; - fgState.Time.Set = GL_FALSE; - fgListInit( &fgState.Timers ); fgListInit( &fgState.FreeTimers ); @@ -289,8 +300,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 @@ -304,6 +314,11 @@ void fgDeinitialize( void ) */ XCloseDisplay( fgDisplay.Display ); +#elif TARGET_HOST_MS_WINDOWS + + /* Reset the timer granularity */ + timeEndPeriod ( 1 ); + #endif fgState.Initialised = GL_FALSE; @@ -313,7 +328,7 @@ void fgDeinitialize( void ) * Everything inside the following #ifndef is copied from the X sources. */ -#if TARGET_HOST_WIN32 || TARGET_HOST_WINCE +#if TARGET_HOST_MS_WINDOWS /* @@ -505,10 +520,11 @@ void FGAPIENTRY glutInit( int* pargc, char** argv ) fgCreateStructure( ); - fgElapsedTime( ); + /* Get start time */ + fgState.Time = fgSystemTime(); /* check if GLUT_FPS env var is set */ -#if !TARGET_HOST_WINCE +#ifndef _WIN32_WCE { const char *fps = getenv( "GLUT_FPS" ); if( fps ) @@ -600,7 +616,7 @@ void FGAPIENTRY glutInit( int* pargc, char** argv ) argv[ i ] = argv[ j ]; } -#endif /* TARGET_HOST_WINCE */ +#endif /* _WIN32_WCE */ /* * Have the display created now. If there wasn't a "-display" @@ -639,6 +655,14 @@ void FGAPIENTRY glutInit( int* pargc, char** argv ) } /* + * Undoes all the "glutInit" stuff + */ +void FGAPIENTRY glutExit ( void ) +{ + fgDeinitialize (); +} + +/* * Sets the default initial window position for new windows */ void FGAPIENTRY glutInitWindowPosition( int x, int y ) @@ -678,7 +702,6 @@ void FGAPIENTRY glutInitDisplayMode( unsigned int displayMode ) /* -- INIT DISPLAY STRING PARSING ------------------------------------------ */ -#define NUM_TOKENS 36 static char* Tokens[] = { "alpha", "acca", "acc", "blue", "buffer", "conformant", "depth", "double", @@ -689,6 +712,7 @@ static char* Tokens[] = "xstaticgrey", "xgreyscale", "xstaticcolour", "xpseudocolour", "xtruecolour", "xdirectcolour", "borderless", "aux" }; +#define NUM_TOKENS (sizeof(Tokens) / sizeof(*Tokens)) void FGAPIENTRY glutInitDisplayString( const char* displayMode ) { @@ -698,7 +722,7 @@ void FGAPIENTRY glutInitDisplayString( const char* displayMode ) * delimited by blanks or tabs. */ char *token ; - int len = strlen ( displayMode ); + size_t len = strlen ( displayMode ); char *buffer = (char *)malloc ( (len+1) * sizeof(char) ); memcpy ( buffer, displayMode, len ); buffer[len] = '\0'; @@ -708,9 +732,16 @@ void FGAPIENTRY glutInitDisplayString( const char* displayMode ) { /* Process this token */ int i ; + + /* Temporary fix: Ignore any length specifications and at least + * process the basic token + * TODO: Fix this permanently + */ + size_t cleanlength = strcspn ( token, "=<>~!" ); + for ( i = 0; i < NUM_TOKENS; i++ ) { - if ( strcmp ( token, Tokens[i] ) == 0 ) break ; + if ( strncmp ( token, Tokens[i], cleanlength ) == 0 ) break ; } switch ( i ) @@ -807,64 +838,64 @@ void FGAPIENTRY glutInitDisplayString( const char* displayMode ) 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 22 : /* "xvisual": matches the X visual ID by number */ -#if TARGET_HOST_UNIX_X11 +#if TARGET_HOST_POSIX_X11 #endif break ; 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 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 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 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 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 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_UNIX_X11 +#if TARGET_HOST_POSIX_X11 #endif break ; case 36 : /* "aux": some number of aux buffers */ - glut_state_flag |= GLUT_AUX1; + glut_state_flag |= GLUT_AUX; break ; case 37 : /* Unrecognized */