4 * Various freeglut initialization functions.
6 * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
7 * Written by Pawel W. Olszta, <olszta@sourceforge.net>
8 * Creation date: Thu Dec 2 1999
10 * Permission is hereby granted, free of charge, to any person obtaining a
11 * copy of this software and associated documentation files (the "Software"),
12 * to deal in the Software without restriction, including without limitation
13 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
14 * and/or sell copies of the Software, and to permit persons to whom the
15 * Software is furnished to do so, subject to the following conditions:
17 * The above copyright notice and this permission notice shall be included
18 * in all copies or substantial portions of the Software.
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
21 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23 * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
24 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
25 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 #include "../include/GL/freeglut.h"
33 #include "freeglut_internal.h"
36 * TODO BEFORE THE STABLE RELEASE:
38 * fgDeinitialize() -- Win32's OK, X11 needs the OS-specific
39 * deinitialization done
40 * glutInitDisplayString() -- display mode string parsing
42 * Wouldn't it be cool to use gettext() for error messages? I just love
43 * bash saying "nie znaleziono pliku" instead of "file not found" :)
44 * Is gettext easily portable?
47 /* -- GLOBAL VARIABLES ----------------------------------------------------- */
50 * A structure pointed by g_pDisplay holds all information
51 * regarding the display, screen, root window etc.
53 SFG_Display fgDisplay;
56 * The settings for the current freeglut session
58 SFG_State fgState = { { -1, -1, GL_FALSE }, /* Position */
59 { 300, 300, GL_TRUE }, /* Size */
60 GLUT_RGBA | GLUT_SINGLE | GLUT_DEPTH, /* DisplayMode */
61 GL_FALSE, /* Initalized */
62 GL_FALSE, /* ForceDirectContext */
63 GL_TRUE, /* TryDirectContext */
64 GL_FALSE, /* ForceIconic */
65 GL_FALSE, /* UseCurrentContext */
66 GL_FALSE, /* GLDebugSwitch */
67 GL_FALSE, /* XSyncSwitch */
68 GL_TRUE, /* IgnoreKeyRepeat */
73 { 0, GL_FALSE }, /* Time */
75 { { 0, 0 }, GL_FALSE },
77 { NULL, NULL }, /* Timers */
78 NULL, /* IdleCallback */
80 NULL, /* MenuStateCallback */
81 NULL, /* MenuStatusCallback */
82 { 640, 480, GL_TRUE }, /* GameModeSize */
83 16, /* GameModeDepth */
84 72, /* GameModeRefresh */
85 GLUT_ACTION_EXIT, /* ActionOnWindowClose */
86 GLUT_EXEC_STATE_INIT /* ExecState */
90 /* -- PRIVATE FUNCTIONS ---------------------------------------------------- */
93 * A call to this function should initialize all the display stuff...
95 void fgInitialize( const char* displayName )
97 #if TARGET_HOST_UNIX_X11
98 fgDisplay.Display = XOpenDisplay( displayName );
100 if( fgDisplay.Display == NULL )
101 fgError( "failed to open display '%s'", XDisplayName( displayName ) );
103 if( !glXQueryExtension( fgDisplay.Display, NULL, NULL ) )
104 fgError( "OpenGL GLX extension not supported by display '%s'",
105 XDisplayName( displayName ) );
107 fgDisplay.Screen = DefaultScreen( fgDisplay.Display );
108 fgDisplay.RootWindow = RootWindow(
113 fgDisplay.ScreenWidth = DisplayWidth(
117 fgDisplay.ScreenHeight = DisplayHeight(
122 fgDisplay.ScreenWidthMM = DisplayWidthMM(
126 fgDisplay.ScreenHeightMM = DisplayHeightMM(
131 fgDisplay.Connection = ConnectionNumber( fgDisplay.Display );
134 * Create the window deletion atom
136 fgDisplay.DeleteWindow = XInternAtom(
142 #elif TARGET_HOST_WIN32
148 * What we need to do is to initialize the fgDisplay global structure here...
150 fgDisplay.Instance = GetModuleHandle( NULL );
152 atom = GetClassInfo( fgDisplay.Instance, "FREEGLUT", &wc );
155 ZeroMemory( &wc, sizeof(WNDCLASS) );
158 * Each of the windows should have its own device context...
161 wc.lpfnWndProc = fgWindowProc;
164 wc.hInstance = fgDisplay.Instance;
165 wc.hIcon = LoadIcon( fgDisplay.Instance, "GLUT_ICON" );
167 wc.hIcon = LoadIcon( NULL, IDI_WINLOGO );
169 wc.hCursor = LoadCursor( NULL, IDC_ARROW );
170 wc.hbrBackground = NULL;
171 wc.lpszMenuName = NULL;
172 wc.lpszClassName = "FREEGLUT";
175 * Register the window class
177 atom = RegisterClass( &wc );
182 * The screen dimensions can be obtained via GetSystemMetrics() calls
184 fgDisplay.ScreenWidth = GetSystemMetrics( SM_CXSCREEN );
185 fgDisplay.ScreenHeight = GetSystemMetrics( SM_CYSCREEN );
188 HWND desktop = GetDesktopWindow( );
189 HDC context = GetDC( desktop );
191 fgDisplay.ScreenWidthMM = GetDeviceCaps( context, HORZSIZE );
192 fgDisplay.ScreenHeightMM = GetDeviceCaps( context, VERTSIZE );
194 ReleaseDC( desktop, context );
201 fgState.Initalized = GL_TRUE;
205 * Perform the freeglut deinitialization...
207 void fgDeinitialize( void )
211 if( !fgState.Initalized )
213 fgWarning( "fgDeinitialize(): "
214 "no valid initialization has been performed" );
218 /* fgState.Initalized = GL_FALSE; */
221 * If there was a menu created, destroy the rendering context
223 if( fgStructure.MenuContext )
225 free( fgStructure.MenuContext );
226 fgStructure.MenuContext = NULL;
229 fgDestroyStructure( );
231 while( timer = ( SFG_Timer * )fgState.Timers.First )
233 fgListRemove ( &fgState.Timers, &timer->Node );
239 fgState.Initalized = GL_FALSE;
241 fgState.Position.X = -1;
242 fgState.Position.Y = -1;
243 fgState.Position.Use = GL_FALSE;
245 fgState.Size.X = 300;
246 fgState.Size.Y = 300;
247 fgState.Size.Use = GL_TRUE;
249 fgState.DisplayMode = GLUT_RGBA | GLUT_SINGLE | GLUT_DEPTH;
251 fgState.ForceDirectContext = GL_FALSE;
252 fgState.TryDirectContext = GL_TRUE;
253 fgState.ForceIconic = GL_FALSE;
254 fgState.UseCurrentContext = GL_FALSE;
255 fgState.GLDebugSwitch = GL_FALSE;
256 fgState.XSyncSwitch = GL_FALSE;
257 fgState.ActionOnWindowClose = GLUT_ACTION_EXIT ;
258 fgState.ExecState = GLUT_EXEC_STATE_INIT ;
260 fgState.IgnoreKeyRepeat = GL_TRUE;
262 fgState.GameModeSize.X = 640;
263 fgState.GameModeSize.Y = 480;
264 fgState.GameModeDepth = 16;
265 fgState.GameModeRefresh = 72;
267 fgState.Time.Set = GL_FALSE;
269 fgState.Timers.First = fgState.Timers.Last = NULL;
270 fgState.IdleCallback = NULL;
271 fgState.MenuStateCallback = ( FGCBMenuState )NULL;
272 fgState.MenuStatusCallback = ( FGCBMenuStatus )NULL;
274 fgState.SwapCount = 0;
275 fgState.SwapTime = 0;
276 fgState.FPSInterval = 0;
278 if( fgState.ProgramName )
280 free( fgState.ProgramName );
281 fgState.ProgramName = NULL;
285 #if TARGET_HOST_UNIX_X11
288 * Make sure all X-client data we have created will be destroyed on
291 XSetCloseDownMode( fgDisplay.Display, DestroyAll );
294 * Close the display connection, destroying all windows we have
297 XCloseDisplay( fgDisplay.Display );
303 /* -- INTERFACE FUNCTIONS -------------------------------------------------- */
306 * Perform initialization. This usually happens on the program startup
307 * and restarting after glutMainLoop termination...
309 void FGAPIENTRY glutInit( int* pargc, char** argv )
311 char* displayName = NULL;
312 int i, j, argc = *pargc;
314 if (pargc && *pargc && argv && *argv && **argv)
315 fgState.ProgramName = strdup (*argv);
317 fgState.ProgramName = strdup ("");
318 if( !fgState.ProgramName )
319 fgError ("Could not allocate space for the program's name.");
321 if( fgState.Initalized )
322 fgError( "illegal glutInit() reinitialization attemp" );
324 fgCreateStructure( );
328 /* check if GLUT_FPS env var is set */
330 const char *fps = getenv( "GLUT_FPS" );
333 sscanf( fps, "%d", &fgState.FPSInterval );
334 if( fgState.FPSInterval <= 0 )
335 fgState.FPSInterval = 5000; /* 5000 milliseconds */
339 #if TARGET_HOST_WIN32
340 if( !getenv( "DISPLAY" ) )
341 displayName = strdup( "" );
344 displayName = strdup( getenv( "DISPLAY" ) );
346 fgError( "Could not allocate space for display name." );
348 for( i = 1; i < argc; i++ )
350 if( strcmp( argv[ i ], "-display" ) == 0 )
353 fgError( "-display parameter must be followed by display name" );
357 displayName = strdup( argv[ i ] );
359 fgError( "Could not allocate space for display name (%s)",
362 argv[ i - 1 ] = NULL;
366 else if( strcmp( argv[ i ], "-geometry" ) == 0 )
372 fgError( "-geometry parameter must be followed by window "
373 "geometry settings" );
374 result = sscanf( argv[ i ], "%dx%d+%d+%d", &x, &y, &w, &h );
385 fgDisplay.ScreenHeight + y - fgState.Size.Y;
387 fgState.Position.Y = y;
394 fgDisplay.ScreenWidth + x - fgState.Size.X;
396 fgState.Position.X = x;
399 argv[ i - 1 ] = NULL;
403 else if( strcmp( argv[ i ], "-direct" ) == 0)
405 if( ! fgState.TryDirectContext )
406 fgError( "parameters ambiguity, -direct and -indirect "
407 "cannot be both specified" );
409 fgState.ForceDirectContext = GL_TRUE;
413 else if( strcmp( argv[ i ], "-indirect" ) == 0 )
415 if( fgState.ForceDirectContext )
416 fgError( "parameters ambiguity, -direct and -indirect "
417 "cannot be both specified" );
419 fgState.TryDirectContext = GL_FALSE;
423 else if( strcmp( argv[ i ], "-iconic" ) == 0 )
425 fgState.ForceIconic = GL_TRUE;
429 else if( strcmp( argv[ i ], "-gldebug" ) == 0 )
431 fgState.GLDebugSwitch = GL_TRUE;
435 else if( strcmp( argv[ i ], "-sync" ) == 0 )
437 fgState.XSyncSwitch = GL_TRUE;
447 for( i = 1; i < *pargc; i++, j++ )
449 if( argv[ i ] == NULL )
451 /* Guaranteed to end because there are "*pargc" arguments left */
452 while ( argv[ j ] == NULL )
454 argv[ i ] = argv[ j ] ;
459 * Have the display created now. As I am too lazy to implement
460 * the program arguments parsing, we will have the DISPLAY
461 * environment variable used for opening the X display:
463 * XXX The above comment is rather unclear. We have just
464 * XXX completed parsing of the program arguments for GLUT
465 * XXX parameters. We obviously canNOT parse the application-
466 * XXX specific parameters. Can someone re-write the above
469 fgInitialize( displayName );
472 * Check for the minus one settings for both position and size...
474 if( fgState.Position.X < 0 || fgState.Position.Y < 0 )
475 fgState.Position.Use = GL_FALSE;
477 if( fgState.Size.X < 0 || fgState.Size.Y < 0 )
478 fgState.Size.Use = GL_FALSE;
485 * Sets the default initial window position for new windows
487 void FGAPIENTRY glutInitWindowPosition( int x, int y )
489 if( ( x >= 0 ) && ( y >= 0 ) )
491 fgState.Position.X = x;
492 fgState.Position.Y = y;
493 fgState.Position.Use = GL_TRUE;
497 fgState.Position.X = -1;
498 fgState.Position.Y = -1;
499 fgState.Position.Use = GL_FALSE;
504 * Sets the default initial window size for new windows
506 void FGAPIENTRY glutInitWindowSize( int width, int height )
508 if( ( width > 0 ) && ( height > 0 ) )
510 fgState.Size.X = width;
511 fgState.Size.Y = height;
512 fgState.Size.Use = GL_TRUE;
518 fgState.Size.Use = GL_FALSE;
523 * Sets the default display mode for all new windows
525 void FGAPIENTRY glutInitDisplayMode( unsigned int displayMode )
528 * We will make use of this value when creating a new OpenGL context...
530 fgState.DisplayMode = displayMode;
534 /* -- INIT DISPLAY STRING PARSING ------------------------------------------ */
536 #if 0 /* FIXME: CJP */
538 * There is a discrete number of comparison operators we can encounter:
540 * comparison ::= "=" | "!=" | "<" | ">" | "<=" | ">=" | "~"
542 #define FG_NONE 0x0000
543 #define FG_EQUAL 0x0001
544 #define FG_NOT_EQUAL 0x0002
545 #define FG_LESS 0x0003
546 #define FG_MORE 0x0004
547 #define FG_LESS_OR_EQUAL 0x0005
548 #define FG_MORE_OR_EQUAL 0x0006
549 #define FG_CLOSEST 0x0007
552 * The caller can feed us with a number of capability tokens:
554 * capability ::= "alpha" | "acca" | "acc" | "blue" | "buffer" | "conformant" | "depth" | "double" |
555 * "green" | "index" | "num" | "red" | "rgba" | "rgb" | "luminance" | "stencil" |
556 * "single" | "stereo" | "samples" | "slow" | "win32pdf" | "xvisual" | "xstaticgray" |
557 * "xgrayscale" | "xstaticcolor" | "xpseudocolor" | "xtruecolor" | "xdirectcolor"
559 static gchar* g_Tokens[] =
561 "none", "alpha", "acca", "acc", "blue", "buffer", "conformant", "depth", "double", "green",
562 "index", "num", "red", "rgba", "rgb", "luminance", "stencil", "single", "stereo", "samples",
563 "slow", "win32pdf", "xvisual", "xstaticgray", "xgrayscale", "xstaticcolor", "xpseudocolor",
564 "xtruecolor", "xdirectcolor", NULL
568 * The structure to hold the parsed display string tokens
570 typedef struct tagSFG_Capability SFG_Capability;
571 struct tagSFG_Capability
573 gint capability; /* the capability token enumerator */
574 gint comparison; /* the comparison operator used */
575 gint value; /* the value we're comparing to */
579 * The scanner configuration for the init display string
581 static GScannerConfig fgInitDisplayStringScannerConfig =
583 ( " \t\r\n" ) /* cset_skip_characters */,
588 ) /* cset_identifier_first */,
596 ) /* cset_identifier_nth */,
597 ( "#\n" ) /* cpair_comment_single */,
598 FALSE /* case_sensitive */,
599 TRUE /* skip_comment_multi */,
600 TRUE /* skip_comment_single */,
601 TRUE /* scan_comment_multi */,
602 TRUE /* scan_identifier */,
603 FALSE /* scan_identifier_1char */,
604 FALSE /* scan_identifier_NULL */,
605 TRUE /* scan_symbols */,
606 FALSE /* scan_binary */,
607 TRUE /* scan_octal */,
608 TRUE /* scan_float */,
610 FALSE /* scan_hex_dollar */,
611 TRUE /* scan_string_sq */,
612 TRUE /* scan_string_dq */,
613 TRUE /* numbers_2_int */,
614 FALSE /* int_2_float */,
615 FALSE /* identifier_2_string */,
616 TRUE /* char_2_token */,
617 FALSE /* symbol_2_token */,
618 FALSE /* scope_0_fallback */,
622 * Sets the default display mode for all new windows using a string
624 void FGAPIENTRY glutInitDisplayString( char* displayMode )
627 * display_string ::= (switch)
628 * switch ::= capability [comparison value]
629 * comparison ::= "=" | "!=" | "<" | ">" | "<=" | ">=" | "~"
630 * capability ::= "alpha" | "acca" | "acc" | "blue" | "buffer" | "conformant" |
631 * "depth" | "double" | "green" | "index" | "num" | "red" | "rgba" |
632 * "rgb" | "luminance" | "stencil" | "single" | "stereo" |
633 * "samples" | "slow" | "win32pdf" | "xvisual" | "xstaticgray" |
634 * "xgrayscale" | "xstaticcolor" | "xpseudocolor" |
635 * "xtruecolor" | "xdirectcolor"
636 * value ::= 0..9 [value]
638 * The display string grammar. This should be EBNF, but I couldn't find the definitions so, to
639 * clarify: (expr) means 0 or more times the expression, [expr] means 0 or 1 times expr.
641 * Create a new GLib lexical analyzer to process the display mode string
643 GScanner* scanner = g_scanner_new( &fgInitDisplayStringScannerConfig );
648 * Fail if the display mode string is empty or the scanner failed to initialize
650 freeglut_return_if_fail( (scanner != NULL) && (strlen( displayMode ) > 0) );
653 * Set the scanner's input name (for debugging)
655 scanner->input_name = "glutInitDisplayString";
658 * Start the lexical analysis of the extensions string
660 g_scanner_input_text( scanner, displayMode, strlen( displayMode ) );
663 * While there are any more tokens to be checked...
665 while( !g_scanner_eof( scanner ) )
668 * Actually we're expecting only string tokens
670 GTokenType tokenType = g_scanner_get_next_token( scanner );
673 * We are looking for identifiers
675 if( tokenType == G_TOKEN_IDENTIFIER )
677 gchar* capability = NULL; /* the capability identifier string (always present) */
678 gint capID = 0; /* the capability identifier value (from g_Tokens) */
679 gint comparison = 0; /* the comparison operator value, see definitions */
680 gchar* valueString = NULL; /* if the previous one is present, this is needed */
681 gint value = 0; /* the integer value converted using a strtol call */
682 SFG_Capability* capStruct; /* the capability description structure */
685 * OK. The general rule of thumb that we always should be getting a capability identifier
686 * string (see the grammar description). If it is followed by a comparison identifier, then
687 * there must follow an integer value we're comparing the capability to...
689 * Have the current token analyzed with that in mind...
691 for( i=0; i<(gint) strlen( scanner->value.v_identifier ); i++ )
693 gchar c = scanner->value.v_identifier[ i ];
695 if( (c == '=') || (c == '!') || (c == '<') || (c == '>') || (c == '~') )
700 * Here we go with the length of the capability identifier string.
701 * In the worst of cases, it is as long as the token identifier.
703 capability = g_strndup( scanner->value.v_identifier, i );
706 * OK. Is there a chance for comparison and value identifiers to follow?
707 * Note: checking against i+1 as this handles two cases: single character
708 * comparison operator and first of value's digits, which must always be
709 * there, or the two-character comparison operators.
711 if( (i + 1) < (gint) strlen( scanner->value.v_identifier ) )
714 * Yeah, indeed, it is the i-th character to start the identifier, then.
716 gchar c1 = scanner->value.v_identifier[ i + 0 ];
717 gchar c2 = scanner->value.v_identifier[ i + 1 ];
719 if( (c1 == '=') ) { i += 1; comparison = FG_EQUAL; } else
720 if( (c1 == '!') && (c2 == '=') ) { i += 2; comparison = FG_NOT_EQUAL; } else
721 if( (c1 == '<') && (c2 == '=') ) { i += 2; comparison = FG_LESS_OR_EQUAL; } else
722 if( (c1 == '>') && (c2 == '=') ) { i += 2; comparison = FG_MORE_OR_EQUAL; } else
723 if( (c1 == '<') ) { i += 1; comparison = FG_LESS; } else
724 if( (c1 == '>') ) { i += 1; comparison = FG_MORE; } else
725 if( (c1 == '~') ) { i += 1; comparison = FG_CLOSEST; } else
726 g_warning( "invalid comparison operator in token `%s'", scanner->value.v_identifier );
730 * Grab the value string that must follow the comparison operator...
732 if( comparison != FG_NONE && i < (gint) strlen( scanner->value.v_identifier ) )
734 valueString = strdup( scanner->value.v_identifier + i );
736 fgError ("Could not allocate an internal string.");
740 * If there was a value string, convert it to integer...
742 if( comparison != FG_NONE && strlen( valueString ) > 0 )
743 value = strtol( valueString, NULL, 0 );
746 * Now we need to match the capability string and its ID
748 for( i=0; g_Tokens[ i ]!=NULL; i++ )
750 if( strcmp( capability, g_Tokens[ i ] ) == 0 )
753 * Looks like we've found the one we were looking for
761 * Create a new capability description structure
763 capStruct = g_new0( SFG_Capability, 1 );
766 * Fill in the cap's values, as we have parsed it:
768 capStruct->capability = capID;
769 capStruct->comparison = comparison;
770 capStruct->value = value;
773 * Add the new capabaility to the caps list
775 caps = g_list_append( caps, capStruct );
778 * Clean up the local mess and keep rolling on
780 g_free( valueString );
781 g_free( capability );
786 * Now that we have converted the string into somewhat more machine-friendly
787 * form, proceed with matching the frame buffer configuration...
789 * The caps list could be passed to a function that would try finding the closest
790 * matching pixel format, visual, frame buffer configuration or whatever. It would
791 * be good to convert the glutInitDisplayMode() to use the same method.
794 g_message( "found %i capability preferences", g_list_length( caps ) );
796 g_message( "token `%s': cap: %i, com: %i, val: %i",
797 scanner->value.v_identifier,
798 capStruct->capability,
799 capStruct->comparison,
805 * Free the capabilities we have parsed
807 for( i=0; i<(gint) g_list_length( caps ); i++ )
808 g_free( g_list_nth( caps, i )->data );
811 * Destroy the capabilities list itself
816 * Free the lexical scanner now...
818 g_scanner_destroy( scanner );
822 #define NUM_TOKENS 28
823 static char* Tokens[] =
825 "alpha", "acca", "acc", "blue", "buffer", "conformant", "depth", "double", "green",
826 "index", "num", "red", "rgba", "rgb", "luminance", "stencil", "single", "stereo", "samples",
827 "slow", "win32pdf", "xvisual", "xstaticgray", "xgrayscale", "xstaticcolor", "xpseudocolor",
828 "xtruecolor", "xdirectcolor"
831 static int TokenLengths[] =
833 5, 4, 3, 4, 6, 10, 5, 6, 5,
834 5, 3, 3, 4, 3, 9, 7, 6, 6, 7,
835 4, 8, 7, 11, 10, 12, 12,
839 void FGAPIENTRY glutInitDisplayString( const char* displayMode )
841 int glut_state_flag = 0 ;
843 * Unpack a lot of options from a character string. The options are delimited by blanks or tabs.
846 int len = strlen ( displayMode ) ;
847 char *buffer = (char *)malloc ( (len+1) * sizeof(char) ) ;
848 memcpy ( buffer, displayMode, len ) ;
851 token = strtok ( buffer, " \t" ) ;
858 for ( i = 0; i < NUM_TOKENS; i++ )
860 if ( strncmp ( token, Tokens[i], TokenLengths[i] ) == 0 ) break ;
865 case 0 : /* "alpha": Alpha color buffer precision in bits */
866 glut_state_flag |= GLUT_ALPHA ; /* Somebody fix this for me! */
869 case 1 : /* "acca": Red, green, blue, and alpha accumulation buffer precision in bits */
872 case 2 : /* "acc": Red, green, and blue accumulation buffer precision in bits with zero bits alpha */
873 glut_state_flag |= GLUT_ACCUM ; /* Somebody fix this for me! */
876 case 3 : /* "blue": Blue color buffer precision in bits */
879 case 4 : /* "buffer": Number of bits in the color index color buffer */
882 case 5 : /* "conformant": Boolean indicating if the frame buffer configuration is conformant or not */
885 case 6 : /* "depth": Number of bits of precsion in the depth buffer */
886 glut_state_flag |= GLUT_DEPTH ; /* Somebody fix this for me! */
889 case 7 : /* "double": Boolean indicating if the color buffer is double buffered */
890 glut_state_flag |= GLUT_DOUBLE ;
893 case 8 : /* "green": Green color buffer precision in bits */
896 case 9 : /* "index": Boolean if the color model is color index or not */
897 glut_state_flag |= GLUT_INDEX ;
900 case 10 : /* "num": A special capability name indicating where the value represents the Nth frame buffer configuration matching the description string */
903 case 11 : /* "red": Red color buffer precision in bits */
906 case 12 : /* "rgba": Number of bits of red, green, blue, and alpha in the RGBA color buffer */
907 glut_state_flag |= GLUT_RGBA ; /* Somebody fix this for me! */
910 case 13 : /* "rgb": Number of bits of red, green, and blue in the RGBA color buffer with zero bits alpha */
911 glut_state_flag |= GLUT_RGB ; /* Somebody fix this for me! */
914 case 14 : /* "luminance": Number of bits of red in the RGBA and zero bits of green, blue (alpha not specified) of color buffer precision */
915 glut_state_flag |= GLUT_LUMINANCE ; /* Somebody fix this for me! */
918 case 15 : /* "stencil": Number of bits in the stencil buffer */
919 glut_state_flag |= GLUT_STENCIL ; /* Somebody fix this for me! */
922 case 16 : /* "single": Boolean indicate the color buffer is single buffered */
923 glut_state_flag |= GLUT_SINGLE ;
926 case 17 : /* "stereo": Boolean indicating the color buffer supports OpenGL-style stereo */
927 glut_state_flag |= GLUT_STEREO ;
930 case 18 : /* "samples": Indicates the number of multisamples to use based on GLX's SGIS_multisample extension (for antialiasing) */
931 glut_state_flag |= GLUT_MULTISAMPLE ; /* Somebody fix this for me! */
934 case 19 : /* "slow": Boolean indicating if the frame buffer configuration is slow or not */
937 case 20 : /* "win32pdf": matches the Win32 Pixel Format Descriptor by number */
938 #if TARGET_HOST_WIN32
942 case 21 : /* "xvisual": matches the X visual ID by number */
943 #if TARGET_HOST_UNIX_X11
947 case 22 : /* "xstaticgray": boolean indicating if the frame buffer configuration's X visual is of type StaticGray */
948 #if TARGET_HOST_UNIX_X11
952 case 23 : /* "xgrayscale": boolean indicating if the frame buffer configuration's X visual is of type GrayScale */
953 #if TARGET_HOST_UNIX_X11
957 case 24 : /* "xstaticcolor": boolean indicating if the frame buffer configuration's X visual is of type StaticColor */
958 #if TARGET_HOST_UNIX_X11
962 case 25 : /* "xpseudocolor": boolean indicating if the frame buffer configuration's X visual is of type PseudoColor */
963 #if TARGET_HOST_UNIX_X11
967 case 26 : /* "xtruecolor": boolean indicating if the frame buffer configuration's X visual is of type TrueColor */
968 #if TARGET_HOST_UNIX_X11
972 case 27 : /* "xdirectcolor": boolean indicating if the frame buffer configuration's X visual is of type DirectColor */
973 #if TARGET_HOST_UNIX_X11
977 case 28 : /* Unrecognized */
978 printf ( "WARNING - Display string token not recognized: %s\n", token ) ;
982 token = strtok ( NULL, " \t" ) ;
988 * We will make use of this value when creating a new OpenGL context...
990 fgState.DisplayMode = glut_state_flag;
993 /*** END OF FILE ***/