Fixing Bug Report [ 1160442 ] glutGet(GLUT_ELAPSED_TIME) is too granular
[freeglut] / src / freeglut_init.c
index 7b49169..89e4c43 100644 (file)
  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
 #include <GL/freeglut.h>
 #include "freeglut_internal.h"
 
@@ -183,7 +179,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,6 +196,9 @@ static void fghInitialize( const char* displayName )
         ReleaseDC( desktop, context );
     }
 
+    /* Set the timer granularity to 1 ms */
+    timeBeginPeriod ( 1 );
+
 #endif
 
     fgState.Initialised = GL_TRUE;
@@ -219,8 +218,6 @@ void fgDeinitialize( void )
         return;
     }
 
-    /* fgState.Initialised = GL_FALSE; */
-
     /* If there was a menu created, destroy the rendering context */
     if( fgStructure.MenuContext )
     {
@@ -230,13 +227,13 @@ 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 );
@@ -268,7 +265,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;
@@ -295,7 +292,6 @@ void fgDeinitialize( void )
         fgState.ProgramName = NULL;
     }
 
-
 #if TARGET_HOST_UNIX_X11
 
     /*
@@ -310,7 +306,14 @@ void fgDeinitialize( void )
      */
     XCloseDisplay( fgDisplay.Display );
 
+#elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE
+
+    /* Reset the timer granularity */
+    timeEndPeriod ( 1 );
+
 #endif
+
+    fgState.Initialised = GL_FALSE;
 }
 
 /*
@@ -594,16 +597,13 @@ 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 ];
     }
 
@@ -623,9 +623,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,23 +685,16 @@ void FGAPIENTRY glutInitDisplayMode( unsigned int 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 )
@@ -720,7 +717,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 +811,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
 #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 */
+        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 ;