diff options
author | Thorbjørn Lindeijer <bjorn@lindeijer.nl> | 2025-08-12 11:41:31 +0200 |
---|---|---|
committer | Thorbjørn Lindeijer <bjorn@lindeijer.nl> | 2025-08-12 11:41:35 +0200 |
commit | 5bf467c630f8a6c3d90f9df7df800f8ce6c5b7e8 (patch) | |
tree | 41c1ccfc7a9c3946446e7f42a9b5c4ce9dd61d0f | |
parent | 91f2c508390c2344a44d2959708f95001afdb8ff (diff) | |
download | mana-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.cpp | 2 | ||||
-rw-r--r-- | src/openglgraphics.cpp | 1 | ||||
-rw-r--r-- | src/sdlgraphics.cpp | 1 | ||||
-rw-r--r-- | src/video.cpp | 12 | ||||
-rw-r--r-- | src/video.h | 6 |
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; }; |