From f2af094c2b32baf5b605214f5451df5cc8f611a1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?C=C3=B4me=20Chilliet?= Date: Sun, 20 Nov 2016 18:18:51 +0800 Subject: [PATCH] Fixed resolution detection and handling --- Source/GameTick.cpp | 43 +++++++----------------- Source/OpenGL_Windows.cpp | 69 +++++++++++++++------------------------ 2 files changed, 37 insertions(+), 75 deletions(-) diff --git a/Source/GameTick.cpp b/Source/GameTick.cpp index e062d66..bcbce6e 100644 --- a/Source/GameTick.cpp +++ b/Source/GameTick.cpp @@ -44,6 +44,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "Menu.h" #include +#include using namespace std; using namespace Game; @@ -6009,7 +6010,7 @@ void Game::LoadMenu() } } -extern SDL_Rect **resolutions; +extern set> resolutions; void MenuTick() { @@ -6033,6 +6034,7 @@ void MenuTick() char sbuf[256]; if (Input::MouseClicked() && (selected >= 0)) { // handling of the left mouse clic in menus + set>::iterator newscreenresolution; switch (mainmenu) { case 1: case 2: @@ -6081,40 +6083,17 @@ void MenuTick() break; case 3: fireSound(); - bool isCustomResolution, found; switch (selected) { case 0: - isCustomResolution = true; - found = false; - for (int i = 0; (!found) && (resolutions[i]); i++) { - if ((resolutions[i]->w == screenwidth) && (resolutions[i]->h == screenwidth)) - isCustomResolution = false; - - if ((resolutions[i]->w == newscreenwidth) && (resolutions[i]->h == newscreenheight)) { - i++; - if (resolutions[i] != NULL) { - newscreenwidth = (int) resolutions[i]->w; - newscreenheight = (int) resolutions[i]->h; - } else if (isCustomResolution) { - if ((screenwidth == newscreenwidth) && (screenheight == newscreenheight)) { - newscreenwidth = (int) resolutions[0]->w; - newscreenheight = (int) resolutions[0]->h; - } else { - newscreenwidth = screenwidth; - newscreenheight = screenheight; - } - } else { - newscreenwidth = (int) resolutions[0]->w; - newscreenheight = (int) resolutions[0]->h; - } - found = true; - } - } - - if (!found) { - newscreenwidth = (int) resolutions[0]->w; - newscreenheight = (int) resolutions[0]->h; + newscreenresolution = resolutions.find(make_pair(newscreenwidth, newscreenheight)); + /* Next one (end() + 1 is also end() so the ++ is safe even if it was not found) */ + newscreenresolution++; + if (newscreenresolution == resolutions.end()) { + /* It was the last one (or not found), go back to the beginning */ + newscreenresolution = resolutions.begin(); } + newscreenwidth = newscreenresolution->first; + newscreenheight = newscreenresolution->second; break; case 1: newdetail++; diff --git a/Source/OpenGL_Windows.cpp b/Source/OpenGL_Windows.cpp index 433b8d1..dc30a03 100644 --- a/Source/OpenGL_Windows.cpp +++ b/Source/OpenGL_Windows.cpp @@ -65,6 +65,7 @@ extern float slomofreq; #include #include #include +#include #include "gamegl.h" #include "MacCompatibility.h" #include "Settings.h" @@ -78,7 +79,7 @@ extern SDL_Window *sdlwindow; using namespace std; -SDL_Rect **resolutions = NULL; +set> resolutions; Boolean SetUp (); void DoUpdate (); @@ -280,8 +281,6 @@ Boolean SetUp () DefaultSettings(); - const int displayIdx = 0; // !!! FIXME: other monitors? - if (!SDL_WasInit(SDL_INIT_VIDEO)) if (SDL_Init(SDL_INIT_VIDEO) == -1) { fprintf(stderr, "SDL_Init() failed: %s\n", SDL_GetError()); @@ -301,19 +300,19 @@ Boolean SetUp () return false; } - int count = 0; - const int nummodes = SDL_GetNumDisplayModes(displayIdx); - for (int i = 0; i < nummodes; i++) - { - SDL_DisplayMode mode; - if (SDL_GetDisplayMode(displayIdx, i, &mode) == -1) - continue; - if ((mode.w < 640) || (mode.h < 480)) - continue; // sane lower limit. - count++; + for (int displayIdx = 0; displayIdx < SDL_GetNumVideoDisplays(); ++displayIdx) { + for (int i = 0; i < SDL_GetNumDisplayModes(displayIdx); ++i) { + SDL_DisplayMode mode; + if (SDL_GetDisplayMode(displayIdx, i, &mode) == -1) + continue; + if ((mode.w < 640) || (mode.h < 480)) + continue; // sane lower limit. + pair resolution(mode.w, mode.h); + resolutions.insert(resolution); + } } - if (count == 0) { + if (resolutions.empty()) { const std::string error = "No suitable video resolutions found."; cerr << error << endl; SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Lugaru init failed!", error.c_str(), NULL); @@ -321,33 +320,11 @@ Boolean SetUp () return false; } - static SDL_Rect *resolutions_block = NULL; - resolutions_block = (SDL_Rect*) realloc(resolutions_block, sizeof (SDL_Rect) * count); - resolutions = (SDL_Rect**) realloc(resolutions, sizeof (SDL_Rect *) * (count + 1)); - if ((resolutions_block == NULL) || (resolutions == NULL)) { - SDL_Quit(); - fprintf(stderr, "Out of memory!\n"); - return false; - } - - resolutions[count--] = NULL; - for (int i = 0; count >= 0; i++, count--) { - /* FIXME - Pretty sure this should use nummodes and not count */ - SDL_DisplayMode mode; - if (SDL_GetDisplayMode(displayIdx, i, &mode) == -1) - continue; - if ((mode.w < 640) || (mode.h < 480)) - continue; // sane lower limit. - resolutions_block[count].x = resolutions_block[count].y = 0; - resolutions_block[count].w = mode.w; - resolutions_block[count].h = mode.h; - resolutions[count] = &resolutions_block[count]; - } - if (cmdline("showresolutions")) { - printf("Resolutions we think are okay:\n"); - for (int i = 0; resolutions[i]; i++) - printf(" %d x %d\n", (int) resolutions[i]->w, (int) resolutions[i]->h); + printf("Available resolutions:\n"); + for (auto resolution = resolutions.begin(); resolution != resolutions.end(); resolution++) { + printf(" %d x %d\n", (int) resolution->first, (int) resolution->second); + } } SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); @@ -359,7 +336,7 @@ Boolean SetUp () if (!cmdline("nomousegrab")) sdlflags |= SDL_WINDOW_INPUT_GRABBED; - sdlwindow = SDL_CreateWindow("Lugaru", SDL_WINDOWPOS_CENTERED_DISPLAY(displayIdx), SDL_WINDOWPOS_CENTERED_DISPLAY(displayIdx), + sdlwindow = SDL_CreateWindow("Lugaru", SDL_WINDOWPOS_CENTERED_DISPLAY(0), SDL_WINDOWPOS_CENTERED_DISPLAY(0), kContextWidth, kContextHeight, sdlflags); if (!sdlwindow) { @@ -367,13 +344,13 @@ Boolean SetUp () fprintf(stderr, "forcing 640x480...\n"); kContextWidth = 640; kContextHeight = 480; - sdlwindow = SDL_CreateWindow("Lugaru", SDL_WINDOWPOS_CENTERED_DISPLAY(displayIdx), SDL_WINDOWPOS_CENTERED_DISPLAY(displayIdx), + sdlwindow = SDL_CreateWindow("Lugaru", SDL_WINDOWPOS_CENTERED_DISPLAY(0), SDL_WINDOWPOS_CENTERED_DISPLAY(0), kContextWidth, kContextHeight, sdlflags); if (!sdlwindow) { fprintf(stderr, "SDL_CreateWindow() failed: %s\n", SDL_GetError()); fprintf(stderr, "forcing 640x480 windowed mode...\n"); sdlflags &= ~SDL_WINDOW_FULLSCREEN; - sdlwindow = SDL_CreateWindow("Lugaru", SDL_WINDOWPOS_CENTERED_DISPLAY(displayIdx), SDL_WINDOWPOS_CENTERED_DISPLAY(displayIdx), + sdlwindow = SDL_CreateWindow("Lugaru", SDL_WINDOWPOS_CENTERED_DISPLAY(0), SDL_WINDOWPOS_CENTERED_DISPLAY(0), kContextWidth, kContextHeight, sdlflags); if (!sdlwindow) { @@ -426,6 +403,12 @@ Boolean SetUp () newscreenwidth = screenwidth; newscreenheight = screenheight; + /* If saved resolution is not in the list, add it to the list (so that it’s selectable in the options) */ + pair startresolution(width,height); + if (resolutions.find(startresolution) == resolutions.end()) { + resolutions.insert(startresolution); + } + InitGame(); return true; -- 2.39.5