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.
28 #include <GL/freeglut.h>
29 #include "freeglut_internal.h"
32 * TODO BEFORE THE STABLE RELEASE:
34 * fgDeinitialize() -- Win32's OK, X11 needs the OS-specific
35 * deinitialization done
36 * glutInitDisplayString() -- display mode string parsing
38 * Wouldn't it be cool to use gettext() for error messages? I just love
39 * bash saying "nie znaleziono pliku" instead of "file not found" :)
40 * Is gettext easily portable?
43 /* -- GLOBAL VARIABLES ----------------------------------------------------- */
46 * A structure pointed by g_pDisplay holds all information
47 * regarding the display, screen, root window etc.
49 SFG_Display fgDisplay;
52 * The settings for the current freeglut session
54 SFG_State fgState = { { -1, -1, GL_FALSE }, /* Position */
55 { 300, 300, GL_TRUE }, /* Size */
56 GLUT_RGBA | GLUT_SINGLE | GLUT_DEPTH, /* DisplayMode */
57 GL_FALSE, /* Initialised */
58 GLUT_TRY_DIRECT_CONTEXT, /* DirectContext */
59 GL_FALSE, /* ForceIconic */
60 GL_FALSE, /* UseCurrentContext */
61 GL_FALSE, /* GLDebugSwitch */
62 GL_FALSE, /* XSyncSwitch */
63 GLUT_KEY_REPEAT_ON, /* KeyRepeat */
64 INVALID_MODIFIERS, /* Modifiers */
69 { NULL, NULL }, /* Timers */
70 { NULL, NULL }, /* FreeTimers */
71 NULL, /* IdleCallback */
73 NULL, /* MenuStateCallback */
74 NULL, /* MenuStatusCallback */
75 { 640, 480, GL_TRUE }, /* GameModeSize */
76 16, /* GameModeDepth */
77 72, /* GameModeRefresh */
78 GLUT_ACTION_EXIT, /* ActionOnWindowClose */
79 GLUT_EXEC_STATE_INIT, /* ExecState */
80 NULL, /* ProgramName */
81 GL_FALSE, /* JoysticksInitialised */
82 GL_FALSE, /* InputDevsInitialised */
83 0, /* AuxiliaryBufferNumber */
88 /* -- PRIVATE FUNCTIONS ---------------------------------------------------- */
91 * A call to this function should initialize all the display stuff...
93 static void fghInitialize( const char* displayName )
95 #if TARGET_HOST_POSIX_X11
96 fgDisplay.Display = XOpenDisplay( displayName );
98 if( fgDisplay.Display == NULL )
99 fgError( "failed to open display '%s'", XDisplayName( displayName ) );
101 if( !glXQueryExtension( fgDisplay.Display, NULL, NULL ) )
102 fgError( "OpenGL GLX extension not supported by display '%s'",
103 XDisplayName( displayName ) );
105 fgDisplay.Screen = DefaultScreen( fgDisplay.Display );
106 fgDisplay.RootWindow = RootWindow(
111 fgDisplay.ScreenWidth = DisplayWidth(
115 fgDisplay.ScreenHeight = DisplayHeight(
120 fgDisplay.ScreenWidthMM = DisplayWidthMM(
124 fgDisplay.ScreenHeightMM = DisplayHeightMM(
129 fgDisplay.Connection = ConnectionNumber( fgDisplay.Display );
131 /* Create the window deletion atom */
132 fgDisplay.DeleteWindow = XInternAtom(
138 #elif TARGET_HOST_MS_WINDOWS
143 /* What we need to do is to initialize the fgDisplay global structure here. */
144 fgDisplay.Instance = GetModuleHandle( NULL );
146 atom = GetClassInfo( fgDisplay.Instance, _T("FREEGLUT"), &wc );
150 ZeroMemory( &wc, sizeof(WNDCLASS) );
153 * Each of the windows should have its own device context, and we
154 * want redraw events during Vertical and Horizontal Resizes by
157 * XXX Old code had "| CS_DBCLCKS" commented out. Plans for the
158 * XXX future? Dead-end idea?
160 wc.lpfnWndProc = fgWindowProc;
163 wc.hInstance = fgDisplay.Instance;
164 wc.hIcon = LoadIcon( fgDisplay.Instance, _T("GLUT_ICON") );
166 #if defined(_WIN32_WCE)
167 wc.style = CS_HREDRAW | CS_VREDRAW;
169 wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
171 wc.hIcon = LoadIcon( NULL, IDI_WINLOGO );
174 wc.hCursor = LoadCursor( NULL, IDC_ARROW );
175 wc.hbrBackground = NULL;
176 wc.lpszMenuName = NULL;
177 wc.lpszClassName = _T("FREEGLUT");
179 /* Register the window class */
180 atom = RegisterClass( &wc );
181 FREEGLUT_INTERNAL_ERROR_EXIT ( atom, "Window Class Not Registered", "fghInitialize" );
184 /* The screen dimensions can be obtained via GetSystemMetrics() calls */
185 fgDisplay.ScreenWidth = GetSystemMetrics( SM_CXSCREEN );
186 fgDisplay.ScreenHeight = GetSystemMetrics( SM_CYSCREEN );
189 HWND desktop = GetDesktopWindow( );
190 HDC context = GetDC( desktop );
192 fgDisplay.ScreenWidthMM = GetDeviceCaps( context, HORZSIZE );
193 fgDisplay.ScreenHeightMM = GetDeviceCaps( context, VERTSIZE );
195 ReleaseDC( desktop, context );
198 /* Set the timer granularity to 1 ms */
199 timeBeginPeriod ( 1 );
203 fgState.Initialised = GL_TRUE;
205 /* InputDevice uses GlutTimerFunc(), so fgState.Initialised must be TRUE */
206 fgInitialiseInputDevices();
210 * Perform the freeglut deinitialization...
212 void fgDeinitialize( void )
216 if( !fgState.Initialised )
218 fgWarning( "fgDeinitialize(): "
219 "no valid initialization has been performed" );
223 /* If there was a menu created, destroy the rendering context */
224 if( fgStructure.MenuContext )
226 #if TARGET_HOST_POSIX_X11
227 /* Note that the MVisualInfo is not owned by the MenuContext! */
228 glXDestroyContext( fgDisplay.Display, fgStructure.MenuContext->MContext );
230 free( fgStructure.MenuContext );
231 fgStructure.MenuContext = NULL;
234 fgDestroyStructure( );
236 while( ( timer = fgState.Timers.First) )
238 fgListRemove( &fgState.Timers, &timer->Node );
242 while( ( timer = fgState.FreeTimers.First) )
244 fgListRemove( &fgState.FreeTimers, &timer->Node );
248 #if !defined(_WIN32_WCE)
249 if ( fgState.JoysticksInitialised )
252 if ( fgState.InputDevsInitialised )
253 fgInputDeviceClose( );
254 #endif /* !defined(_WIN32_WCE) */
255 fgState.JoysticksInitialised = GL_FALSE;
256 fgState.InputDevsInitialised = GL_FALSE;
258 fgState.Initialised = GL_FALSE;
260 fgState.Position.X = -1;
261 fgState.Position.Y = -1;
262 fgState.Position.Use = GL_FALSE;
264 fgState.Size.X = 300;
265 fgState.Size.Y = 300;
266 fgState.Size.Use = GL_TRUE;
268 fgState.DisplayMode = GLUT_RGBA | GLUT_SINGLE | GLUT_DEPTH;
270 fgState.DirectContext = GLUT_TRY_DIRECT_CONTEXT;
271 fgState.ForceIconic = GL_FALSE;
272 fgState.UseCurrentContext = GL_FALSE;
273 fgState.GLDebugSwitch = GL_FALSE;
274 fgState.XSyncSwitch = GL_FALSE;
275 fgState.ActionOnWindowClose = GLUT_ACTION_EXIT;
276 fgState.ExecState = GLUT_EXEC_STATE_INIT;
278 fgState.KeyRepeat = GLUT_KEY_REPEAT_ON;
279 fgState.Modifiers = INVALID_MODIFIERS;
281 fgState.GameModeSize.X = 640;
282 fgState.GameModeSize.Y = 480;
283 fgState.GameModeDepth = 16;
284 fgState.GameModeRefresh = 72;
286 fgListInit( &fgState.Timers );
287 fgListInit( &fgState.FreeTimers );
289 fgState.IdleCallback = NULL;
290 fgState.MenuStateCallback = ( FGCBMenuState )NULL;
291 fgState.MenuStatusCallback = ( FGCBMenuStatus )NULL;
293 fgState.SwapCount = 0;
294 fgState.SwapTime = 0;
295 fgState.FPSInterval = 0;
297 if( fgState.ProgramName )
299 free( fgState.ProgramName );
300 fgState.ProgramName = NULL;
303 #if TARGET_HOST_POSIX_X11
306 * Make sure all X-client data we have created will be destroyed on
309 XSetCloseDownMode( fgDisplay.Display, DestroyAll );
312 * Close the display connection, destroying all windows we have
315 XCloseDisplay( fgDisplay.Display );
317 #elif TARGET_HOST_MS_WINDOWS
319 /* Reset the timer granularity */
324 fgState.Initialised = GL_FALSE;
328 * Everything inside the following #ifndef is copied from the X sources.
331 #if TARGET_HOST_MS_WINDOWS
335 Copyright 1985, 1986, 1987,1998 The Open Group
337 Permission to use, copy, modify, distribute, and sell this software and its
338 documentation for any purpose is hereby granted without fee, provided that
339 the above copyright notice appear in all copies and that both that
340 copyright notice and this permission notice appear in supporting
343 The above copyright notice and this permission notice shall be included
344 in all copies or substantial portions of the Software.
346 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
347 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
348 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
349 IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
350 OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
351 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
352 OTHER DEALINGS IN THE SOFTWARE.
354 Except as contained in this notice, the name of The Open Group shall
355 not be used in advertising or otherwise to promote the sale, use or
356 other dealings in this Software without prior written authorization
361 #define NoValue 0x0000
362 #define XValue 0x0001
363 #define YValue 0x0002
364 #define WidthValue 0x0004
365 #define HeightValue 0x0008
366 #define AllValues 0x000F
367 #define XNegative 0x0010
368 #define YNegative 0x0020
371 * XParseGeometry parses strings of the form
372 * "=<width>x<height>{+-}<xoffset>{+-}<yoffset>", where
373 * width, height, xoffset, and yoffset are unsigned integers.
374 * Example: "=80x24+300-49"
375 * The equal sign is optional.
376 * It returns a bitmask that indicates which of the four values
377 * were actually found in the string. For each value found,
378 * the corresponding argument is updated; for each value
379 * not found, the corresponding argument is left unchanged.
383 ReadInteger(char *string, char **NextString)
385 register int Result = 0;
390 else if (*string == '-')
395 for (; (*string >= '0') && (*string <= '9'); string++)
397 Result = (Result * 10) + (*string - '0');
399 *NextString = string;
406 static int XParseGeometry (
410 unsigned int *width, /* RETURN */
411 unsigned int *height) /* RETURN */
414 register char *strind;
415 unsigned int tempWidth = 0, tempHeight = 0;
416 int tempX = 0, tempY = 0;
419 if ( (string == NULL) || (*string == '\0'))
422 string++; /* ignore possible '=' at beg of geometry spec */
424 strind = (char *)string;
425 if (*strind != '+' && *strind != '-' && *strind != 'x') {
426 tempWidth = ReadInteger(strind, &nextCharacter);
427 if (strind == nextCharacter)
429 strind = nextCharacter;
433 if (*strind == 'x' || *strind == 'X') {
435 tempHeight = ReadInteger(strind, &nextCharacter);
436 if (strind == nextCharacter)
438 strind = nextCharacter;
442 if ((*strind == '+') || (*strind == '-')) {
443 if (*strind == '-') {
445 tempX = -ReadInteger(strind, &nextCharacter);
446 if (strind == nextCharacter)
448 strind = nextCharacter;
454 tempX = ReadInteger(strind, &nextCharacter);
455 if (strind == nextCharacter)
457 strind = nextCharacter;
460 if ((*strind == '+') || (*strind == '-')) {
461 if (*strind == '-') {
463 tempY = -ReadInteger(strind, &nextCharacter);
464 if (strind == nextCharacter)
466 strind = nextCharacter;
472 tempY = ReadInteger(strind, &nextCharacter);
473 if (strind == nextCharacter)
475 strind = nextCharacter;
481 /* If strind isn't at the end of the string the it's an invalid
482 geometry specification. */
484 if (*strind != '\0') return 0;
490 if (mask & WidthValue)
492 if (mask & HeightValue)
493 *height = tempHeight;
498 /* -- INTERFACE FUNCTIONS -------------------------------------------------- */
501 * Perform initialization. This usually happens on the program startup
502 * and restarting after glutMainLoop termination...
504 void FGAPIENTRY glutInit( int* pargc, char** argv )
506 char* displayName = NULL;
507 char* geometry = NULL;
508 int i, j, argc = *pargc;
510 if( fgState.Initialised )
511 fgError( "illegal glutInit() reinitialization attempt" );
513 if (pargc && *pargc && argv && *argv && **argv)
515 fgState.ProgramName = strdup (*argv);
517 if( !fgState.ProgramName )
518 fgError ("Could not allocate space for the program's name.");
521 fgCreateStructure( );
524 fgState.Time = fgSystemTime();
526 /* check if GLUT_FPS env var is set */
529 const char *fps = getenv( "GLUT_FPS" );
533 sscanf( fps, "%d", &interval );
536 fgState.FPSInterval = 5000; /* 5000 millisecond default */
538 fgState.FPSInterval = interval;
542 displayName = getenv( "DISPLAY");
544 for( i = 1; i < argc; i++ )
546 if( strcmp( argv[ i ], "-display" ) == 0 )
549 fgError( "-display parameter must be followed by display name" );
551 displayName = argv[ i ];
553 argv[ i - 1 ] = NULL;
557 else if( strcmp( argv[ i ], "-geometry" ) == 0 )
560 fgError( "-geometry parameter must be followed by window "
561 "geometry settings" );
563 geometry = argv[ i ];
565 argv[ i - 1 ] = NULL;
569 else if( strcmp( argv[ i ], "-direct" ) == 0)
571 if( fgState.DirectContext == GLUT_FORCE_INDIRECT_CONTEXT )
572 fgError( "parameters ambiguity, -direct and -indirect "
573 "cannot be both specified" );
575 fgState.DirectContext = GLUT_FORCE_DIRECT_CONTEXT;
579 else if( strcmp( argv[ i ], "-indirect" ) == 0 )
581 if( fgState.DirectContext == GLUT_FORCE_DIRECT_CONTEXT )
582 fgError( "parameters ambiguity, -direct and -indirect "
583 "cannot be both specified" );
585 fgState.DirectContext = GLUT_FORCE_INDIRECT_CONTEXT;
589 else if( strcmp( argv[ i ], "-iconic" ) == 0 )
591 fgState.ForceIconic = GL_TRUE;
595 else if( strcmp( argv[ i ], "-gldebug" ) == 0 )
597 fgState.GLDebugSwitch = GL_TRUE;
601 else if( strcmp( argv[ i ], "-sync" ) == 0 )
603 fgState.XSyncSwitch = GL_TRUE;
609 /* Compact {argv}. */
610 for( i = j = 1; i < *pargc; i++, j++ )
612 /* Guaranteed to end because there are "*pargc" arguments left */
613 while ( argv[ j ] == NULL )
616 argv[ i ] = argv[ j ];
619 #endif /* _WIN32_WCE */
622 * Have the display created now. If there wasn't a "-display"
623 * in the program arguments, we will use the DISPLAY environment
624 * variable for opening the X display (see code above):
626 fghInitialize( displayName );
629 * Geometry parsing deffered until here because we may need the screen
635 unsigned int parsedWidth, parsedHeight;
636 int mask = XParseGeometry( geometry,
637 &fgState.Position.X, &fgState.Position.Y,
638 &parsedWidth, &parsedHeight );
639 /* TODO: Check for overflow? */
640 fgState.Size.X = parsedWidth;
641 fgState.Size.Y = parsedHeight;
643 if( (mask & (WidthValue|HeightValue)) == (WidthValue|HeightValue) )
644 fgState.Size.Use = GL_TRUE;
646 if( mask & XNegative )
647 fgState.Position.X += fgDisplay.ScreenWidth - fgState.Size.X;
649 if( mask & YNegative )
650 fgState.Position.Y += fgDisplay.ScreenHeight - fgState.Size.Y;
652 if( (mask & (XValue|YValue)) == (XValue|YValue) )
653 fgState.Position.Use = GL_TRUE;
658 * Undoes all the "glutInit" stuff
660 void FGAPIENTRY glutExit ( void )
666 * Sets the default initial window position for new windows
668 void FGAPIENTRY glutInitWindowPosition( int x, int y )
670 fgState.Position.X = x;
671 fgState.Position.Y = y;
673 if( ( x >= 0 ) && ( y >= 0 ) )
674 fgState.Position.Use = GL_TRUE;
676 fgState.Position.Use = GL_FALSE;
680 * Sets the default initial window size for new windows
682 void FGAPIENTRY glutInitWindowSize( int width, int height )
684 fgState.Size.X = width;
685 fgState.Size.Y = height;
687 if( ( width > 0 ) && ( height > 0 ) )
688 fgState.Size.Use = GL_TRUE;
690 fgState.Size.Use = GL_FALSE;
694 * Sets the default display mode for all new windows
696 void FGAPIENTRY glutInitDisplayMode( unsigned int displayMode )
698 /* We will make use of this value when creating a new OpenGL context... */
699 fgState.DisplayMode = displayMode;
703 /* -- INIT DISPLAY STRING PARSING ------------------------------------------ */
705 static char* Tokens[] =
707 "alpha", "acca", "acc", "blue", "buffer", "conformant", "depth", "double",
708 "green", "index", "num", "red", "rgba", "rgb", "luminance", "stencil",
709 "single", "stereo", "samples", "slow", "win32pdf", "win32pfd", "xvisual",
710 "xstaticgray", "xgrayscale", "xstaticcolor", "xpseudocolor",
711 "xtruecolor", "xdirectcolor",
712 "xstaticgrey", "xgreyscale", "xstaticcolour", "xpseudocolour",
713 "xtruecolour", "xdirectcolour", "borderless", "aux"
715 #define NUM_TOKENS (sizeof(Tokens) / sizeof(*Tokens))
717 void FGAPIENTRY glutInitDisplayString( const char* displayMode )
719 int glut_state_flag = 0 ;
721 * Unpack a lot of options from a character string. The options are
722 * delimited by blanks or tabs.
725 size_t len = strlen ( displayMode );
726 char *buffer = (char *)malloc ( (len+1) * sizeof(char) );
727 memcpy ( buffer, displayMode, len );
730 token = strtok ( buffer, " \t" );
733 /* Process this token */
736 /* Temporary fix: Ignore any length specifications and at least
737 * process the basic token
738 * TODO: Fix this permanently
740 size_t cleanlength = strcspn ( token, "=<>~!" );
742 for ( i = 0; i < NUM_TOKENS; i++ )
744 if ( strncmp ( token, Tokens[i], cleanlength ) == 0 ) break ;
749 case 0 : /* "alpha": Alpha color buffer precision in bits */
750 glut_state_flag |= GLUT_ALPHA ; /* Somebody fix this for me! */
753 case 1 : /* "acca": Red, green, blue, and alpha accumulation buffer
757 case 2 : /* "acc": Red, green, and blue accumulation buffer precision
758 in bits with zero bits alpha */
759 glut_state_flag |= GLUT_ACCUM ; /* Somebody fix this for me! */
762 case 3 : /* "blue": Blue color buffer precision in bits */
765 case 4 : /* "buffer": Number of bits in the color index color buffer
769 case 5 : /* "conformant": Boolean indicating if the frame buffer
770 configuration is conformant or not */
773 case 6 : /* "depth": Number of bits of precsion in the depth buffer */
774 glut_state_flag |= GLUT_DEPTH ; /* Somebody fix this for me! */
777 case 7 : /* "double": Boolean indicating if the color buffer is
779 glut_state_flag |= GLUT_DOUBLE ;
782 case 8 : /* "green": Green color buffer precision in bits */
785 case 9 : /* "index": Boolean if the color model is color index or not
787 glut_state_flag |= GLUT_INDEX ;
790 case 10 : /* "num": A special capability name indicating where the
791 value represents the Nth frame buffer configuration
792 matching the description string */
795 case 11 : /* "red": Red color buffer precision in bits */
798 case 12 : /* "rgba": Number of bits of red, green, blue, and alpha in
799 the RGBA color buffer */
800 glut_state_flag |= GLUT_RGBA ; /* Somebody fix this for me! */
803 case 13 : /* "rgb": Number of bits of red, green, and blue in the
804 RGBA color buffer with zero bits alpha */
805 glut_state_flag |= GLUT_RGB ; /* Somebody fix this for me! */
808 case 14 : /* "luminance": Number of bits of red in the RGBA and zero
809 bits of green, blue (alpha not specified) of color buffer
811 glut_state_flag |= GLUT_LUMINANCE ; /* Somebody fix this for me! */
814 case 15 : /* "stencil": Number of bits in the stencil buffer */
815 glut_state_flag |= GLUT_STENCIL; /* Somebody fix this for me! */
818 case 16 : /* "single": Boolean indicate the color buffer is single
820 glut_state_flag |= GLUT_SINGLE ;
823 case 17 : /* "stereo": Boolean indicating the color buffer supports
824 OpenGL-style stereo */
825 glut_state_flag |= GLUT_STEREO ;
828 case 18 : /* "samples": Indicates the number of multisamples to use
829 based on GLX's SGIS_multisample extension (for
831 glut_state_flag |= GLUT_MULTISAMPLE ; /*Somebody fix this for me!*/
834 case 19 : /* "slow": Boolean indicating if the frame buffer
835 configuration is slow or not */
838 case 20 : /* "win32pdf": (incorrect spelling but was there before */
839 case 21 : /* "win32pfd": matches the Win32 Pixel Format Descriptor by
841 #if TARGET_HOST_MS_WINDOWS
845 case 22 : /* "xvisual": matches the X visual ID by number */
846 #if TARGET_HOST_POSIX_X11
850 case 23 : /* "xstaticgray": */
851 case 29 : /* "xstaticgrey": boolean indicating if the frame buffer
852 configuration's X visual is of type StaticGray */
853 #if TARGET_HOST_POSIX_X11
857 case 24 : /* "xgrayscale": */
858 case 30 : /* "xgreyscale": boolean indicating if the frame buffer
859 configuration's X visual is of type GrayScale */
860 #if TARGET_HOST_POSIX_X11
864 case 25 : /* "xstaticcolor": */
865 case 31 : /* "xstaticcolour": boolean indicating if the frame buffer
866 configuration's X visual is of type StaticColor */
867 #if TARGET_HOST_POSIX_X11
871 case 26 : /* "xpseudocolor": */
872 case 32 : /* "xpseudocolour": boolean indicating if the frame buffer
873 configuration's X visual is of type PseudoColor */
874 #if TARGET_HOST_POSIX_X11
878 case 27 : /* "xtruecolor": */
879 case 33 : /* "xtruecolour": boolean indicating if the frame buffer
880 configuration's X visual is of type TrueColor */
881 #if TARGET_HOST_POSIX_X11
885 case 28 : /* "xdirectcolor": */
886 case 34 : /* "xdirectcolour": boolean indicating if the frame buffer
887 configuration's X visual is of type DirectColor */
888 #if TARGET_HOST_POSIX_X11
892 case 35 : /* "borderless": windows should not have borders */
893 #if TARGET_HOST_POSIX_X11
897 case 36 : /* "aux": some number of aux buffers */
898 glut_state_flag |= GLUT_AUX;
901 case 37 : /* Unrecognized */
902 fgWarning ( "WARNING - Display string token not recognized: %s",
907 token = strtok ( NULL, " \t" );
912 /* We will make use of this value when creating a new OpenGL context... */
913 fgState.DisplayMode = glut_state_flag;
916 /*** END OF FILE ***/