Skip to content

Commit 4bc0c14

Browse files
RecreateDisplayResources() and fix Linux res switching
1 parent a345d21 commit 4bc0c14

4 files changed

Lines changed: 19 additions & 7 deletions

File tree

CGame.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class CGame
4242
CFont lastFps;
4343

4444
Uint32 lastFrameTime = 0;
45+
unsigned suppressResizeEvents_ = 0;
4546

4647
// structure for mouse cursor
4748
struct
@@ -65,6 +66,7 @@ class CGame
6566
std::unique_ptr<CMap> MapObj;
6667

6768
void SetAppIcon();
69+
void RecreateDisplayResources();
6870

6971
public:
7072
CGame(Extent GameResolution_, bool fullscreen_);

CGame_Event.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,11 @@ void CGame::EventHandling(SDL_Event* Event)
385385
{
386386
if(Event->window.event == SDL_WINDOWEVENT_RESIZED)
387387
{
388+
if(suppressResizeEvents_ > 0)
389+
{
390+
suppressResizeEvents_--;
391+
break; // Skip stale event from our own window recreation
392+
}
388393
UpdateDisplaySize(Extent(Event->window.data1, Event->window.data2));
389394
}
390395
break;

CGame_Init.cpp

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
bool CGame::ReCreateWindow()
2121
{
22+
suppressResizeEvents_ = 3;
2223
displayTexture_.reset();
2324
renderer_.reset();
2425
window_.reset();
@@ -30,23 +31,26 @@ bool CGame::ReCreateWindow()
3031
renderer_.reset(SDL_CreateRenderer(window_.get(), -1, 0));
3132
if(!renderer_)
3233
return false;
33-
displayTexture_ = makeSdlTexture(renderer_, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, GameResolution.x,
34-
GameResolution.y);
35-
Surf_Display = makeRGBSurface(GameResolution.x, GameResolution.y, true);
34+
RecreateDisplayResources();
3635
if(!displayTexture_ || !Surf_Display)
3736
return false;
3837

3938
SetAppIcon();
4039
return true;
4140
}
4241

42+
void CGame::RecreateDisplayResources()
43+
{
44+
displayTexture_.reset();
45+
displayTexture_ = makeSdlTexture(renderer_, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, GameResolution.x,
46+
GameResolution.y);
47+
Surf_Display = makeRGBSurface(GameResolution.x, GameResolution.y, true);
48+
}
49+
4350
void CGame::UpdateDisplaySize(const Extent& newSize)
4451
{
4552
GameResolution = newSize;
46-
displayTexture_.reset();
47-
displayTexture_ =
48-
makeSdlTexture(renderer_, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, newSize.x, newSize.y);
49-
Surf_Display = makeRGBSurface(newSize.x, newSize.y, true);
53+
RecreateDisplayResources();
5054
for(auto& menu : Menus)
5155
menu->resetSurface();
5256
for(auto& wnd : Windows)

CGame_Render.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ void CGame::SetAppIcon()
3939

4040
void CGame::Render()
4141
{
42+
suppressResizeEvents_ = 0;
4243
if(Extent(Surf_Display->w, Surf_Display->h) != GameResolution
4344
|| fullscreen != ((SDL_GetWindowFlags(window_.get()) & SDL_WINDOW_FULLSCREEN) != 0))
4445
{

0 commit comments

Comments
 (0)