@@ -134,10 +134,11 @@ void VideoSDL2::UpdateCurrentSizes()
134134 SetNewSize (VideoMode (w, h), Extent (w2, h2));
135135}
136136
137- static VideoMode getDesktopSize (VideoMode fallback)
137+ static VideoMode getDesktopSize (SDL_Window* window, VideoMode fallback)
138138{
139+ const int display = window ? std::max (0 , SDL_GetWindowDisplayIndex (window)) : 0 ;
139140 SDL_DisplayMode dskSize;
140- if (CHECK_SDL (SDL_GetDesktopDisplayMode (0 , &dskSize)))
141+ if (CHECK_SDL (SDL_GetDesktopDisplayMode (display , &dskSize)))
141142 return VideoMode (dskSize.w , dskSize.h );
142143 return fallback;
143144}
@@ -180,7 +181,7 @@ bool VideoSDL2::CreateScreen(const std::string& title, const VideoMode size, Dis
180181 } else if (displayMode == DisplayMode::BorderlessWindow)
181182 {
182183 windowTypeFlag = SDL_WINDOW_BORDERLESS;
183- requestedSize = getDesktopSize (size);
184+ requestedSize = getDesktopSize (nullptr , size);
184185 } else if (displayMode.resizeable )
185186 windowTypeFlag = SDL_WINDOW_RESIZABLE;
186187
@@ -233,6 +234,8 @@ bool VideoSDL2::ResizeScreen(VideoMode newSize, DisplayMode displayMode)
233234 if (!initialized)
234235 return false ;
235236
237+ bool centerWindow = false ;
238+
236239 if (displayMode_ != displayMode)
237240 {
238241 if (displayMode_ == DisplayMode::Fullscreen || displayMode == DisplayMode::Fullscreen)
@@ -249,11 +252,10 @@ bool VideoSDL2::ResizeScreen(VideoMode newSize, DisplayMode displayMode)
249252 SDL_SetWindowBordered (window, static_cast <SDL_bool>(displayMode == DisplayMode::Windowed));
250253
251254 UpdateCurrentDisplayMode ();
252- if (displayMode_ != DisplayMode::Fullscreen)
253- MoveWindowToCenter ();
255+ centerWindow = true ;
254256 }
255257 if (displayMode_ == DisplayMode::BorderlessWindow)
256- newSize = getDesktopSize (newSize);
258+ newSize = getDesktopSize (nullptr , newSize);
257259 if (newSize != GetWindowSize ())
258260 {
259261 if (displayMode_ == DisplayMode::Fullscreen)
@@ -270,9 +272,14 @@ bool VideoSDL2::ResizeScreen(VideoMode newSize, DisplayMode displayMode)
270272 if (!CHECK_SDL (SDL_SetWindowDisplayMode (window, &target)))
271273 return false ;
272274 } else
275+ {
273276 SDL_SetWindowSize (window, newSize.width , newSize.height );
277+ centerWindow = true ;
278+ }
274279 UpdateCurrentSizes ();
275280 }
281+ if (centerWindow)
282+ MoveWindowToCenter ();
276283
277284 return true ;
278285}
@@ -599,19 +606,27 @@ void* VideoSDL2::GetMapPointer() const
599606
600607void VideoSDL2::MoveWindowToCenter ()
601608{
609+ SDL_PumpEvents (); // Let window system run update events/initialization
610+ const int display = window ? std::max (0 , SDL_GetWindowDisplayIndex (window)) : 0 ;
611+
602612 SDL_Rect usableBounds;
603- CHECK_SDL (SDL_GetDisplayUsableBounds (SDL_GetWindowDisplayIndex (window) , &usableBounds));
613+ CHECK_SDL (SDL_GetDisplayUsableBounds (display , &usableBounds));
604614 int top, left, bottom, right;
605615 if (!CHECK_SDL (SDL_GetWindowBordersSize (window, &top, &left, &bottom, &right)))
606616 top = left = bottom = right = 0 ;
607- usableBounds.w -= left + right;
608- usableBounds.h -= top + bottom;
609- if (usableBounds.w < GetWindowSize ().width || usableBounds.h < GetWindowSize ().height )
617+ auto wndOuterSize = GetWindowSize ();
618+ wndOuterSize.width += left + right;
619+ wndOuterSize.height += top + bottom;
620+ if (usableBounds.w < wndOuterSize.width || usableBounds.h < wndOuterSize.height )
610621 {
611- SDL_SetWindowSize (window, usableBounds.w , usableBounds.h );
622+ SDL_SetWindowSize (window, usableBounds.w - left - right , usableBounds.h - top - bottom );
612623 UpdateCurrentSizes ();
624+ wndOuterSize.width = usableBounds.w ;
625+ wndOuterSize.height = usableBounds.h ;
613626 }
614- SDL_SetWindowPosition (window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED);
627+ const int x = usableBounds.x + (usableBounds.w - wndOuterSize.width ) / 2 + left;
628+ const int y = usableBounds.y + (usableBounds.h - wndOuterSize.height ) / 2 + top;
629+ SDL_SetWindowPosition (window, x, y);
615630}
616631
617632void VideoSDL2::UpdateCurrentDisplayMode ()
0 commit comments