SDL: Update joysticks and so forth during live resize

From c975f77b0fd3c73ba70100db76771b2638638cc0 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Mon, 20 Jan 2025 09:45:23 -0800
Subject: [PATCH] Update joysticks and so forth during live resize

Fixes https://github.com/libsdl-org/SDL/issues/12022
---
 src/events/SDL_events.c   | 49 +++++++++++++++++++++------------------
 src/events/SDL_events_c.h |  2 ++
 src/video/SDL_video.c     |  6 +++--
 3 files changed, 33 insertions(+), 24 deletions(-)

diff --git a/src/events/SDL_events.c b/src/events/SDL_events.c
index c82fed18b7a48..ca11afffa36af 100644
--- a/src/events/SDL_events.c
+++ b/src/events/SDL_events.c
@@ -1354,29 +1354,8 @@ bool SDL_RunOnMainThread(SDL_MainThreadCallback callback, void *userdata, bool w
     }
 }
 
-// Run the system dependent event loops
-static void SDL_PumpEventsInternal(bool push_sentinel)
+void SDL_PumpEventMaintenance(void)
 {
-    // Free any temporary memory from old events
-    SDL_FreeTemporaryMemory();
-
-    // Release any keys held down from last frame
-    SDL_ReleaseAutoReleaseKeys();
-
-    // Run any pending main thread callbacks
-    SDL_RunMainThreadCallbacks();
-
-#ifdef SDL_PLATFORM_ANDROID
-    // Android event processing is independent of the video subsystem
-    Android_PumpEvents(0);
-#else
-    // Get events from the video subsystem
-    SDL_VideoDevice *_this = SDL_GetVideoDevice();
-    if (_this) {
-        _this->PumpEvents(_this);
-    }
-#endif
-
 #ifndef SDL_AUDIO_DISABLED
     SDL_UpdateAudio();
 #endif
@@ -1402,6 +1381,32 @@ static void SDL_PumpEventsInternal(bool push_sentinel)
     SDL_UpdateTrays();
 
     SDL_SendPendingSignalEvents(); // in case we had a signal handler fire, etc.
+}
+
+// Run the system dependent event loops
+static void SDL_PumpEventsInternal(bool push_sentinel)
+{
+    // Free any temporary memory from old events
+    SDL_FreeTemporaryMemory();
+
+    // Release any keys held down from last frame
+    SDL_ReleaseAutoReleaseKeys();
+
+    // Run any pending main thread callbacks
+    SDL_RunMainThreadCallbacks();
+
+#ifdef SDL_PLATFORM_ANDROID
+    // Android event processing is independent of the video subsystem
+    Android_PumpEvents(0);
+#else
+    // Get events from the video subsystem
+    SDL_VideoDevice *_this = SDL_GetVideoDevice();
+    if (_this) {
+        _this->PumpEvents(_this);
+    }
+#endif
+
+    SDL_PumpEventMaintenance();
 
     if (push_sentinel && SDL_EventEnabled(SDL_EVENT_POLL_SENTINEL)) {
         SDL_Event sentinel;
diff --git a/src/events/SDL_events_c.h b/src/events/SDL_events_c.h
index 041d714f51c12..e56ac475e5a20 100644
--- a/src/events/SDL_events_c.h
+++ b/src/events/SDL_events_c.h
@@ -51,6 +51,8 @@ extern const char *SDL_CreateTemporaryString(const char *string);
 extern void *SDL_ClaimTemporaryMemory(const void *mem);
 extern void SDL_FreeTemporaryMemory(void);
 
+extern void SDL_PumpEventMaintenance(void);
+
 extern void SDL_SendQuit(void);
 
 extern bool SDL_InitEvents(void);
diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c
index b896e99875b62..6acd400e0ef29 100644
--- a/src/video/SDL_video.c
+++ b/src/video/SDL_video.c
@@ -3951,6 +3951,8 @@ void SDL_OnWindowLiveResizeUpdate(SDL_Window *window)
         // Send an expose event so the application can redraw
         SDL_SendWindowEvent(window, SDL_EVENT_WINDOW_EXPOSED, 0, 0);
     }
+
+    SDL_PumpEventMaintenance();
 }
 
 static void SDL_CheckWindowSafeAreaChanged(SDL_Window *window)
@@ -4922,12 +4924,12 @@ bool SDL_GL_GetAttribute(SDL_GLAttr attr, int *value)
             if (glBindFramebufferFunc && (current_fbo != 0)) {
                 glBindFramebufferFunc(GL_DRAW_FRAMEBUFFER, 0);
             }
-            // glGetFramebufferAttachmentParameterivFunc may cause GL_INVALID_OPERATION when querying depth/stencil size if the 
+            // glGetFramebufferAttachmentParameterivFunc may cause GL_INVALID_OPERATION when querying depth/stencil size if the
             // bits is 0. From the GL docs:
             //      If the value of GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE is GL_NONE, then either no framebuffer is bound to target;
             //      or a default framebuffer is queried, attachment is GL_DEPTH or GL_STENCIL, and the number of depth or stencil bits,
             //      respectively, is zero. In this case querying pname GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero, and all
-            //      other queries will generate an error. 
+            //      other queries will generate an error.
             GLint fbo_type = GL_FRAMEBUFFER_DEFAULT;
             if (attachment == GL_DEPTH || attachment == GL_STENCIL) {
                 glGetFramebufferAttachmentParameterivFunc(GL_FRAMEBUFFER, attachment, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &fbo_type);