*/
static void fghRememberState( void )
{
-#if TARGET_HOST_UNIX_X11
+#if TARGET_HOST_POSIX_X11
/*
* This highly depends on the XFree86 extensions,
*/
# endif
-#elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE
+#elif TARGET_HOST_MS_WINDOWS
/* DEVMODE devMode; */
/* hack to get around my stupid cross-gcc headers */
#define FREEGLUT_ENUM_CURRENT_SETTINGS -1
- EnumDisplaySettings( NULL, FREEGLUT_ENUM_CURRENT_SETTINGS,
+ EnumDisplaySettings( fgDisplay.DisplayName, FREEGLUT_ENUM_CURRENT_SETTINGS,
&fgDisplay.DisplayMode );
/* Make sure we will be restoring all settings needed */
*/
static void fghRestoreState( void )
{
-#if TARGET_HOST_UNIX_X11
+#if TARGET_HOST_POSIX_X11
# ifdef X_XF86VidModeGetAllModeLines
/* Restore the remembered pointer position: */
*/
# endif
-#elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE
+#elif TARGET_HOST_MS_WINDOWS
- /* Restore the previously rememebered desktop display settings */
- ChangeDisplaySettings( &fgDisplay.DisplayMode, 0 );
+ /* Restore the previously remembered desktop display settings */
+ ChangeDisplaySettingsEx( fgDisplay.DisplayName,&fgDisplay.DisplayMode, 0,0,0 );
#endif
}
-#if TARGET_HOST_UNIX_X11
+#if TARGET_HOST_POSIX_X11
#ifdef X_XF86VidModeGetAllModeLines
/*
displayModes[ i ]->vdisplay,
fgState.GameModeDepth,
( exactMatch ? refresh : fgState.GameModeRefresh ) ) ) {
+ if (!exactMatch)
+ {
+ /* Update the chosen refresh rate, otherwise a
+ * glutGameModeGet(GLUT_GAME_MODE_REFRESH_RATE) would not
+ * return the right values
+ */
+ fgState.GameModeRefresh = refresh;
+ }
+
return i;
}
}
static GLboolean fghChangeDisplayMode( GLboolean haveToTest )
{
GLboolean success = GL_FALSE;
-#if TARGET_HOST_UNIX_X11
+#if TARGET_HOST_POSIX_X11
/*
* This highly depends on the XFree86 extensions,
# endif
-#elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE
+#elif TARGET_HOST_MS_WINDOWS
DEVMODE devMode;
char *fggmstr = NULL;
success = GL_FALSE;
- EnumDisplaySettings( NULL, -1, &devMode );
- devMode.dmFields |= DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY;
+ EnumDisplaySettings( fgDisplay.DisplayName, -1, &devMode );
+ devMode.dmFields = 0;
- devMode.dmPelsWidth = fgState.GameModeSize.X;
- devMode.dmPelsHeight = fgState.GameModeSize.Y;
- devMode.dmBitsPerPel = fgState.GameModeDepth;
- devMode.dmDisplayFrequency = fgState.GameModeRefresh;
- devMode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY;
+ if (fgState.GameModeSize.X!=-1)
+ {
+ devMode.dmPelsWidth = fgState.GameModeSize.X;
+ devMode.dmFields |= DM_PELSWIDTH;
+ }
+ if (fgState.GameModeSize.Y!=-1)
+ {
+ devMode.dmPelsHeight = fgState.GameModeSize.Y;
+ devMode.dmFields |= DM_PELSHEIGHT;
+ }
+ if (fgState.GameModeDepth!=-1)
+ {
+ devMode.dmBitsPerPel = fgState.GameModeDepth;
+ devMode.dmFields |= DM_BITSPERPEL;
+ }
+ if (fgState.GameModeRefresh!=-1)
+ {
+ devMode.dmDisplayFrequency = fgState.GameModeRefresh;
+ devMode.dmFields |= DM_DISPLAYFREQUENCY;
+ }
- switch ( ChangeDisplaySettingsEx(NULL, &devMode, NULL, haveToTest ? CDS_TEST : CDS_FULLSCREEN , NULL) )
+ switch ( ChangeDisplaySettingsEx(fgDisplay.DisplayName, &devMode, NULL, haveToTest ? CDS_TEST : CDS_FULLSCREEN , NULL) )
{
case DISP_CHANGE_SUCCESSFUL:
success = GL_TRUE;
/* update vars in case if windows switched to proper mode */
- EnumDisplaySettings( NULL, FREEGLUT_ENUM_CURRENT_SETTINGS, &devMode );
+ EnumDisplaySettings( fgDisplay.DisplayName, FREEGLUT_ENUM_CURRENT_SETTINGS, &devMode );
fgState.GameModeSize.X = devMode.dmPelsWidth;
fgState.GameModeSize.Y = devMode.dmPelsHeight;
fgState.GameModeDepth = devMode.dmBitsPerPel;
*/
void FGAPIENTRY glutGameModeString( const char* string )
{
- int width = 640, height = 480, depth = 16, refresh = 72;
+ int width = -1, height = -1, depth = -1, refresh = -1;
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGameModeString" );
);
/* Hopefully it worked, and if not, we still have the default values */
- fgState.GameModeSize.X = width;
- fgState.GameModeSize.Y = height;
- fgState.GameModeDepth = depth;
- fgState.GameModeRefresh = refresh;
+ if ( width > 0 ) fgState.GameModeSize.X = width;
+ if ( height > 0 ) fgState.GameModeSize.Y = height;
+ if ( depth > 0 ) fgState.GameModeDepth = depth;
+ if ( refresh > 0 ) fgState.GameModeRefresh = refresh;
}
+
+
/*
* Enters the game mode
*/
{
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutEnterGameMode" );
- if( fgStructure.GameMode )
- fgAddToWindowDestroyList( fgStructure.GameMode );
+ if( fgStructure.GameModeWindow )
+ fgAddToWindowDestroyList( fgStructure.GameModeWindow );
else
fghRememberState( );
if( ! fghChangeDisplayMode( GL_FALSE ) )
{
fgWarning( "failed to change screen settings" );
- return FALSE;
+ return 0;
}
- fgStructure.GameMode = fgCreateWindow(
- NULL, "FREEGLUT", 0, 0,
- fgState.GameModeSize.X, fgState.GameModeSize.Y, GL_TRUE, GL_FALSE
+ fgStructure.GameModeWindow = fgCreateWindow(
+ NULL, "FREEGLUT", GL_TRUE, 0, 0,
+ GL_TRUE, fgState.GameModeSize.X, fgState.GameModeSize.Y,
+ GL_TRUE, GL_FALSE
);
- fgStructure.GameMode->State.Width = fgState.GameModeSize.X;
- fgStructure.GameMode->State.Height = fgState.GameModeSize.Y;
+ fgStructure.GameModeWindow->State.Width = fgState.GameModeSize.X;
+ fgStructure.GameModeWindow->State.Height = fgState.GameModeSize.Y;
+ fgStructure.GameModeWindow->State.NeedToResize = GL_TRUE;
- fgStructure.GameMode->State.IsGameMode = GL_TRUE;
-
-#if TARGET_HOST_UNIX_X11
+#if TARGET_HOST_POSIX_X11
/*
* Sync needed to avoid a real race, the Xserver must have really created
* the application which we have to aviod, so wait until it's viewable:
*/
while( GrabSuccess != XGrabPointer(
- fgDisplay.Display, fgStructure.GameMode->Window.Handle,
+ fgDisplay.Display, fgStructure.GameModeWindow->Window.Handle,
TRUE,
ButtonPressMask | ButtonReleaseMask | ButtonMotionMask
| PointerMotionMask,
GrabModeAsync, GrabModeAsync,
- fgStructure.GameMode->Window.Handle, None, CurrentTime) )
+ fgStructure.GameModeWindow->Window.Handle, None, CurrentTime) )
usleep( 100 );
/*
*/
XSetInputFocus(
fgDisplay.Display,
- fgStructure.GameMode->Window.Handle,
+ fgStructure.GameModeWindow->Window.Handle,
RevertToNone,
CurrentTime
);
/* Grab the keyboard, too */
XGrabKeyboard(
fgDisplay.Display,
- fgStructure.GameMode->Window.Handle,
+ fgStructure.GameModeWindow->Window.Handle,
FALSE,
GrabModeAsync, GrabModeAsync,
CurrentTime
#endif
- return TRUE;
+ return fgStructure.GameModeWindow->ID;
}
/*
{
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutLeaveGameMode" );
- freeglut_return_if_fail( fgStructure.GameMode );
-
- fgStructure.GameMode->State.IsGameMode = GL_FALSE;
+ freeglut_return_if_fail( fgStructure.GameModeWindow );
- fgAddToWindowDestroyList( fgStructure.GameMode );
- fgStructure.GameMode = NULL;
+ fgAddToWindowDestroyList( fgStructure.GameModeWindow );
+ fgStructure.GameModeWindow = NULL;
-#if TARGET_HOST_UNIX_X11
+#if TARGET_HOST_POSIX_X11
XUngrabPointer( fgDisplay.Display, CurrentTime );
XUngrabKeyboard( fgDisplay.Display, CurrentTime );
switch( eWhat )
{
case GLUT_GAME_MODE_ACTIVE:
- return !!fgStructure.GameMode;
+ return !!fgStructure.GameModeWindow;
case GLUT_GAME_MODE_POSSIBLE:
return fghChangeDisplayMode( GL_TRUE );
/*
* This is true if the game mode has been activated successfully..
*/
- return !!fgStructure.GameMode;
+ return !!fgStructure.GameModeWindow;
}
fgWarning( "Unknown gamemode get: %d", eWhat );