Skip to content

Commit a95261c

Browse files
committed
Fix centering window in SDL2
Center on the usable size, not the full screen.
1 parent 02e55d8 commit a95261c

1 file changed

Lines changed: 27 additions & 12 deletions

File tree

extras/videoDrivers/SDL2/VideoSDL2.cpp

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

600607
void 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

617632
void VideoSDL2::UpdateCurrentDisplayMode()

0 commit comments

Comments
 (0)