From 86d6647b4eff6555545e664ac24c30f7362d43af Mon Sep 17 00:00:00 2001 From: Patryk Obara Date: Tue, 7 Apr 2020 14:04:47 +0200 Subject: [PATCH] Improved windowresolution handling Move the code to a separate function to make it easier to understand and modify. Remove traces of windowresolution=X% support - this option causes more harm than benefit. Add bound checks to prevent user from setting up window size bigger then configured display allows. --- src/gui/sdlmain.cpp | 68 ++++++++++++++++++++++++++++++--------------- 1 file changed, 45 insertions(+), 23 deletions(-) diff --git a/src/gui/sdlmain.cpp b/src/gui/sdlmain.cpp index 083187ab..2718304b 100644 --- a/src/gui/sdlmain.cpp +++ b/src/gui/sdlmain.cpp @@ -1818,6 +1818,49 @@ static void DisplaySplash(uint32_t time_ms) SDL_Delay(time_ms); } +/* For some preference values, we can safely remove comment after # character + */ +static std::string NormalizeConfValue(const char *val) +{ + std::string pref = val; + const auto comment_pos = pref.find('#'); + if (comment_pos != std::string::npos) + pref.erase(comment_pos); + trim(pref); + lowcase(pref); + return pref; +} + +static void SetupWindowResolution(const char *val) +{ + assert(sdl.display_number >= 0); + std::string pref = NormalizeConfValue(val); + + if (pref == "original" || pref.empty()) { + sdl.desktop.window.use_original_size = true; + return; + } + + int w = 0; + int h = 0; + // sscanf won't parse suffix after second integer + if (sscanf(pref.c_str(), "%dx%d", &w, &h) == 2) { + SDL_Rect bounds; + SDL_GetDisplayBounds(sdl.display_number, &bounds); + if (w > 0 && h > 0 && w <= bounds.w && h <= bounds.h) { + sdl.desktop.window.use_original_size = false; + sdl.desktop.window.width = w; + sdl.desktop.window.height = h; + return; + } + } + + LOG_MSG("MAIN: 'windowresolution = %s' is not a valid setting, using " + "'original' instead", + pref.c_str()); + sdl.desktop.window.use_original_size = true; +} + //extern void UI_Run(bool); void Restart(bool pressed); @@ -1875,29 +1918,6 @@ static void GUI_StartUp(Section * sec) { } } } - Bit16u windowspercentage = 0; - const char* windowresolution=section->Get_string("windowresolution"); - if(windowresolution && *windowresolution) { - char res[100]; - safe_strncpy( res,windowresolution, sizeof( res )); - windowresolution = lowcase (res);//so x and X are allowed - if(strcmp(windowresolution,"original")) { - sdl.desktop.window.use_original_size = false; - char* height = const_cast(strchr(windowresolution,'x')); - if(height && *height) { - *height = 0; - sdl.desktop.window.height = (Bit16u)atoi(height+1); - sdl.desktop.window.width = (Bit16u)atoi(res); - } else { - char* percentage = const_cast(strchr(windowresolution,'%')); - if(percentage && *percentage) { - *percentage = 0; - windowspercentage = (Bit16u) atoi(res); - if (windowspercentage) putenv(const_cast("SDL_VIDEO_CENTERED=1")); - } - } - } - } // TODO vsync option is disabled for the time being, as it does not work // correctly and is causing serious bugs. @@ -1911,6 +1931,8 @@ static void GUI_StartUp(Section * sec) { sdl.display_number = 0; } + SetupWindowResolution(section->Get_string("windowresolution")); + sdl.desktop.full.display_res = sdl.desktop.full.fixed && (!sdl.desktop.full.width || !sdl.desktop.full.height); if (sdl.desktop.full.display_res) { GFX_ObtainDisplayDimensions();