SDL: Only pump events once per frame and process all currently pending events

From ce8261dd6da0f1588ed608f392632252c7a5e693 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Thu, 29 Jul 2021 06:36:20 -0700
Subject: [PATCH] Only pump events once per frame and process all currently
 pending events

If you continually poll for events it's possible that new events can come in while you're still processing the last one, delaying rendering. This is more likely with high update rate sensors.
---
 test/testgamecontroller.c | 6 +++++-
 test/testsensor.c         | 6 +++++-
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/test/testgamecontroller.c b/test/testgamecontroller.c
index 8a3ff92b08..b134e0e985 100644
--- a/test/testgamecontroller.c
+++ b/test/testgamecontroller.c
@@ -305,7 +305,11 @@ loop(void *arg)
     int i;
     SDL_bool showing_front = SDL_TRUE;
 
-    while (SDL_PollEvent(&event)) {
+    /* Update to get the current event state */
+    SDL_PumpEvents();
+
+    /* Process all currently pending events */
+    while (SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT) == 1) {
         switch (event.type) {
         case SDL_CONTROLLERDEVICEADDED:
             SDL_Log("Game controller device %d added.\n", (int) SDL_JoystickGetDeviceInstanceID(event.cdevice.which));
diff --git a/test/testsensor.c b/test/testsensor.c
index 48a2ef08f2..508bd14f8b 100644
--- a/test/testsensor.c
+++ b/test/testsensor.c
@@ -95,7 +95,11 @@ main(int argc, char **argv)
 
         SDL_CreateWindow("Sensor Test", 0, 0, 0, 0, SDL_WINDOW_FULLSCREEN_DESKTOP);
         while (!done) {
-            while (SDL_PollEvent(&event) > 0) {
+            /* Update to get the current event state */
+            SDL_PumpEvents();
+
+            /* Process all currently pending events */
+            while (SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT) == 1) {
                 switch (event.type) {
                 case SDL_SENSORUPDATE:
                     HandleSensorEvent(&event.sensor);