aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backends/events/sdl/sdl-events.cpp13
-rw-r--r--backends/platform/sdl/sdl-window.cpp8
2 files changed, 20 insertions, 1 deletions
diff --git a/backends/events/sdl/sdl-events.cpp b/backends/events/sdl/sdl-events.cpp
index 946a1af23f..fb5a4c9b09 100644
--- a/backends/events/sdl/sdl-events.cpp
+++ b/backends/events/sdl/sdl-events.cpp
@@ -589,7 +589,18 @@ bool SdlEventSource::dispatchSDLEvent(SDL_Event &ev, Common::Event &event) {
_graphicsManager->notifyVideoExpose();
return false;
- case SDL_WINDOWEVENT_RESIZED:
+ // SDL2 documentation indicate that SDL_WINDOWEVENT_SIZE_CHANGED is sent either as a result
+ // of the size being changed by an external event (for example the user resizing the window
+ // or going fullscreen) or a call to the SDL API (for example SDL_SetWindowSize). On the
+ // other hand SDL_WINDOWEVENT_RESIZED is only sent for resize resulting from an external event,
+ // and is always preceded by a SDL_WINDOWEVENT_SIZE_CHANGED event.
+ // We need to handle the programmatic resize as well so that the graphics manager always know
+ // the current size. See comments in SdlWindow::createOrUpdateWindow for details of one case
+ // where we need to call SDL_SetWindowSize and we need the resulting event to be processed.
+ // However if the documentation is correct we can ignore SDL_WINDOWEVENT_RESIZED since when we
+ // get one we should always get a SDL_WINDOWEVENT_SIZE_CHANGED as well.
+ case SDL_WINDOWEVENT_SIZE_CHANGED:
+ //case SDL_WINDOWEVENT_RESIZED:
return handleResizeEvent(event, ev.window.data1, ev.window.data2);
default:
diff --git a/backends/platform/sdl/sdl-window.cpp b/backends/platform/sdl/sdl-window.cpp
index c48876a002..bdffa240c3 100644
--- a/backends/platform/sdl/sdl-window.cpp
+++ b/backends/platform/sdl/sdl-window.cpp
@@ -253,6 +253,14 @@ bool SdlWindow::createOrUpdateWindow(int width, int height, uint32 flags) {
return false;
}
+ // In some cases at this point there may be a pending SDL resize event with the old size.
+ // This happens for example if we destroyed the window, or when switching between windowed
+ // and fullscreen modes. If we changed the window size here, this pending event will have the
+ // old (and incorrect) size. To avoid any issue we call SDL_SetWindowSize() to generate another
+ // resize event (SDL_WINDOWEVENT_SIZE_CHANGED) so that the last resize event we receive has
+ // the correct size. This fixes for exmample bug #9971: SDL2: Fullscreen to RTL launcher resolution
+ SDL_SetWindowSize(_window, width, height);
+
_lastFlags = flags;
return true;