diff --git a/src/video/wincommon/SDL_lowvideo.h b/src/video/wincommon/SDL_lowvideo.h index b877946ee..52947114b 100644 --- a/src/video/wincommon/SDL_lowvideo.h +++ b/src/video/wincommon/SDL_lowvideo.h @@ -96,6 +96,7 @@ extern int mouse_relative; /* The GDI fullscreen mode currently active */ #ifndef NO_CHANGEDISPLAYSETTINGS +extern DEVMODE SDL_desktop_mode; extern DEVMODE SDL_fullscreen_mode; #endif diff --git a/src/video/wincommon/SDL_sysevents.c b/src/video/wincommon/SDL_sysevents.c index 805b543a9..d27d54208 100644 --- a/src/video/wincommon/SDL_sysevents.c +++ b/src/video/wincommon/SDL_sysevents.c @@ -68,6 +68,7 @@ int SDL_resizing = 0; int mouse_relative = 0; int posted = 0; #ifndef NO_CHANGEDISPLAYSETTINGS +DEVMODE SDL_desktop_mode; DEVMODE SDL_fullscreen_mode; #endif WORD *gamma_saved = NULL; diff --git a/src/video/windib/SDL_dibvideo.c b/src/video/windib/SDL_dibvideo.c index 09bbdf2e0..b6e03f88d 100644 --- a/src/video/windib/SDL_dibvideo.c +++ b/src/video/windib/SDL_dibvideo.c @@ -335,6 +335,9 @@ int DIB_VideoInit(_THIS, SDL_PixelFormat *vformat) DIB_CheckGamma(this); #ifndef NO_CHANGEDISPLAYSETTINGS + /* Query for the desktop resolution */ + EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &SDL_desktop_mode); + /* Query for the list of available video modes */ for ( i=0; EnumDisplaySettings(NULL, i, &settings); ++i ) { DIB_AddMode(this, settings.dmBitsPerPel, @@ -533,6 +536,7 @@ SDL_Surface *DIB_SetVideoMode(_THIS, SDL_Surface *current, /* Set fullscreen mode if appropriate */ if ( (flags & SDL_FULLSCREEN) == SDL_FULLSCREEN ) { DEVMODE settings; + BOOL changed; memset(&settings, 0, sizeof(DEVMODE)); settings.dmSize = sizeof(DEVMODE); @@ -540,7 +544,16 @@ SDL_Surface *DIB_SetVideoMode(_THIS, SDL_Surface *current, settings.dmPelsWidth = width; settings.dmPelsHeight = height; settings.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL; - if ( ChangeDisplaySettings(&settings, CDS_FULLSCREEN) == DISP_CHANGE_SUCCESSFUL ) { + if ( width <= SDL_desktop_mode.dmPelsWidth && height <= SDL_desktop_mode.dmPelsHeight ) { + settings.dmDisplayFrequency = SDL_desktop_mode.dmDisplayFrequency; + settings.dmFields |= DM_DISPLAYFREQUENCY; + } + changed = (ChangeDisplaySettings(&settings, CDS_FULLSCREEN) == DISP_CHANGE_SUCCESSFUL); + if ( ! changed && (settings.dmFields & DM_DISPLAYFREQUENCY) ) { + settings.dmFields &= ~DM_DISPLAYFREQUENCY; + changed = (ChangeDisplaySettings(&settings, CDS_FULLSCREEN) == DISP_CHANGE_SUCCESSFUL); + } + if ( changed ) { video->flags |= SDL_FULLSCREEN; SDL_fullscreen_mode = settings; } diff --git a/src/video/windx5/SDL_dx5video.c b/src/video/windx5/SDL_dx5video.c index ff1552bc7..015bff3ca 100644 --- a/src/video/windx5/SDL_dx5video.c +++ b/src/video/windx5/SDL_dx5video.c @@ -656,6 +656,14 @@ static HRESULT WINAPI EnumModes2(DDSURFACEDESC *desc, VOID *udata) int bpp = desc->ddpfPixelFormat.dwRGBBitCount; int refreshRate = desc->dwRefreshRate; #endif + int maxRefreshRate; + + if ( desc->dwWidth <= SDL_desktop_mode.dmPelsWidth && + desc->dwHeight <= SDL_desktop_mode.dmPelsHeight ) { + maxRefreshRate = SDL_desktop_mode.dmDisplayFrequency; + } else { + maxRefreshRate = 85; /* safe value? */ + } switch (bpp) { case 8: @@ -667,7 +675,7 @@ static HRESULT WINAPI EnumModes2(DDSURFACEDESC *desc, VOID *udata) enumlists[bpp]->r.w == (Uint16)desc->dwWidth && enumlists[bpp]->r.h == (Uint16)desc->dwHeight ) { if ( refreshRate > enumlists[bpp]->refreshRate && - refreshRate <= 85 /* safe value? */ ) { + refreshRate <= maxRefreshRate ) { enumlists[bpp]->refreshRate = refreshRate; #ifdef DDRAW_DEBUG fprintf(stderr, "New refresh rate for %d bpp: %dx%d at %d Hz\n", (bpp+1)*8, (int)desc->dwWidth, (int)desc->dwHeight, refreshRate); @@ -926,6 +934,11 @@ int DX5_VideoInit(_THIS, SDL_PixelFormat *vformat) GetDeviceCaps(hdc,BITSPIXEL); ReleaseDC(SDL_Window, hdc); +#ifndef NO_CHANGEDISPLAYSETTINGS + /* Query for the desktop resolution */ + EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &SDL_desktop_mode); +#endif + /* Enumerate the available fullscreen modes */ for ( i=0; iflags |= SDL_FULLSCREEN; SDL_fullscreen_mode = settings; }