summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThorbjørn Lindeijer <bjorn@lindeijer.nl>2025-08-12 11:41:31 +0200
committerThorbjørn Lindeijer <bjorn@lindeijer.nl>2025-08-12 11:41:35 +0200
commit5bf467c630f8a6c3d90f9df7df800f8ce6c5b7e8 (patch)
tree41c1ccfc7a9c3946446e7f42a9b5c4ce9dd61d0f
parent91f2c508390c2344a44d2959708f95001afdb8ff (diff)
downloadmana-5bf467c630f8a6c3d90f9df7df800f8ce6c5b7e8.tar.gz
mana-5bf467c630f8a6c3d90f9df7df800f8ce6c5b7e8.tar.bz2
mana-5bf467c630f8a6c3d90f9df7df800f8ce6c5b7e8.tar.xz
mana-5bf467c630f8a6c3d90f9df7df800f8ce6c5b7e8.zip
Work around issue with minimizing maximized windows
Only call `SDL_ShowWindow` once, since it seems old SDL versions (like 2.30.0, shipping with Ubuntu 24.04) do not allow a maximized window to be minimized when `SDL_ShowWindow` is called each frame.
-rw-r--r--src/client.cpp2
-rw-r--r--src/openglgraphics.cpp1
-rw-r--r--src/sdlgraphics.cpp1
-rw-r--r--src/video.cpp12
-rw-r--r--src/video.h6
5 files changed, 19 insertions, 3 deletions
diff --git a/src/client.cpp b/src/client.cpp
index 7c8763a1..e2669d1e 100644
--- a/src/client.cpp
+++ b/src/client.cpp
@@ -531,7 +531,7 @@ void Client::update()
{
frame_count++;
gui->draw();
- graphics->updateScreen();
+ mVideo.present();
mFpsManager.limitFps(config.fpsLimit);
}
else
diff --git a/src/openglgraphics.cpp b/src/openglgraphics.cpp
index 667c91e8..df150f0e 100644
--- a/src/openglgraphics.cpp
+++ b/src/openglgraphics.cpp
@@ -542,7 +542,6 @@ void OpenGLGraphics::drawRescaledImagePattern(const Image *image,
void OpenGLGraphics::updateScreen()
{
SDL_GL_SwapWindow(mWindow);
- SDL_ShowWindow(mWindow);
/*
* glFinish flushes all OpenGL commands and makes sure they have been
diff --git a/src/sdlgraphics.cpp b/src/sdlgraphics.cpp
index 371288e1..b0980675 100644
--- a/src/sdlgraphics.cpp
+++ b/src/sdlgraphics.cpp
@@ -215,7 +215,6 @@ void SDLGraphics::drawRescaledImagePattern(const Image *image,
void SDLGraphics::updateScreen()
{
SDL_RenderPresent(mRenderer);
- SDL_ShowWindow(mWindow);
}
void SDLGraphics::windowToLogical(int windowX, int windowY,
diff --git a/src/video.cpp b/src/video.cpp
index c71a9097..bdc52eb4 100644
--- a/src/video.cpp
+++ b/src/video.cpp
@@ -119,6 +119,7 @@ Graphics *Video::initialize(const VideoSettings &settings)
mSettings.height,
videoMode);
+ mWindowShown = !(windowFlags & SDL_WINDOW_HIDDEN);
mWindow = SDL_CreateWindow("Mana",
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
@@ -250,6 +251,17 @@ void Video::updateWindowSize()
mSettings.scale());
}
+void Video::present()
+{
+ mGraphics->updateScreen();
+
+ if (!mWindowShown)
+ {
+ SDL_ShowWindow(mWindow);
+ mWindowShown = true;
+ }
+}
+
bool Video::initDisplayModes()
{
const int displayIndex = mSettings.display;
diff --git a/src/video.h b/src/video.h
index 03e0dc4f..313e6006 100644
--- a/src/video.h
+++ b/src/video.h
@@ -93,6 +93,11 @@ public:
*/
void updateWindowSize();
+ /**
+ * Present the next frame.
+ */
+ void present();
+
const DisplayMode &desktopDisplayMode() const
{
return mDesktopDisplayMode;
@@ -111,4 +116,5 @@ private:
std::vector<DisplayMode> mDisplayModes;
std::unique_ptr<Graphics> mGraphics;
SDL_Window *mWindow = nullptr;
+ bool mWindowShown = false;
};