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 #define G_LOG_DOMAIN "freeglut-init"
34 #include "../include/GL/freeglut.h"
35 #include "freeglut_internal.h"
38 * TODO BEFORE THE STABLE RELEASE:
40 * fgDeinitialize() -- Win32's OK, X11 needs the OS-specific deinitialization done
41 * glutInitDisplayString() -- display mode string parsing
43 * Wouldn't it be cool to use gettext() for error messages? I just love bash saying
44 * "nie znaleziono pliku" instead of "file not found" :) 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, FALSE }, { 300, 300, TRUE }, GLUT_RGBA | GLUT_SINGLE | GLUT_DEPTH,
59 FALSE, TRUE, FALSE, FALSE, FALSE, TRUE,
60 #ifdef TARGET_HOST_WIN32
65 { NULL, NULL }, NULL, NULL, NULL, { 640, 480, TRUE }, 16, 72, GLUT_ACTION_EXIT, GLUT_EXEC_STATE_INIT } ;
68 /* -- PRIVATE FUNCTIONS ---------------------------------------------------- */
71 * A call to this function should initialize all the display stuff...
73 void fgInitialize( const char* displayName )
75 #if TARGET_HOST_UNIX_X11
77 * Have the display created
79 fgDisplay.Display = XOpenDisplay( displayName );
81 if( fgDisplay.Display == NULL )
84 * Failed to open a display. That's no good.
86 fgError( "failed to open display '%s'", XDisplayName( displayName ) );
90 * Check for the OpenGL GLX extension availability:
92 if( !glXQueryExtension( fgDisplay.Display, NULL, NULL ) )
95 * GLX extensions have not been found...
97 fgError( "OpenGL GLX extension not supported by display '%s'", XDisplayName( displayName ) );
101 * Grab the default screen for the display we have just opened
103 fgDisplay.Screen = DefaultScreen( fgDisplay.Display );
106 * The same applying to the root window
108 fgDisplay.RootWindow = RootWindow(
114 * Grab the logical screen's geometry
116 fgDisplay.ScreenWidth = DisplayWidth(
121 fgDisplay.ScreenHeight = DisplayHeight(
127 * Grab the physical screen's geometry
129 fgDisplay.ScreenWidthMM = DisplayWidthMM(
134 fgDisplay.ScreenHeightMM = DisplayHeightMM(
140 * The display's connection number
142 fgDisplay.Connection = ConnectionNumber( fgDisplay.Display );
145 * Create the window deletion atom
147 fgDisplay.DeleteWindow = XInternAtom(
153 #elif TARGET_HOST_WIN32
159 * What we need to do is to initialize the fgDisplay global structure here...
161 fgDisplay.Instance = GetModuleHandle( NULL );
164 * Check if the freeglut window class has been registered before...
166 atom = GetClassInfo( fgDisplay.Instance, "FREEGLUT", &wc );
169 * ...nope, it has not, and we have to do it right now:
174 * Make sure the unitialized fields are reset to zero
176 ZeroMemory( &wc, sizeof(WNDCLASS) );
179 * Each of the windows should have its own device context...
182 wc.lpfnWndProc = fgWindowProc;
185 wc.hInstance = fgDisplay.Instance;
186 wc.hIcon = LoadIcon( fgDisplay.Instance, "GLUT_ICON" );
188 wc.hIcon = LoadIcon( NULL, IDI_WINLOGO );
190 wc.hCursor = LoadCursor( NULL, IDC_ARROW );
191 wc.hbrBackground = NULL;
192 wc.lpszMenuName = NULL;
193 wc.lpszClassName = "FREEGLUT";
196 * Register the window class
198 atom = RegisterClass( &wc );
203 * The screen dimensions can be obtained via GetSystemMetrics() calls
205 fgDisplay.ScreenWidth = GetSystemMetrics( SM_CXSCREEN );
206 fgDisplay.ScreenHeight = GetSystemMetrics( SM_CYSCREEN );
210 * Checking the display's size in millimeters isn't too hard, too:
212 HWND desktop = GetDesktopWindow();
213 HDC context = GetDC( desktop );
216 * Grab the appropriate values now (HORZSIZE and VERTSIZE respectably):
218 fgDisplay.ScreenWidthMM = GetDeviceCaps( context, HORZSIZE );
219 fgDisplay.ScreenHeightMM = GetDeviceCaps( context, VERTSIZE );
222 * Whoops, forgot to release the device context :)
224 ReleaseDC( desktop, context );
230 * Have the joystick device initialized now
236 * Perform the freeglut deinitialization...
238 void fgDeinitialize( void )
243 * Check if initialization has been performed before
245 if( !fgState.Time.Set )
247 fgWarning( "fgDeinitialize(): fgState.Timer is null => no valid initialization has been performed" );
252 * Perform the freeglut structure deinitialization
254 fgDestroyStructure();
257 * Delete all the timers and their storage list
259 while ( (timer = fgState.Timers.First) != NULL )
261 fgListRemove ( &fgState.Timers, &timer->Node ) ;
266 * Deinitialize the joystick device
271 * Reset the state structure
274 fgState.Position.X = -1 ;
275 fgState.Position.Y = -1 ;
276 fgState.Position.Use = FALSE ;
278 fgState.Size.X = 300 ;
279 fgState.Size.Y = 300 ;
280 fgState.Size.Use = TRUE ;
283 * The default display mode to be used
285 fgState.DisplayMode = GLUT_RGBA | GLUT_SINGLE | GLUT_DEPTH;
287 fgState.ForceDirectContext = FALSE;
288 fgState.TryDirectContext = TRUE;
289 fgState.ForceIconic = FALSE;
290 fgState.GLDebugSwitch = FALSE;
291 fgState.XSyncSwitch = FALSE;
292 fgState.ActionOnWindowClose = GLUT_ACTION_EXIT ;
293 fgState.ExecState = GLUT_EXEC_STATE_INIT ;
296 * Assume we want to ignore the automatic key repeat
298 fgState.IgnoreKeyRepeat = TRUE;
301 * Set the default game mode settings
303 fgState.GameModeSize.X = 640;
304 fgState.GameModeSize.Y = 480;
305 fgState.GameModeDepth = 16;
306 fgState.GameModeRefresh = 72;
308 fgState.Time.Set = FALSE ;
310 fgState.Timers.First = fgState.Timers.Last = NULL ;
311 fgState.IdleCallback = NULL ;
312 fgState.MenuStateCallback = (FGCBmenuState)NULL ;
313 fgState.MenuStatusCallback = (FGCBmenuStatus)NULL ;
315 #if TARGET_HOST_UNIX_X11
318 * Make sure all X-client data we have created will be destroyed on display closing
320 XSetCloseDownMode( fgDisplay.Display, DestroyAll );
323 * Close the display connection, destroying all windows we have created so far
325 XCloseDisplay( fgDisplay.Display );
331 /* -- INTERFACE FUNCTIONS -------------------------------------------------- */
334 * Perform initialization. This usually happens on the program startup
335 * and restarting after glutMainLoop termination...
337 void FGAPIENTRY glutInit( int* pargc, char** argv )
339 char* displayName = NULL;
340 int i, j, argc = *pargc;
343 * Do not allow multiple initialization of the library
345 if( fgState.Time.Set )
348 * We can't have multiple initialization performed
350 fgError( "illegal glutInit() reinitialization attemp" );
354 * Have the internal freeglut structure initialized now
359 * Remember the function's call time
361 #if TARGET_HOST_UNIX_X11
362 gettimeofday(&fgState.Time.Value, NULL);
363 #elif TARGET_HOST_WIN32
364 fgState.Time.Value = timeGetTime();
366 fgState.Time.Set = TRUE;
369 * Grab the environment variable indicating the X display to use.
370 * This is harmless under Win32, so let's let it stay here...
372 #if TARGET_HOST_WIN32
373 if ( !getenv ( "DISPLAY" ) )
374 displayName = strdup ( "" ) ;
377 displayName = strdup( getenv( "DISPLAY" ) );
380 * Have the program arguments parsed.
382 for( i=1; i<argc; i++ )
385 * The X display name settings
387 if( strcmp( argv[ i ], "-display" ) == 0 )
390 * Check for possible lack of the next argument
393 fgError( "-display parameter must be followed by display name" );
396 * Release the previous display name (the one from app's environment)
401 * Make a working copy of the name for us to use
403 displayName = strdup( argv[ i ] );
406 * Have both arguments removed
408 argv[ i - 1 ] = NULL;
414 * The geometry settings
416 else if( strcmp( argv[ i ], "-geometry" ) == 0 )
422 * Again, check if there is at least one more argument
425 fgError( "-geometry parameter must be followed by window geometry settings" );
428 * Otherwise scan the geometry settings...
430 result = sscanf ( argv[i], "%dx%d+%d+%d", &x, &y, &w, &h );
433 * Check what we have been supplied with...
444 fgState.Position.Y = fgDisplay.ScreenHeight + y - fgState.Size.Y;
446 fgState.Position.Y = y;
452 fgState.Position.X = fgDisplay.ScreenWidth + x - fgState.Size.X;
454 fgState.Position.X = x;
458 * Have both arguments removed
460 argv[ i - 1 ] = NULL;
466 * The direct/indirect OpenGL contexts settings
468 else if( strcmp( argv[ i ], "-direct" ) == 0)
471 * We try to force direct rendering...
473 if( fgState.TryDirectContext == FALSE )
474 fgError( "parameters ambiguity, -direct and -indirect cannot be both specified" );
476 fgState.ForceDirectContext = TRUE;
480 else if( strcmp( argv[ i ], "-indirect" ) == 0 )
483 * We try to force indirect rendering...
485 if( fgState.ForceDirectContext == TRUE )
486 fgError( "parameters ambiguity, -direct and -indirect cannot be both specified" );
488 fgState.TryDirectContext = FALSE;
494 * The '-iconic' parameter makes all new top-level
495 * windows created in iconified state...
497 else if( strcmp( argv[ i ], "-iconic" ) == 0 )
499 fgState.ForceIconic = TRUE;
505 * The '-gldebug' option activates some OpenGL state debugging features
507 else if( strcmp( argv[ i ], "-gldebug" ) == 0 )
509 fgState.GLDebugSwitch = TRUE;
515 * The '-sync' option activates X protocol synchronization (for debugging purposes)
517 else if( strcmp( argv[ i ], "-sync" ) == 0 )
519 fgState.XSyncSwitch = TRUE;
526 * Have the arguments list compacted now
529 for( i = 1; i < *pargc; i++, j++ )
531 if( argv[ i ] == NULL )
533 while ( argv[j] == NULL ) j++ ; /* Guaranteed to end because there are "*pargc" arguments left */
539 * Have the display created now. As I am too lazy to implement
540 * the program arguments parsing, we will have the DISPLAY
541 * environment variable used for opening the X display:
543 fgInitialize( displayName );
546 * Check for the minus one settings for both position and size...
548 if( fgState.Position.X < 0 || fgState.Position.Y < 0 )
549 fgState.Position.Use = FALSE;
551 if( fgState.Size.X < 0 || fgState.Size.Y < 0 )
552 fgState.Size.Use = FALSE;
555 * Do not forget about releasing the display name string
561 * Sets the default initial window position for new windows
563 void FGAPIENTRY glutInitWindowPosition( int x, int y )
566 * The settings can be disables when both coordinates are negative
568 if( (x >= 0) && (y >= 0) )
571 * We want to specify the initial position of each of the windows
573 fgState.Position.X = x;
574 fgState.Position.Y = y;
575 fgState.Position.Use = TRUE;
580 * The initial position of each of the windows is specified by the wm
582 fgState.Position.X = -1;
583 fgState.Position.Y = -1;
584 fgState.Position.Use = FALSE;
589 * Sets the default initial window size for new windows
591 void FGAPIENTRY glutInitWindowSize( int width, int height )
594 * The settings can be disables when both values are negative
596 if( (width > 0) && (height > 0) )
599 * We want to specify the initial size of each of the windows
601 fgState.Size.X = width;
602 fgState.Size.Y = height;
603 fgState.Size.Use = TRUE;
608 * The initial size of each of the windows is specified by the wm (officially this is an error condition)
612 fgState.Size.Use = FALSE;
617 * Sets the default display mode for all new windows
619 void FGAPIENTRY glutInitDisplayMode( unsigned int displayMode )
622 * We will make use of this value when creating a new OpenGL context...
624 fgState.DisplayMode = displayMode;
628 /* -- INIT DISPLAY STRING PARSING ------------------------------------------ */
630 #if 0 /* FIXME: CJP */
632 * There is a discrete number of comparison operators we can encounter:
634 * comparison ::= "=" | "!=" | "<" | ">" | "<=" | ">=" | "~"
636 #define FG_NONE 0x0000
637 #define FG_EQUAL 0x0001
638 #define FG_NOT_EQUAL 0x0002
639 #define FG_LESS 0x0003
640 #define FG_MORE 0x0004
641 #define FG_LESS_OR_EQUAL 0x0005
642 #define FG_MORE_OR_EQUAL 0x0006
643 #define FG_CLOSEST 0x0007
646 * The caller can feed us with a number of capability tokens:
648 * capability ::= "alpha" | "acca" | "acc" | "blue" | "buffer" | "conformant" | "depth" | "double" |
649 * "green" | "index" | "num" | "red" | "rgba" | "rgb" | "luminance" | "stencil" |
650 * "single" | "stereo" | "samples" | "slow" | "win32pdf" | "xvisual" | "xstaticgray" |
651 * "xgrayscale" | "xstaticcolor" | "xpseudocolor" | "xtruecolor" | "xdirectcolor"
653 static gchar* g_Tokens[] =
655 "none", "alpha", "acca", "acc", "blue", "buffer", "conformant", "depth", "double", "green",
656 "index", "num", "red", "rgba", "rgb", "luminance", "stencil", "single", "stereo", "samples",
657 "slow", "win32pdf", "xvisual", "xstaticgray", "xgrayscale", "xstaticcolor", "xpseudocolor",
658 "xtruecolor", "xdirectcolor", NULL
662 * The structure to hold the parsed display string tokens
664 typedef struct tagSFG_Capability SFG_Capability;
665 struct tagSFG_Capability
667 gint capability; /* the capability token enumerator */
668 gint comparison; /* the comparison operator used */
669 gint value; /* the value we're comparing to */
673 * The scanner configuration for the init display string
675 static GScannerConfig fgInitDisplayStringScannerConfig =
677 ( " \t\r\n" ) /* cset_skip_characters */,
682 ) /* cset_identifier_first */,
690 ) /* cset_identifier_nth */,
691 ( "#\n" ) /* cpair_comment_single */,
692 FALSE /* case_sensitive */,
693 TRUE /* skip_comment_multi */,
694 TRUE /* skip_comment_single */,
695 TRUE /* scan_comment_multi */,
696 TRUE /* scan_identifier */,
697 FALSE /* scan_identifier_1char */,
698 FALSE /* scan_identifier_NULL */,
699 TRUE /* scan_symbols */,
700 FALSE /* scan_binary */,
701 TRUE /* scan_octal */,
702 TRUE /* scan_float */,
704 FALSE /* scan_hex_dollar */,
705 TRUE /* scan_string_sq */,
706 TRUE /* scan_string_dq */,
707 TRUE /* numbers_2_int */,
708 FALSE /* int_2_float */,
709 FALSE /* identifier_2_string */,
710 TRUE /* char_2_token */,
711 FALSE /* symbol_2_token */,
712 FALSE /* scope_0_fallback */,
716 * Sets the default display mode for all new windows using a string
718 void FGAPIENTRY glutInitDisplayString( char* displayMode )
721 * display_string ::= (switch)
722 * switch ::= capability [comparison value]
723 * comparison ::= "=" | "!=" | "<" | ">" | "<=" | ">=" | "~"
724 * capability ::= "alpha" | "acca" | "acc" | "blue" | "buffer" | "conformant" |
725 * "depth" | "double" | "green" | "index" | "num" | "red" | "rgba" |
726 * "rgb" | "luminance" | "stencil" | "single" | "stereo" |
727 * "samples" | "slow" | "win32pdf" | "xvisual" | "xstaticgray" |
728 * "xgrayscale" | "xstaticcolor" | "xpseudocolor" |
729 * "xtruecolor" | "xdirectcolor"
730 * value ::= 0..9 [value]
732 * The display string grammar. This should be EBNF, but I couldn't find the definitions so, to
733 * clarify: (expr) means 0 or more times the expression, [expr] means 0 or 1 times expr.
735 * Create a new GLib lexical analyzer to process the display mode string
737 GScanner* scanner = g_scanner_new( &fgInitDisplayStringScannerConfig );
742 * Fail if the display mode string is empty or the scanner failed to initialize
744 freeglut_return_if_fail( (scanner != NULL) && (strlen( displayMode ) > 0) );
747 * Set the scanner's input name (for debugging)
749 scanner->input_name = "glutInitDisplayString";
752 * Start the lexical analysis of the extensions string
754 g_scanner_input_text( scanner, displayMode, strlen( displayMode ) );
757 * While there are any more tokens to be checked...
759 while( !g_scanner_eof( scanner ) )
762 * Actually we're expecting only string tokens
764 GTokenType tokenType = g_scanner_get_next_token( scanner );
767 * We are looking for identifiers
769 if( tokenType == G_TOKEN_IDENTIFIER )
771 gchar* capability = NULL; /* the capability identifier string (always present) */
772 gint capID = 0; /* the capability identifier value (from g_Tokens) */
773 gint comparison = 0; /* the comparison operator value, see definitions */
774 gchar* valueString = NULL; /* if the previous one is present, this is needed */
775 gint value = 0; /* the integer value converted using a strtol call */
776 SFG_Capability* capStruct; /* the capability description structure */
779 * OK. The general rule of thumb that we always should be getting a capability identifier
780 * string (see the grammar description). If it is followed by a comparison identifier, then
781 * there must follow an integer value we're comparing the capability to...
783 * Have the current token analyzed with that in mind...
785 for( i=0; i<(gint) strlen( scanner->value.v_identifier ); i++ )
787 gchar c = scanner->value.v_identifier[ i ];
789 if( (c == '=') || (c == '!') || (c == '<') || (c == '>') || (c == '~') )
794 * Here we go with the length of the capability identifier string.
795 * In the worst of cases, it is as long as the token identifier.
797 capability = g_strndup( scanner->value.v_identifier, i );
800 * OK. Is there a chance for comparison and value identifiers to follow?
801 * Note: checking against i+1 as this handles two cases: single character
802 * comparison operator and first of value's digits, which must always be
803 * there, or the two-character comparison operators.
805 if( (i + 1) < (gint) strlen( scanner->value.v_identifier ) )
808 * Yeah, indeed, it is the i-th character to start the identifier, then.
810 gchar c1 = scanner->value.v_identifier[ i + 0 ];
811 gchar c2 = scanner->value.v_identifier[ i + 1 ];
813 if( (c1 == '=') ) { i += 1; comparison = FG_EQUAL; } else
814 if( (c1 == '!') && (c2 == '=') ) { i += 2; comparison = FG_NOT_EQUAL; } else
815 if( (c1 == '<') && (c2 == '=') ) { i += 2; comparison = FG_LESS_OR_EQUAL; } else
816 if( (c1 == '>') && (c2 == '=') ) { i += 2; comparison = FG_MORE_OR_EQUAL; } else
817 if( (c1 == '<') ) { i += 1; comparison = FG_LESS; } else
818 if( (c1 == '>') ) { i += 1; comparison = FG_MORE; } else
819 if( (c1 == '~') ) { i += 1; comparison = FG_CLOSEST; } else
820 g_warning( "invalid comparison operator in token `%s'", scanner->value.v_identifier );
824 * Grab the value string that must follow the comparison operator...
826 if( comparison != FG_NONE && i < (gint) strlen( scanner->value.v_identifier ) )
827 valueString = strdup( scanner->value.v_identifier + i );
830 * If there was a value string, convert it to integer...
832 if( comparison != FG_NONE && strlen( valueString ) > 0 )
833 value = strtol( valueString, NULL, 0 );
836 * Now we need to match the capability string and its ID
838 for( i=0; g_Tokens[ i ]!=NULL; i++ )
840 if( strcmp( capability, g_Tokens[ i ] ) == 0 )
843 * Looks like we've found the one we were looking for
851 * Create a new capability description structure
853 capStruct = g_new0( SFG_Capability, 1 );
856 * Fill in the cap's values, as we have parsed it:
858 capStruct->capability = capID;
859 capStruct->comparison = comparison;
860 capStruct->value = value;
863 * Add the new capabaility to the caps list
865 caps = g_list_append( caps, capStruct );
868 * Clean up the local mess and keep rolling on
870 g_free( valueString );
871 g_free( capability );
876 * Now that we have converted the string into somewhat more machine-friendly
877 * form, proceed with matching the frame buffer configuration...
879 * The caps list could be passed to a function that would try finding the closest
880 * matching pixel format, visual, frame buffer configuration or whatever. It would
881 * be good to convert the glutInitDisplayMode() to use the same method.
884 g_message( "found %i capability preferences", g_list_length( caps ) );
886 g_message( "token `%s': cap: %i, com: %i, val: %i",
887 scanner->value.v_identifier,
888 capStruct->capability,
889 capStruct->comparison,
895 * Free the capabilities we have parsed
897 for( i=0; i<(gint) g_list_length( caps ); i++ )
898 g_free( g_list_nth( caps, i )->data );
901 * Destroy the capabilities list itself
906 * Free the lexical scanner now...
908 g_scanner_destroy( scanner );
912 #define NUM_TOKENS 28
913 static char* Tokens[] =
915 "alpha", "acca", "acc", "blue", "buffer", "conformant", "depth", "double", "green",
916 "index", "num", "red", "rgba", "rgb", "luminance", "stencil", "single", "stereo", "samples",
917 "slow", "win32pdf", "xvisual", "xstaticgray", "xgrayscale", "xstaticcolor", "xpseudocolor",
918 "xtruecolor", "xdirectcolor"
921 static int TokenLengths[] =
923 5, 4, 3, 4, 6, 10, 5, 6, 5,
924 5, 3, 3, 4, 3, 9, 7, 6, 6, 7,
925 4, 8, 7, 11, 10, 12, 12,
929 void FGAPIENTRY glutInitDisplayString( const char* displayMode )
931 int glut_state_flag = 0 ;
933 * Unpack a lot of options from a character string. The options are delimited by blanks or tabs.
936 int len = strlen ( displayMode ) ;
937 char *buffer = malloc ( (len+1) * sizeof(char) ) ;
938 memcpy ( buffer, displayMode, len ) ;
941 token = strtok ( buffer, " \t" ) ;
948 for ( i = 0; i < NUM_TOKENS; i++ )
950 if ( strncmp ( token, Tokens[i], TokenLengths[i] ) == 0 ) break ;
955 case 0 : /* "alpha": Alpha color buffer precision in bits */
956 glut_state_flag |= GLUT_ALPHA ; /* Somebody fix this for me! */
959 case 1 : /* "acca": Red, green, blue, and alpha accumulation buffer precision in bits */
962 case 2 : /* "acc": Red, green, and blue accumulation buffer precision in bits with zero bits alpha */
963 glut_state_flag |= GLUT_ACCUM ; /* Somebody fix this for me! */
966 case 3 : /* "blue": Blue color buffer precision in bits */
969 case 4 : /* "buffer": Number of bits in the color index color buffer */
972 case 5 : /* "conformant": Boolean indicating if the frame buffer configuration is conformant or not */
975 case 6 : /* "depth": Number of bits of precsion in the depth buffer */
976 glut_state_flag |= GLUT_DEPTH ; /* Somebody fix this for me! */
979 case 7 : /* "double": Boolean indicating if the color buffer is double buffered */
980 glut_state_flag |= GLUT_DOUBLE ;
983 case 8 : /* "green": Green color buffer precision in bits */
986 case 9 : /* "index": Boolean if the color model is color index or not */
987 glut_state_flag |= GLUT_INDEX ;
990 case 10 : /* "num": A special capability name indicating where the value represents the Nth frame buffer configuration matching the description string */
993 case 11 : /* "red": Red color buffer precision in bits */
996 case 12 : /* "rgba": Number of bits of red, green, blue, and alpha in the RGBA color buffer */
997 glut_state_flag |= GLUT_RGBA ; /* Somebody fix this for me! */
1000 case 13 : /* "rgb": Number of bits of red, green, and blue in the RGBA color buffer with zero bits alpha */
1001 glut_state_flag |= GLUT_RGB ; /* Somebody fix this for me! */
1004 case 14 : /* "luminance": Number of bits of red in the RGBA and zero bits of green, blue (alpha not specified) of color buffer precision */
1005 glut_state_flag |= GLUT_LUMINANCE ; /* Somebody fix this for me! */
1008 case 15 : /* "stencil": Number of bits in the stencil buffer */
1009 glut_state_flag |= GLUT_STENCIL ; /* Somebody fix this for me! */
1012 case 16 : /* "single": Boolean indicate the color buffer is single buffered */
1013 glut_state_flag |= GLUT_SINGLE ;
1016 case 17 : /* "stereo": Boolean indicating the color buffer supports OpenGL-style stereo */
1017 glut_state_flag |= GLUT_STEREO ;
1020 case 18 : /* "samples": Indicates the number of multisamples to use based on GLX's SGIS_multisample extension (for antialiasing) */
1021 glut_state_flag |= GLUT_MULTISAMPLE ; /* Somebody fix this for me! */
1024 case 19 : /* "slow": Boolean indicating if the frame buffer configuration is slow or not */
1027 case 20 : /* "win32pdf": matches the Win32 Pixel Format Descriptor by number */
1028 #ifdef TARGET_HOST_WIN32
1032 case 21 : /* "xvisual": matches the X visual ID by number */
1033 #ifdef TARGET_HOST_UNIX_X11
1037 case 22 : /* "xstaticgray": boolean indicating if the frame buffer configuration's X visual is of type StaticGray */
1038 #ifdef TARGET_HOST_UNIX_X11
1042 case 23 : /* "xgrayscale": boolean indicating if the frame buffer configuration's X visual is of type GrayScale */
1043 #ifdef TARGET_HOST_UNIX_X11
1047 case 24 : /* "xstaticcolor": boolean indicating if the frame buffer configuration's X visual is of type StaticColor */
1048 #ifdef TARGET_HOST_UNIX_X11
1052 case 25 : /* "xpseudocolor": boolean indicating if the frame buffer configuration's X visual is of type PseudoColor */
1053 #ifdef TARGET_HOST_UNIX_X11
1057 case 26 : /* "xtruecolor": boolean indicating if the frame buffer configuration's X visual is of type TrueColor */
1058 #ifdef TARGET_HOST_UNIX_X11
1062 case 27 : /* "xdirectcolor": boolean indicating if the frame buffer configuration's X visual is of type DirectColor */
1063 #ifdef TARGET_HOST_UNIX_X11
1067 case 28 : /* Unrecognized */
1068 printf ( "WARNING - Display string token not recognized: %s\n", token ) ;
1072 token = strtok ( NULL, " \t" ) ;
1078 * We will make use of this value when creating a new OpenGL context...
1080 fgState.DisplayMode = glut_state_flag;
1083 /*** END OF FILE ***/