From: John F. Fay Date: Tue, 17 May 2005 16:50:30 +0000 (+0000) Subject: Misiek\'s changes to fix Game Mode--getting display settings under Windows X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=commitdiff_plain;h=c53cf940d32476bcf44a4f5e6414789954423ce5;p=freeglut Misiek\'s changes to fix Game Mode--getting display settings under Windows and setting the window size correctly on all operating systems. git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@612 7f0cb862-5218-0410-a997-914c9d46530a --- diff --git a/src/freeglut_gamemode.c b/src/freeglut_gamemode.c index 313f546..54c924d 100644 --- a/src/freeglut_gamemode.c +++ b/src/freeglut_gamemode.c @@ -302,72 +302,55 @@ static GLboolean fghChangeDisplayMode( GLboolean haveToTest ) #elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE - unsigned int displayModes = 0, mode = 0xffffffff; - /* HDC desktopDC; */ DEVMODE devMode; + char fggmstr[255]=""; - /* - * Enumerate the available display modes - * Try to get a complete match - */ - while( EnumDisplaySettings( NULL, displayModes, &devMode ) ) - { - /* Does the enumerated display mode match the user's preferences? */ - if( fghCheckDisplayMode( devMode.dmPelsWidth, devMode.dmPelsHeight, - devMode.dmBitsPerPel, - devMode.dmDisplayFrequency ) ) - { - mode = displayModes; - break; - } - displayModes++; - } + success = GL_FALSE; - if( mode == 0xffffffff ) - { - /* then try without Display Frequency */ - displayModes = 0; + EnumDisplaySettings( NULL, -1, &devMode ); + devMode.dmFields |= DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY; - /* Enumerate the available display modes */ - while( EnumDisplaySettings( NULL, displayModes, &devMode ) ) - { - /* then try without Display Frequency */ - if( fghCheckDisplayMode( devMode.dmPelsWidth, - devMode.dmPelsHeight, - devMode.dmBitsPerPel, - fgState.GameModeRefresh ) ) - { - mode = displayModes; - break; - } - displayModes++; - } - } + 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; - /* Did we find a matching display mode? */ - if( mode != 0xffffffff ) + switch ( ChangeDisplaySettingsEx(NULL, &devMode, NULL, haveToTest ? CDS_TEST : CDS_FULLSCREEN , NULL) ) { - int retVal = DISP_CHANGE_SUCCESSFUL; - - /* Mark the values we want to modify in the display change call */ - devMode.dmFields |= - DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY; - - retVal = ChangeDisplaySettings( &devMode, haveToTest ? CDS_TEST : 0 ); - - /* I don't know if it's really needed, but looks nice: */ - success = (retVal == DISP_CHANGE_SUCCESSFUL) || - (retVal == DISP_CHANGE_NOTUPDATED); - - if( !haveToTest && success ) - { - fgState.GameModeSize.X = devMode.dmPelsWidth; - fgState.GameModeSize.Y = devMode.dmPelsHeight; - fgState.GameModeDepth = devMode.dmBitsPerPel; - fgState.GameModeRefresh = devMode.dmDisplayFrequency; - } + case DISP_CHANGE_SUCCESSFUL: + success = GL_TRUE; + + // update vars in case if windows switched to proper mode + EnumDisplaySettings( NULL, FREEGLUT_ENUM_CURRENT_SETTINGS, &devMode ); + fgState.GameModeSize.X = devMode.dmPelsWidth; + fgState.GameModeSize.Y = devMode.dmPelsHeight; + fgState.GameModeDepth = devMode.dmBitsPerPel; + fgState.GameModeRefresh = devMode.dmDisplayFrequency; + break; + case DISP_CHANGE_RESTART: + strcpy(fggmstr,"The computer must be restarted for the graphics mode to work."); + break; + case DISP_CHANGE_BADFLAGS: + strcpy(fggmstr,"An invalid set of flags was passed in."); + break; + case DISP_CHANGE_BADPARAM: + strcpy(fggmstr,"An invalid parameter was passed in. This can include an invalid flag or combination of flags."); + break; + case DISP_CHANGE_FAILED: + strcpy(fggmstr,"The display driver failed the specified graphics mode."); + break; + case DISP_CHANGE_BADMODE: + strcpy(fggmstr,"The graphics mode is not supported."); + break; + default: + strcpy(fggmstr,"Unknown error in graphics mode???"); /* dunno if it is possible,MSDN does not mention any other error */ + break; } + if ( !success ) + fgWarning(fggmstr); /* I'd rather get info whats going on in my program than wonder about */ + /* magic happenings behind my back, its lib for devels at last ;) */ #endif return success; @@ -434,6 +417,9 @@ int FGAPIENTRY glutEnterGameMode( void ) 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.GameMode->State.IsGameMode = GL_TRUE; #if TARGET_HOST_UNIX_X11