#include "Menu.h"
#include <algorithm>
+#include <set>
using namespace std;
using namespace Game;
}
}
-extern SDL_Rect **resolutions;
+extern set<pair<int,int>> resolutions;
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:
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++;
#include <string.h>
#include <fstream>
#include <iostream>
+#include <set>
#include "gamegl.h"
#include "MacCompatibility.h"
#include "Settings.h"
using namespace std;
-SDL_Rect **resolutions = NULL;
+set<pair<int,int>> resolutions;
Boolean SetUp ();
void DoUpdate ();
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());
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);
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);
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) {
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) {
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;