X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_init.c;h=9cc6a722b9449f179d0d862d22030e3b0777922d;hb=102d7dff8f914d2e32c099f1bc0db809ef780b5e;hp=d271523964abe1fd407425f54ad2d48c5fc91fa4;hpb=2e8c8e1910a0f5a18c6108174bad31f13af38165;p=freeglut diff --git a/src/freeglut_init.c b/src/freeglut_init.c index d271523..9cc6a72 100644 --- a/src/freeglut_init.c +++ b/src/freeglut_init.c @@ -25,11 +25,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "../include/GL/freeglut.h" +#include #include "freeglut_internal.h" /* @@ -58,24 +54,24 @@ SFG_Display fgDisplay; SFG_State fgState = { { -1, -1, GL_FALSE }, /* Position */ { 300, 300, GL_TRUE }, /* Size */ GLUT_RGBA | GLUT_SINGLE | GLUT_DEPTH, /* DisplayMode */ - GL_FALSE, /* Initalized */ - GL_FALSE, /* ForceDirectContext */ - GL_TRUE, /* TryDirectContext */ + GL_FALSE, /* Initialised */ + GLUT_TRY_DIRECT_CONTEXT, /* DirectContext */ GL_FALSE, /* ForceIconic */ GL_FALSE, /* UseCurrentContext */ GL_FALSE, /* GLDebugSwitch */ GL_FALSE, /* XSyncSwitch */ - GL_TRUE, /* IgnoreKeyRepeat */ + GL_TRUE, /* KeyRepeat */ 0xffffffff, /* Modifiers */ 0, /* FPSInterval */ 0, /* SwapCount */ 0, /* SwapTime */ -#if TARGET_HOST_WIN32 +#if TARGET_HOST_WIN32 || TARGET_HOST_WINCE { 0, GL_FALSE }, /* Time */ #else { { 0, 0 }, GL_FALSE }, #endif { NULL, NULL }, /* Timers */ + { NULL, NULL }, /* FreeTimers */ NULL, /* IdleCallback */ 0, /* ActiveMenus */ NULL, /* MenuStateCallback */ @@ -84,8 +80,9 @@ SFG_State fgState = { { -1, -1, GL_FALSE }, /* Position */ 16, /* GameModeDepth */ 72, /* GameModeRefresh */ GLUT_ACTION_EXIT, /* ActionOnWindowClose */ - GLUT_EXEC_STATE_INIT /* ExecState */ + GLUT_EXEC_STATE_INIT, /* ExecState */ 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,57 +129,60 @@ 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", FALSE ); -#elif TARGET_HOST_WIN32 +#elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE 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, "FREEGLUT", &wc ); + atom = GetClassInfo( fgDisplay.Instance, _T("FREEGLUT"), &wc ); + if( atom == 0 ) { ZeroMemory( &wc, sizeof(WNDCLASS) ); /* - * Each of the windows should have its own device context... + * Each of the windows should have its own device context, and we + * want redraw events during Vertical and Horizontal Resizes by + * the user. + * + * XXX Old code had "| CS_DBCLCKS" commented out. Plans for the + * XXX future? Dead-end idea? */ - wc.style = CS_OWNDC; wc.lpfnWndProc = fgWindowProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = fgDisplay.Instance; - wc.hIcon = LoadIcon( fgDisplay.Instance, "GLUT_ICON" ); + wc.hIcon = LoadIcon( fgDisplay.Instance, _T("GLUT_ICON") ); + +#if TARGET_HOST_WIN32 + 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 ); wc.hbrBackground = NULL; wc.lpszMenuName = NULL; - wc.lpszClassName = "FREEGLUT"; + 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 ); @@ -198,9 +198,7 @@ void fgInitialize( const char* displayName ) #endif - fgJoystickInit( 0 ); - - fgState.Initalized = GL_TRUE; + fgState.Initialised = GL_TRUE; } /* @@ -210,18 +208,14 @@ void fgDeinitialize( void ) { SFG_Timer *timer; - if( !fgState.Initalized ) + if( !fgState.Initialised ) { fgWarning( "fgDeinitialize(): " "no valid initialization has been performed" ); return; } - /* fgState.Initalized = 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 ); @@ -230,15 +224,25 @@ void fgDeinitialize( void ) fgDestroyStructure( ); - while( timer = ( SFG_Timer * )fgState.Timers.First ) + while( ( timer = fgState.Timers.First) ) + { + fgListRemove( &fgState.Timers, &timer->Node ); + free( timer ); + } + + while( ( timer = fgState.FreeTimers.First) ) { - fgListRemove ( &fgState.Timers, &timer->Node ); + fgListRemove( &fgState.FreeTimers, &timer->Node ); free( timer ); } - fgJoystickClose( ); +#if !TARGET_HOST_WINCE + if ( fgState.JoysticksInitialised ) + fgJoystickClose( ); +#endif /* !TARGET_HOST_WINCE */ + fgState.JoysticksInitialised = GL_FALSE; - fgState.Initalized = GL_FALSE; + fgState.Initialised = GL_FALSE; fgState.Position.X = -1; fgState.Position.Y = -1; @@ -250,8 +254,7 @@ void fgDeinitialize( void ) fgState.DisplayMode = GLUT_RGBA | GLUT_SINGLE | GLUT_DEPTH; - fgState.ForceDirectContext = GL_FALSE; - fgState.TryDirectContext = GL_TRUE; + fgState.DirectContext = GLUT_TRY_DIRECT_CONTEXT; fgState.ForceIconic = GL_FALSE; fgState.UseCurrentContext = GL_FALSE; fgState.GLDebugSwitch = GL_FALSE; @@ -259,7 +262,7 @@ void fgDeinitialize( void ) fgState.ActionOnWindowClose = GLUT_ACTION_EXIT; fgState.ExecState = GLUT_EXEC_STATE_INIT; - fgState.IgnoreKeyRepeat = GL_TRUE; + fgState.KeyRepeat = GL_TRUE; fgState.Modifiers = 0xffffffff; fgState.GameModeSize.X = 640; @@ -269,7 +272,9 @@ void fgDeinitialize( void ) fgState.Time.Set = GL_FALSE; - fgState.Timers.First = fgState.Timers.Last = NULL; + fgListInit( &fgState.Timers ); + fgListInit( &fgState.FreeTimers ); + fgState.IdleCallback = NULL; fgState.MenuStateCallback = ( FGCBMenuState )NULL; fgState.MenuStatusCallback = ( FGCBMenuStatus )NULL; @@ -283,7 +288,7 @@ void fgDeinitialize( void ) free( fgState.ProgramName ); fgState.ProgramName = NULL; } - + #if TARGET_HOST_UNIX_X11 @@ -300,13 +305,43 @@ void fgDeinitialize( void ) XCloseDisplay( fgDisplay.Display ); #endif + + fgState.Initialised = GL_FALSE; } /* * Everything inside the following #ifndef is copied from the X sources. */ -#ifndef TARGET_HOST_UNIX_X11 +#if TARGET_HOST_WIN32 || TARGET_HOST_WINCE + +/* + +Copyright 1985, 1986, 1987,1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ #define NoValue 0x0000 #define XValue 0x0001 @@ -326,7 +361,7 @@ void fgDeinitialize( void ) * It returns a bitmask that indicates which of the four values * were actually found in the string. For each value found, * the corresponding argument is updated; for each value - * not found, the corresponding argument is left unchanged. + * not found, the corresponding argument is left unchanged. */ static int @@ -334,7 +369,7 @@ ReadInteger(char *string, char **NextString) { register int Result = 0; int Sign = 1; - + if (*string == '+') string++; else if (*string == '-') @@ -348,13 +383,13 @@ ReadInteger(char *string, char **NextString) } *NextString = string; if (Sign >= 0) - return (Result); + return Result; else - return (-Result); + return -Result; } static int XParseGeometry ( - _Xconst char *string, + const char *string, int *x, int *y, unsigned int *width, /* RETURN */ @@ -366,15 +401,16 @@ static int XParseGeometry ( int tempX = 0, tempY = 0; char *nextCharacter; - if ( (string == NULL) || (*string == '\0')) return(mask); + if ( (string == NULL) || (*string == '\0')) + return mask; if (*string == '=') string++; /* ignore possible '=' at beg of geometry spec */ strind = (char *)string; if (*strind != '+' && *strind != '-' && *strind != 'x') { tempWidth = ReadInteger(strind, &nextCharacter); - if (strind == nextCharacter) - return (0); + if (strind == nextCharacter) + return 0; strind = nextCharacter; mask |= WidthValue; } @@ -383,7 +419,7 @@ static int XParseGeometry ( strind++; tempHeight = ReadInteger(strind, &nextCharacter); if (strind == nextCharacter) - return (0); + return 0; strind = nextCharacter; mask |= HeightValue; } @@ -393,7 +429,7 @@ static int XParseGeometry ( strind++; tempX = -ReadInteger(strind, &nextCharacter); if (strind == nextCharacter) - return (0); + return 0; strind = nextCharacter; mask |= XNegative; } @@ -402,7 +438,7 @@ static int XParseGeometry ( strind++; tempX = ReadInteger(strind, &nextCharacter); if (strind == nextCharacter) - return(0); + return 0; strind = nextCharacter; } mask |= XValue; @@ -411,7 +447,7 @@ static int XParseGeometry ( strind++; tempY = -ReadInteger(strind, &nextCharacter); if (strind == nextCharacter) - return(0); + return 0; strind = nextCharacter; mask |= YNegative; } @@ -420,7 +456,7 @@ static int XParseGeometry ( strind++; tempY = ReadInteger(strind, &nextCharacter); if (strind == nextCharacter) - return(0); + return 0; strind = nextCharacter; } mask |= YValue; @@ -430,7 +466,7 @@ static int XParseGeometry ( /* If strind isn't at the end of the string the it's an invalid geometry specification. */ - if (*strind != '\0') return (0); + if (*strind != '\0') return 0; if (mask & XValue) *x = tempX; @@ -440,7 +476,7 @@ static int XParseGeometry ( *width = tempWidth; if (mask & HeightValue) *height = tempHeight; - return (mask); + return mask; } #endif @@ -456,8 +492,8 @@ void FGAPIENTRY glutInit( int* pargc, char** argv ) char* geometry = NULL; int i, j, argc = *pargc; - if( fgState.Initalized ) - fgError( "illegal glutInit() reinitialization attemp" ); + if( fgState.Initialised ) + fgError( "illegal glutInit() reinitialization attempt" ); if (pargc && *pargc && argv && *argv && **argv) { @@ -472,13 +508,18 @@ void FGAPIENTRY glutInit( int* pargc, char** argv ) fgElapsedTime( ); /* check if GLUT_FPS env var is set */ +#if !TARGET_HOST_WINCE { const char *fps = getenv( "GLUT_FPS" ); if( fps ) { - sscanf( fps, "%d", &fgState.FPSInterval ); - if( fgState.FPSInterval <= 0 ) - fgState.FPSInterval = 5000; /* 5000 milliseconds */ + int interval; + sscanf( fps, "%d", &interval ); + + if( interval <= 0 ) + fgState.FPSInterval = 5000; /* 5000 millisecond default */ + else + fgState.FPSInterval = interval; } } @@ -511,21 +552,21 @@ void FGAPIENTRY glutInit( int* pargc, char** argv ) } else if( strcmp( argv[ i ], "-direct" ) == 0) { - if( ! fgState.TryDirectContext ) + if( fgState.DirectContext == GLUT_FORCE_INDIRECT_CONTEXT ) fgError( "parameters ambiguity, -direct and -indirect " "cannot be both specified" ); - fgState.ForceDirectContext = GL_TRUE; + fgState.DirectContext = GLUT_FORCE_DIRECT_CONTEXT; argv[ i ] = NULL; ( *pargc )--; } else if( strcmp( argv[ i ], "-indirect" ) == 0 ) { - if( fgState.ForceDirectContext ) + if( fgState.DirectContext == GLUT_FORCE_DIRECT_CONTEXT ) fgError( "parameters ambiguity, -direct and -indirect " "cannot be both specified" ); - fgState.TryDirectContext = GL_FALSE; + fgState.DirectContext = GLUT_FORCE_INDIRECT_CONTEXT; argv[ i ] = NULL; (*pargc)--; } @@ -549,33 +590,24 @@ 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 */ + /* - * Have the display created now. As I am too lazy to implement - * the program arguments parsing, we will have the DISPLAY - * environment variable used for opening the X display: - * - * XXX The above comment is rather unclear. We have just - * XXX completed parsing of the program arguments for GLUT - * XXX parameters. We obviously canNOT parse the application- - * XXX specific parameters. Can someone re-write the above - * XXX more clearly? + * Have the display created now. If there wasn't a "-display" + * 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 @@ -584,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; @@ -635,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 ) @@ -671,21 +698,19 @@ void FGAPIENTRY glutInitDisplayString( const char* displayMode ) * delimited by blanks or tabs. */ char *token ; - int len = strlen ( displayMode ) ; - char *buffer = (char *)malloc ( (len+1) * sizeof(char) ) ; - memcpy ( buffer, displayMode, len ) ; - buffer[len] = '\0' ; + int len = strlen ( displayMode ); + char *buffer = (char *)malloc ( (len+1) * sizeof(char) ); + memcpy ( buffer, displayMode, len ); + buffer[len] = '\0'; - token = strtok ( buffer, " \t" ) ; + 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 ) @@ -779,67 +804,81 @@ 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 ; } - token = strtok ( NULL, " \t" ) ; + token = strtok ( NULL, " \t" ); } - free ( buffer ) ; + 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; }