SDL: Fixed window flashing under X11 when creating a window and OpenGL renderer

From 04f1901751dd3ce54be8879f525d4cda33d6118d Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Thu, 25 Apr 2024 16:42:18 -0700
Subject: [PATCH] Fixed window flashing under X11 when creating a window and
 OpenGL renderer

---
 src/render/SDL_render.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c
index 4f92ea8988cfe..709141850ce25 100644
--- a/src/render/SDL_render.c
+++ b/src/render/SDL_render.c
@@ -828,6 +828,18 @@ static int SDLCALL SDL_RendererEventWatch(void *userdata, SDL_Event *event)
 
 int SDL_CreateWindowAndRenderer(int width, int height, SDL_WindowFlags window_flags, SDL_Window **window, SDL_Renderer **renderer)
 {
+    SDL_bool hidden = (window_flags & SDL_WINDOW_HIDDEN) != 0;
+
+    if (!window) {
+        return SDL_InvalidParamError("window");
+    }
+
+    if (!renderer) {
+        return SDL_InvalidParamError("renderer");
+    }
+
+    // Hide the window so if the renderer recreates it, we don't get a visual flash on screen
+    window_flags |= SDL_WINDOW_HIDDEN;
     *window = SDL_CreateWindow(NULL, width, height, window_flags);
     if (!*window) {
         *renderer = NULL;
@@ -836,9 +848,14 @@ int SDL_CreateWindowAndRenderer(int width, int height, SDL_WindowFlags window_fl
 
     *renderer = SDL_CreateRenderer(*window, NULL, 0);
     if (!*renderer) {
+        SDL_DestroyWindow(*window);
         return -1;
     }
 
+    if (!hidden) {
+        SDL_ShowWindow(*window);
+    }
+
     return 0;
 }