]> git.jsancho.org Git - lugaru.git/commitdiff
Fixed resolution detection and handling
authorCôme Chilliet <come@chilliet.eu>
Sun, 20 Nov 2016 10:18:51 +0000 (18:18 +0800)
committerCôme Chilliet <come@chilliet.eu>
Sun, 20 Nov 2016 10:18:51 +0000 (18:18 +0800)
Source/GameTick.cpp
Source/OpenGL_Windows.cpp

index e062d66eff2228332ce028e00edf10d87597f6d7..bcbce6e9bc9ce576118f70ddb4586c185fa1659c 100644 (file)
@@ -44,6 +44,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include "Menu.h"
 
 #include <algorithm>
+#include <set>
 
 using namespace std;
 using namespace Game;
@@ -6009,7 +6010,7 @@ void Game::LoadMenu()
     }
 }
 
-extern SDL_Rect **resolutions;
+extern set<pair<int,int>> 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<pair<int,int>>::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++;
index 433b8d134e55d0b25236cafa21889712b92895e6..dc30a03c41b04e4fd23c0fad8318f3ef40ca8e3b 100644 (file)
@@ -65,6 +65,7 @@ extern float slomofreq;
 #include <string.h>
 #include <fstream>
 #include <iostream>
+#include <set>
 #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<pair<int,int>> 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<int,int> 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<int,int> startresolution(width,height);
+    if (resolutions.find(startresolution) == resolutions.end()) {
+        resolutions.insert(startresolution);
+    }
+
     InitGame();
 
     return true;