GraphicsWindow: remove hardcoded logic from SetScreenMode

This commit is contained in:
sukibaby
2025-06-12 02:17:56 -07:00
committed by teejusb
parent 6618903907
commit dad8fdec35
+13 -4
View File
@@ -232,10 +232,12 @@ static void AdjustVideoModeParams( VideoModeParams &p )
* The refresh setting may be ignored. */ * The refresh setting may be ignored. */
RString GraphicsWindow::SetScreenMode( const VideoModeParams &p ) RString GraphicsWindow::SetScreenMode( const VideoModeParams &p )
{ {
const DWORD displaySettingsFlag = p.windowed ? CDS_RESET : CDS_FULLSCREEN;
if( p.windowed ) if( p.windowed )
{ {
// We're going windowed. If we were previously fullscreen, reset. // We're going windowed. If we were previously fullscreen, reset.
ChangeDisplaySettingsEx( p.sDisplayId.c_str(), nullptr, nullptr, 0, nullptr ); ChangeDisplaySettingsEx( p.sDisplayId.c_str(), nullptr, nullptr, displaySettingsFlag, nullptr );
return RString(); return RString();
} }
@@ -243,6 +245,14 @@ RString GraphicsWindow::SetScreenMode( const VideoModeParams &p )
DEVMODE DevMode; DEVMODE DevMode;
ZERO( DevMode ); ZERO( DevMode );
DevMode.dmSize = sizeof(DEVMODE); DevMode.dmSize = sizeof(DEVMODE);
// Run DevMode thru EnumDisplaySettings to ensure we only provide modes supported by the display driver.
if( !EnumDisplaySettings(p.sDisplayId.c_str(), ENUM_CURRENT_SETTINGS, &DevMode) )
{
LOG->Warn("EnumDisplaySettings failed for display: %s", p.sDisplayId.c_str());
return "Failed to retrieve current display settings.";
}
DevMode.dmPelsWidth = p.width; DevMode.dmPelsWidth = p.width;
DevMode.dmPelsHeight = p.height; DevMode.dmPelsHeight = p.height;
DevMode.dmBitsPerPel = p.bpp; DevMode.dmBitsPerPel = p.bpp;
@@ -253,13 +263,12 @@ RString GraphicsWindow::SetScreenMode( const VideoModeParams &p )
DevMode.dmDisplayFrequency = p.rate; DevMode.dmDisplayFrequency = p.rate;
DevMode.dmFields |= DM_DISPLAYFREQUENCY; DevMode.dmFields |= DM_DISPLAYFREQUENCY;
} }
ChangeDisplaySettingsEx(p.sDisplayId.c_str(), nullptr, nullptr, 0, nullptr);
int ret = ChangeDisplaySettingsEx( p.sDisplayId.c_str(), &DevMode, nullptr, CDS_FULLSCREEN, nullptr ); int ret = ChangeDisplaySettingsEx( p.sDisplayId.c_str(), &DevMode, nullptr, displaySettingsFlag, nullptr );
if( ret != DISP_CHANGE_SUCCESSFUL && (DevMode.dmFields & DM_DISPLAYFREQUENCY) ) if( ret != DISP_CHANGE_SUCCESSFUL && (DevMode.dmFields & DM_DISPLAYFREQUENCY) )
{ {
DevMode.dmFields &= ~DM_DISPLAYFREQUENCY; DevMode.dmFields &= ~DM_DISPLAYFREQUENCY;
ret = ChangeDisplaySettingsEx( p.sDisplayId.c_str(), &DevMode, nullptr, CDS_FULLSCREEN, nullptr ); ret = ChangeDisplaySettingsEx( p.sDisplayId.c_str(), &DevMode, nullptr, displaySettingsFlag, nullptr );
} }
// XXX: append error // XXX: append error