X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Fmswin%2Ffg_gamemode_mswin.c;h=389c20d7183dc890d2672fb0c61024250ee21c02;hb=bcf3fe1b4600eb9926d8d17a5a6cca363f0d3ee4;hp=3e5228d9519eefb836c7e7241e8b8c29f9d59454;hpb=5b3d339481bac6dbaeb599bffc1325f716585bfe;p=freeglut diff --git a/src/mswin/fg_gamemode_mswin.c b/src/mswin/fg_gamemode_mswin.c index 3e5228d..389c20d 100644 --- a/src/mswin/fg_gamemode_mswin.c +++ b/src/mswin/fg_gamemode_mswin.c @@ -1,5 +1,5 @@ /* - * freeglut_gamemode_mswin.c + * fg_gamemode_mswin.c * * The Windows-specific mouse cursor related stuff. * @@ -29,17 +29,101 @@ #include "../fg_internal.h" /* + * Changes to requested devmode, if it doesn't match current mode + */ +GLboolean fghChangeDisplayMode(GLboolean haveToTest, DEVMODE *devModeRequested) +{ + GLboolean success = GL_FALSE; + DEVMODE devModeCurrent; + char *fggmstr = NULL; + char displayMode[300]; + + /* Get current display mode */ + EnumDisplaySettings( fgDisplay.pDisplay.DisplayName, ENUM_CURRENT_SETTINGS, &devModeCurrent ); + /* Now see if requested matches current mode, then we're done + * There's only four fields we touch: + * - dmPelsWidth + * - dmPelsHeight + * - dmBitsPerPel + * - dmDisplayFrequency + */ + if (devModeCurrent.dmPelsWidth ==devModeRequested->dmPelsWidth && + devModeCurrent.dmPelsHeight ==devModeRequested->dmPelsHeight && + devModeCurrent.dmBitsPerPel ==devModeRequested->dmBitsPerPel && + devModeCurrent.dmDisplayFrequency==devModeRequested->dmDisplayFrequency) + { + if (!haveToTest) + { + /* update vars in case if actual switch was requested */ + EnumDisplaySettings( fgDisplay.pDisplay.DisplayName, ENUM_CURRENT_SETTINGS, &devModeCurrent ); + fgState.GameModeSize.X = devModeCurrent.dmPelsWidth; + fgState.GameModeSize.Y = devModeCurrent.dmPelsHeight; + fgState.GameModeDepth = devModeCurrent.dmBitsPerPel; + fgState.GameModeRefresh = devModeCurrent.dmDisplayFrequency; + } + + /* We're done */ + return GL_TRUE; + } + + + /* Ok, we do have a mode switch to perform/test */ + switch ( ChangeDisplaySettingsEx(fgDisplay.pDisplay.DisplayName, devModeRequested, NULL, haveToTest ? CDS_TEST : CDS_FULLSCREEN , NULL) ) + { + case DISP_CHANGE_SUCCESSFUL: + success = GL_TRUE; + + if (!haveToTest) + { + /* update vars in case if windows switched to proper mode */ + EnumDisplaySettings( fgDisplay.pDisplay.DisplayName, ENUM_CURRENT_SETTINGS, &devModeCurrent ); + fgState.GameModeSize.X = devModeCurrent.dmPelsWidth; + fgState.GameModeSize.Y = devModeCurrent.dmPelsHeight; + fgState.GameModeDepth = devModeCurrent.dmBitsPerPel; + fgState.GameModeRefresh = devModeCurrent.dmDisplayFrequency; + } + break; + case DISP_CHANGE_RESTART: + fggmstr = "The computer must be restarted for the graphics mode to work."; + break; + case DISP_CHANGE_BADFLAGS: + fggmstr = "An invalid set of flags was passed in."; + break; + case DISP_CHANGE_BADPARAM: + fggmstr = "An invalid parameter was passed in. This can include an invalid flag or combination of flags."; + break; + case DISP_CHANGE_FAILED: + fggmstr = "The display driver failed the specified graphics mode."; + break; + case DISP_CHANGE_BADMODE: + fggmstr = "The graphics mode is not supported."; + break; + default: + fggmstr = "Unknown error in graphics mode???"; /* dunno if it is possible, MSDN does not mention any other error */ + break; + } + + if ( !success ) + { + /* I'd rather get info whats going on in my program than wonder about */ + /* what magic happens behind my back, its lib for devels after all ;) */ + + /* append display mode to error to make things more informative */ + sprintf(displayMode,"%s Problem with requested mode: %lux%lu:%lu@%lu", fggmstr, devModeRequested->dmPelsWidth, devModeRequested->dmPelsHeight, devModeRequested->dmBitsPerPel, devModeRequested->dmDisplayFrequency); + fgWarning(displayMode); + } + + return success; +} + +/* * Remembers the current visual settings, so that * we can change them and restore later... */ void fgPlatformRememberState( void ) { /* Grab the current desktop settings... */ - - /* hack to get around my stupid cross-gcc headers */ - #define FREEGLUT_ENUM_CURRENT_SETTINGS -1 - - EnumDisplaySettings( fgDisplay.pDisplay.DisplayName, FREEGLUT_ENUM_CURRENT_SETTINGS, + EnumDisplaySettings( fgDisplay.pDisplay.DisplayName, ENUM_CURRENT_SETTINGS, &fgDisplay.pDisplay.DisplayMode ); /* Make sure we will be restoring all settings needed */ @@ -54,7 +138,7 @@ void fgPlatformRememberState( void ) void fgPlatformRestoreState( void ) { /* Restore the previously remembered desktop display settings */ - ChangeDisplaySettingsEx( fgDisplay.pDisplay.DisplayName,&fgDisplay.pDisplay.DisplayMode, 0,0,0 ); + fghChangeDisplayMode(GL_FALSE,&fgDisplay.pDisplay.DisplayMode); } @@ -65,14 +149,10 @@ void fgPlatformRestoreState( void ) */ GLboolean fgPlatformChangeDisplayMode( GLboolean haveToTest ) { - GLboolean success = GL_FALSE; DEVMODE devMode; - char *fggmstr = NULL; - char displayMode[300]; - - success = GL_FALSE; - EnumDisplaySettings( fgDisplay.pDisplay.DisplayName, -1, &devMode ); + /* Get current display mode */ + EnumDisplaySettings( fgDisplay.pDisplay.DisplayName, ENUM_CURRENT_SETTINGS, &devMode ); devMode.dmFields = 0; if (fgState.GameModeSize.X!=-1) @@ -96,52 +176,7 @@ GLboolean fgPlatformChangeDisplayMode( GLboolean haveToTest ) devMode.dmFields |= DM_DISPLAYFREQUENCY; } - switch ( ChangeDisplaySettingsEx(fgDisplay.pDisplay.DisplayName, &devMode, NULL, haveToTest ? CDS_TEST : CDS_FULLSCREEN , NULL) ) - { - case DISP_CHANGE_SUCCESSFUL: - success = GL_TRUE; - - if (!haveToTest) - { - /* update vars in case if windows switched to proper mode */ - EnumDisplaySettings( fgDisplay.pDisplay.DisplayName, 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: - fggmstr = "The computer must be restarted for the graphics mode to work."; - break; - case DISP_CHANGE_BADFLAGS: - fggmstr = "An invalid set of flags was passed in."; - break; - case DISP_CHANGE_BADPARAM: - fggmstr = "An invalid parameter was passed in. This can include an invalid flag or combination of flags."; - break; - case DISP_CHANGE_FAILED: - fggmstr = "The display driver failed the specified graphics mode."; - break; - case DISP_CHANGE_BADMODE: - fggmstr = "The graphics mode is not supported."; - break; - default: - fggmstr = "Unknown error in graphics mode???"; /* dunno if it is possible,MSDN does not mention any other error */ - break; - } - - if ( !success ) - { - /* 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 ;) */ - - /* append display mode to error to make things more informative */ - sprintf(displayMode,"%s Problem with requested mode: %ix%i:%i@%i", fggmstr, devMode.dmPelsWidth, devMode.dmPelsHeight, devMode.dmBitsPerPel, devMode.dmDisplayFrequency); - fgWarning(displayMode); - } - - return success; + return fghChangeDisplayMode(haveToTest, &devMode); } void fgPlatformEnterGameMode( void )