From 7114ec3d7550f7fea7277a9f25b4d454b7ce7cf9 Mon Sep 17 00:00:00 2001 From: Morgan Christiansson Date: Tue, 16 Jun 2026 16:22:56 +0200 Subject: [PATCH 1/5] Allow window resizing --- CGame.h | 1 + CGame_Event.cpp | 19 ++++++++++++++++++- CGame_Init.cpp | 17 ++++++++++++++++- CIO/CControlContainer.h | 5 +++++ callbacks.cpp | 2 +- 5 files changed, 41 insertions(+), 3 deletions(-) diff --git a/CGame.h b/CGame.h index f1e74eb..d3d2f22 100644 --- a/CGame.h +++ b/CGame.h @@ -74,6 +74,7 @@ class CGame bool Init(); bool ReCreateWindow(); + void UpdateDisplaySize(unsigned width, unsigned height); void EventHandling(SDL_Event* Event); diff --git a/CGame_Event.cpp b/CGame_Event.cpp index 8799fcd..63bc3e5 100644 --- a/CGame_Event.cpp +++ b/CGame_Event.cpp @@ -63,7 +63,11 @@ void CGame::EventHandling(SDL_Event* Event) switch(Event->key.keysym.sym) { - case SDLK_F2: fullscreen = !fullscreen; break; + case SDLK_RETURN: + case SDLK_KP_ENTER: + if(Event->key.keysym.mod & KMOD_ALT) + fullscreen = !fullscreen; + break; #ifdef _ADMINMODE case SDLK_F3: // if CTRL and ALT are pressed @@ -377,6 +381,19 @@ void CGame::EventHandling(SDL_Event* Event) break; } + case SDL_WINDOWEVENT: + { + switch(Event->window.event) + { + case SDL_WINDOWEVENT_RESIZED: + { + UpdateDisplaySize(Event->window.data1, Event->window.data2); + } + break; + } + break; + } + case SDL_QUIT: Running = false; break; default: break; diff --git a/CGame_Init.cpp b/CGame_Init.cpp index 8c86271..6e1e183 100644 --- a/CGame_Init.cpp +++ b/CGame_Init.cpp @@ -5,6 +5,8 @@ #include "CGame.h" #include "CIO/CFile.h" +#include "CIO/CMenu.h" +#include "CIO/CWindow.h" #include "CMap.h" #include "CSurface.h" #include "SGE/sge_blib.h" @@ -22,7 +24,7 @@ bool CGame::ReCreateWindow() window_.reset(); window_.reset(SDL_CreateWindow("Return to the Roots Map editor [BETA]", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, GameResolution.x, GameResolution.y, - fullscreen ? SDL_WINDOW_FULLSCREEN : 0)); + fullscreen ? SDL_WINDOW_FULLSCREEN : SDL_WINDOW_RESIZABLE)); if(!window_) return false; renderer_.reset(SDL_CreateRenderer(window_.get(), -1, 0)); @@ -38,6 +40,19 @@ bool CGame::ReCreateWindow() return true; } +void CGame::UpdateDisplaySize(unsigned width, unsigned height) +{ + GameResolution.x = width; + GameResolution.y = height; + displayTexture_.reset(); + displayTexture_ = makeSdlTexture(renderer_, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, width, height); + Surf_Display = makeRGBSurface(width, height, true); + for(auto& menu : Menus) + menu->resetSurface(); + for(auto& wnd : Windows) + wnd->resetSurface(); +} + bool CGame::Init() { std::cout << "Return to the Roots Map editor\n"; diff --git a/CIO/CControlContainer.h b/CIO/CControlContainer.h index 6b23dbb..1f3f64a 100644 --- a/CIO/CControlContainer.h +++ b/CIO/CControlContainer.h @@ -68,6 +68,11 @@ class CControlContainer } void setWaste() { waste = true; } bool isWaste() const { return waste; } + void resetSurface() + { + surface.reset(); + needRender = true; + } // Methods CButton* addButton(void callback(int), int clickedParam, Uint16 x = 0, Uint16 y = 0, Uint16 w = 20, Uint16 h = 20, int color = BUTTON_GREY, const char* text = nullptr, int picture = -1); diff --git a/callbacks.cpp b/callbacks.cpp index 31ede4d..6cde216 100644 --- a/callbacks.cpp +++ b/callbacks.cpp @@ -611,7 +611,7 @@ void callback::EditorHelpMenu(int Param) "..............................F1"); SelectBoxHelp->addOption( "Window/" - "Fullscreen........................................................................................F2"); + "Fullscreen...................................................................................Alt+Enter"); SelectBoxHelp->addOption( "Zoom in/normal/out......................................................................F5/F6/" "F7"); From fd1baf996f3e60734ff882bbf3fdb5ced876fba5 Mon Sep 17 00:00:00 2001 From: Morgan Christiansson Date: Tue, 16 Jun 2026 22:44:47 +0200 Subject: [PATCH 2/5] Use Extent --- CGame.h | 2 +- CGame_Event.cpp | 2 +- CGame_Init.cpp | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CGame.h b/CGame.h index d3d2f22..31913fe 100644 --- a/CGame.h +++ b/CGame.h @@ -74,7 +74,7 @@ class CGame bool Init(); bool ReCreateWindow(); - void UpdateDisplaySize(unsigned width, unsigned height); + void UpdateDisplaySize(const Extent& newSize); void EventHandling(SDL_Event* Event); diff --git a/CGame_Event.cpp b/CGame_Event.cpp index 63bc3e5..6b3f5da 100644 --- a/CGame_Event.cpp +++ b/CGame_Event.cpp @@ -387,7 +387,7 @@ void CGame::EventHandling(SDL_Event* Event) { case SDL_WINDOWEVENT_RESIZED: { - UpdateDisplaySize(Event->window.data1, Event->window.data2); + UpdateDisplaySize(Extent(Event->window.data1, Event->window.data2)); } break; } diff --git a/CGame_Init.cpp b/CGame_Init.cpp index 6e1e183..d420ccb 100644 --- a/CGame_Init.cpp +++ b/CGame_Init.cpp @@ -40,13 +40,13 @@ bool CGame::ReCreateWindow() return true; } -void CGame::UpdateDisplaySize(unsigned width, unsigned height) +void CGame::UpdateDisplaySize(const Extent& newSize) { - GameResolution.x = width; - GameResolution.y = height; + GameResolution = newSize; displayTexture_.reset(); - displayTexture_ = makeSdlTexture(renderer_, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, width, height); - Surf_Display = makeRGBSurface(width, height, true); + displayTexture_ = + makeSdlTexture(renderer_, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, newSize.x, newSize.y); + Surf_Display = makeRGBSurface(newSize.x, newSize.y, true); for(auto& menu : Menus) menu->resetSurface(); for(auto& wnd : Windows) From a345d21598478d40f19762a0f2e60f95d985a649 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 18 Jun 2026 20:00:43 +0200 Subject: [PATCH 3/5] Single case switch -> if --- CGame_Event.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/CGame_Event.cpp b/CGame_Event.cpp index 6b3f5da..ed586df 100644 --- a/CGame_Event.cpp +++ b/CGame_Event.cpp @@ -383,13 +383,9 @@ void CGame::EventHandling(SDL_Event* Event) case SDL_WINDOWEVENT: { - switch(Event->window.event) + if(Event->window.event == SDL_WINDOWEVENT_RESIZED) { - case SDL_WINDOWEVENT_RESIZED: - { - UpdateDisplaySize(Extent(Event->window.data1, Event->window.data2)); - } - break; + UpdateDisplaySize(Extent(Event->window.data1, Event->window.data2)); } break; } From 59fa89efae10dc02b1e18731aaca56c567574c16 Mon Sep 17 00:00:00 2001 From: Morgan Christiansson Date: Mon, 22 Jun 2026 20:15:18 +0200 Subject: [PATCH 4/5] RecreateDisplayResources() --- CGame.h | 1 + CGame_Init.cpp | 17 ++++++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/CGame.h b/CGame.h index 31913fe..e44aa6b 100644 --- a/CGame.h +++ b/CGame.h @@ -65,6 +65,7 @@ class CGame std::unique_ptr MapObj; void SetAppIcon(); + void RecreateDisplayResources(); public: CGame(Extent GameResolution_, bool fullscreen_); diff --git a/CGame_Init.cpp b/CGame_Init.cpp index d420ccb..f6a39ae 100644 --- a/CGame_Init.cpp +++ b/CGame_Init.cpp @@ -30,9 +30,7 @@ bool CGame::ReCreateWindow() renderer_.reset(SDL_CreateRenderer(window_.get(), -1, 0)); if(!renderer_) return false; - displayTexture_ = makeSdlTexture(renderer_, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, GameResolution.x, - GameResolution.y); - Surf_Display = makeRGBSurface(GameResolution.x, GameResolution.y, true); + RecreateDisplayResources(); if(!displayTexture_ || !Surf_Display) return false; @@ -40,13 +38,18 @@ bool CGame::ReCreateWindow() return true; } +void CGame::RecreateDisplayResources() +{ + displayTexture_.reset(); + displayTexture_ = makeSdlTexture(renderer_, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, GameResolution.x, + GameResolution.y); + Surf_Display = makeRGBSurface(GameResolution.x, GameResolution.y, true); +} + void CGame::UpdateDisplaySize(const Extent& newSize) { GameResolution = newSize; - displayTexture_.reset(); - displayTexture_ = - makeSdlTexture(renderer_, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, newSize.x, newSize.y); - Surf_Display = makeRGBSurface(newSize.x, newSize.y, true); + RecreateDisplayResources(); for(auto& menu : Menus) menu->resetSurface(); for(auto& wnd : Windows) From e40eab963acc5ee0a8d9cb274682a86b00d96549 Mon Sep 17 00:00:00 2001 From: Morgan Christiansson Date: Mon, 22 Jun 2026 21:09:50 +0200 Subject: [PATCH 5/5] Fix Linux resolution switching --- CGame.h | 1 + CGame_Event.cpp | 5 +++++ CGame_Init.cpp | 1 + CGame_Render.cpp | 1 + 4 files changed, 8 insertions(+) diff --git a/CGame.h b/CGame.h index e44aa6b..20e66c8 100644 --- a/CGame.h +++ b/CGame.h @@ -42,6 +42,7 @@ class CGame CFont lastFps; Uint32 lastFrameTime = 0; + unsigned suppressResizeEvents_ = 0; // structure for mouse cursor struct diff --git a/CGame_Event.cpp b/CGame_Event.cpp index ed586df..2292f5d 100644 --- a/CGame_Event.cpp +++ b/CGame_Event.cpp @@ -385,6 +385,11 @@ void CGame::EventHandling(SDL_Event* Event) { if(Event->window.event == SDL_WINDOWEVENT_RESIZED) { + if(suppressResizeEvents_ > 0) + { + suppressResizeEvents_--; + break; // Skip stale event from our own window recreation + } UpdateDisplaySize(Extent(Event->window.data1, Event->window.data2)); } break; diff --git a/CGame_Init.cpp b/CGame_Init.cpp index f6a39ae..8341fa9 100644 --- a/CGame_Init.cpp +++ b/CGame_Init.cpp @@ -19,6 +19,7 @@ bool CGame::ReCreateWindow() { + suppressResizeEvents_ = 3; displayTexture_.reset(); renderer_.reset(); window_.reset(); diff --git a/CGame_Render.cpp b/CGame_Render.cpp index d4c0bfd..a8ff988 100644 --- a/CGame_Render.cpp +++ b/CGame_Render.cpp @@ -39,6 +39,7 @@ void CGame::SetAppIcon() void CGame::Render() { + suppressResizeEvents_ = 0; if(Extent(Surf_Display->w, Surf_Display->h) != GameResolution || fullscreen != ((SDL_GetWindowFlags(window_.get()) & SDL_WINDOW_FULLSCREEN) != 0)) {