X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_gamemode.c;h=54c924d14e9595ef60b1b9d65087964ad539bbe3;hb=c53cf940d32476bcf44a4f5e6414789954423ce5;hp=02218998217a392418dbf3d270846a5e9e021c89;hpb=78d46c63a115e0a868d83f365399864b62a4ea7f;p=freeglut diff --git a/src/freeglut_gamemode.c b/src/freeglut_gamemode.c index 0221899..54c924d 100644 --- a/src/freeglut_gamemode.c +++ b/src/freeglut_gamemode.c @@ -291,80 +291,66 @@ static GLboolean fghChangeDisplayMode( GLboolean haveToTest ) } # else + /* * XXX warning fghChangeDisplayMode: missing XFree86 video mode extensions, * XXX game mode will not change screen resolution when activated */ + success = GL_TRUE; + # endif #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; @@ -431,28 +417,19 @@ 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 - /* Move the window up to the topleft corner */ - XMoveWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle, 0, 0 ); - /* * Sync needed to avoid a real race, the Xserver must have really created * the window before we can grab the pointer into it: */ XSync( fgDisplay.Display, False ); - /* Move the Pointer to the middle of the fullscreen window */ - XWarpPointer( - fgDisplay.Display, - None, - fgDisplay.RootWindow, - 0, 0, 0, 0, - fgState.GameModeSize.X/2, fgState.GameModeSize.Y/2 - ); - /* * Grab the pointer to confine it into the window after the calls to * XWrapPointer() which ensure that the pointer really enters the window. @@ -482,6 +459,15 @@ int FGAPIENTRY glutEnterGameMode( void ) CurrentTime ); + /* Move the Pointer to the middle of the fullscreen window */ + XWarpPointer( + fgDisplay.Display, + None, + fgDisplay.RootWindow, + 0, 0, 0, 0, + fgState.GameModeSize.X/2, fgState.GameModeSize.Y/2 + ); + # ifdef X_XF86VidModeSetViewPort if( fgDisplay.DisplayModeValid )