diff --git a/CHANGELOG.md b/CHANGELOG.md index 6974fd46c9..c68e7b0f58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,7 @@ Bug #5502: Dead zone for analogue stick movement is too small Bug #5507: Sound volume is not clamped on ingame settings update Bug #5531: Actors flee using current rotation by axis x + Bug #5539: Window resize breaks when going from a lower resolution to full screen resolution Bug #5548: Certain exhausted topics can be highlighted again even though there's no new dialogue Feature #390: 3rd person look "over the shoulder" Feature #2386: Distant Statics in the form of Object Paging diff --git a/components/sdlutil/sdlvideowrapper.cpp b/components/sdlutil/sdlvideowrapper.cpp index c2963be861..57d1e2985c 100644 --- a/components/sdlutil/sdlvideowrapper.cpp +++ b/components/sdlutil/sdlvideowrapper.cpp @@ -88,7 +88,38 @@ namespace SDLUtil { SDL_SetWindowSize(mWindow, width, height); SDL_SetWindowBordered(mWindow, windowBorder ? SDL_TRUE : SDL_FALSE); + + centerWindow(); } } + void VideoWrapper::centerWindow() + { + // Resize breaks the sdl window in some cases; see issue: #5539 + SDL_Rect rect{}; + int x = 0; + int y = 0; + int w = 0; + int h = 0; + auto index = SDL_GetWindowDisplayIndex(mWindow); + bool reposition = false; + SDL_GetDisplayBounds(index, &rect); + SDL_GetWindowSize(mWindow, &w, &h); + + x = rect.x; + y = rect.y; + + // Center dimensions that do not fill the screen + if (w < rect.w) + { + x = rect.x + rect.w / 2 - w / 2; + } + if (h < rect.h) + { + y = rect.y + rect.h / 2 - h / 2; + } + + SDL_SetWindowPosition(mWindow, x, y); + } + } diff --git a/components/sdlutil/sdlvideowrapper.hpp b/components/sdlutil/sdlvideowrapper.hpp index 77f0b80393..3866c3ec31 100644 --- a/components/sdlutil/sdlvideowrapper.hpp +++ b/components/sdlutil/sdlvideowrapper.hpp @@ -27,6 +27,8 @@ namespace SDLUtil void setVideoMode(int width, int height, bool fullscreen, bool windowBorder); + void centerWindow(); + private: SDL_Window* mWindow; osg::ref_ptr mViewer;