From 0bd401d22e15b8abb6cbebe6037f36f705b5c19d Mon Sep 17 00:00:00 2001
From: Frank Praznik <[EMAIL REDACTED]>
Date: Sun, 16 Nov 2025 22:26:26 -0500
Subject: [PATCH] Match SDL2 renderer viewport resize behavior
SDL2 resets the renderer viewport rect on window resize events when logical presentation is disabled, while SDL3 will retain client set viewport dimensions until the client explicitly changes them. Reset the viewport dimensions when the window is resized and logical presentation is disabled to match SDL2 behavior.
---
src/sdl2_compat.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/src/sdl2_compat.c b/src/sdl2_compat.c
index 408bbe7..ad9334e 100644
--- a/src/sdl2_compat.c
+++ b/src/sdl2_compat.c
@@ -2886,6 +2886,7 @@ EventFilter3to2(void *userdata, SDL_Event *event3)
event2.window.data2 = event3->window.data2;
if (event2.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) {
+ SDL_Renderer *renderer;
SDL_Window *window = SDL3_GetWindowFromID(event3->window.windowID);
if (!window) {
break;
@@ -2894,6 +2895,18 @@ EventFilter3to2(void *userdata, SDL_Event *event3)
/* The size changed event has the window size, not pixel size */
SDL3_GetWindowSize(window, &event2.window.data1, &event2.window.data2);
+ /* SDL2 behavior is to reset the renderer viewport rect when the window is resized and
+ * logical presentation is disabled.
+ */
+ renderer = SDL_GetRenderer(window);
+ if (renderer) {
+ SDL_RendererLogicalPresentation mode;
+ if (SDL3_GetRenderLogicalPresentation(renderer, NULL, NULL, &mode) &&
+ mode == SDL_LOGICAL_PRESENTATION_DISABLED) {
+ SDL_RenderSetViewport(renderer, NULL);
+ }
+ }
+
/* Fixes queue overflow with resize events that aren't processed */
{
SDL_PropertiesID props = SDL3_GetWindowProperties(window);