Window and resolution resize

- determines the size of the monitor
- starts the window with the resolution settings taken from the config.cpp.
- sets maximum size to monitor's resolution and minimum size to 800/600
- resizes the window to 800/600 (instead of using the size from the config.cpp)
- starts the game and determines the actual width/height of the game.
  If the game uses a resolution lower than 800/600 it upscales it, if is higher adjusts automatically
- Had to add a "firstrun" value/check to fix a strange behavior/bug? (when entering/exiting fullscreen) in linux.
This commit is contained in:
pk-2000 2021-09-01 20:04:27 +03:00 committed by GitHub
parent 12b824903c
commit a6bfcd4efe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 39 additions and 1 deletions

View File

@ -105,6 +105,8 @@ EventThread::EventThread()
showCursor(false) showCursor(false)
{} {}
SDL_DisplayMode dm = {0};
void EventThread::process(RGSSThreadData &rtData) void EventThread::process(RGSSThreadData &rtData)
{ {
SDL_Event event; SDL_Event event;
@ -119,6 +121,16 @@ void EventThread::process(RGSSThreadData &rtData)
#endif #endif
fullscreen = rtData.config.fullscreen; fullscreen = rtData.config.fullscreen;
int defScreenW, defScreenH;
defScreenW = rtData.config.defScreenW;
defScreenH = rtData.config.defScreenH;
SDL_GetDesktopDisplayMode(0, &dm);
SDL_SetWindowMaximumSize(win, dm.w, dm.h);
SDL_SetWindowMinimumSize(win, 800, 600);
SDL_SetWindowSize(win, 800, 600);
int defScreenW_new, defScreenH_new;
int firstrun;
firstrun = 0;
int toggleFSMod = rtData.config.anyAltToggleFS ? KMOD_ALT : KMOD_LALT; int toggleFSMod = rtData.config.anyAltToggleFS ? KMOD_ALT : KMOD_LALT;
fps.lastFrame = SDL_GetPerformanceCounter(); fps.lastFrame = SDL_GetPerformanceCounter();
@ -206,6 +218,16 @@ void EventThread::process(RGSSThreadData &rtData)
case SDL_WINDOWEVENT_SIZE_CHANGED : case SDL_WINDOWEVENT_SIZE_CHANGED :
winW = event.window.data1; winW = event.window.data1;
winH = event.window.data2; winH = event.window.data2;
if (firstrun == 1)
{
firstrun = 2;
SDL_SetWindowPosition(win, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED);
}
if (firstrun == 0)
{
firstrun = 1;
SDL_SetWindowPosition(win, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED);
}
windowSizeMsg.post(Vec2i(winW, winH)); windowSizeMsg.post(Vec2i(winW, winH));
resetInputStates(); resetInputStates();
@ -255,12 +277,27 @@ void EventThread::process(RGSSThreadData &rtData)
if (event.key.keysym.scancode == SDL_SCANCODE_RETURN && if (event.key.keysym.scancode == SDL_SCANCODE_RETURN &&
(event.key.keysym.mod & toggleFSMod)) (event.key.keysym.mod & toggleFSMod))
{ {
if (!fullscreen && firstrun < 2)
{
firstrun = 2;
SDL_SetWindowPosition(win, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED);
}
setFullscreen(win, !fullscreen); setFullscreen(win, !fullscreen);
if (!fullscreen && havePendingTitle) if (!fullscreen && havePendingTitle)
{ {
SDL_SetWindowTitle(win, pendingTitle); SDL_SetWindowTitle(win, pendingTitle);
pendingTitle[0] = '\0'; pendingTitle[0] = '\0';
havePendingTitle = false; havePendingTitle = false;
SDL_SetWindowSize(win, defScreenW_new, defScreenH_new);
}
else
{
SDL_SetWindowSize(win, defScreenW_new, defScreenH_new);
}
if (firstrun < 2)
{
firstrun = 2;
SDL_SetWindowPosition(win, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED);
} }
break; break;
@ -540,6 +577,7 @@ void EventThread::resetInputStates()
void EventThread::setFullscreen(SDL_Window *win, bool mode) void EventThread::setFullscreen(SDL_Window *win, bool mode)
{ {
SDL_GetDesktopDisplayMode(0, &dm);
SDL_SetWindowFullscreen SDL_SetWindowFullscreen
(win, mode ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0); (win, mode ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0);
fullscreen = mode; fullscreen = mode;