+ * Changes to requested devmode, if it doesn't match current mode
+ */
+GLboolean fghPlatformChangeDisplayMode(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;
+}
+
+/*