diff options
-rw-r--r-- | backends/events/sdl/sdl-events.cpp | 13 | ||||
-rw-r--r-- | backends/platform/sdl/sdl-window.cpp | 8 |
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; |