fixed clearing off-screen areas in window mode after resizing window
authorHolger Schemel <info@artsoft.org>
Wed, 12 Feb 2025 19:02:57 +0000 (20:02 +0100)
committerHolger Schemel <info@artsoft.org>
Wed, 12 Feb 2025 19:03:05 +0000 (20:03 +0100)
src/events.c
src/libgame/sdl.c
src/libgame/sdl.h
src/libgame/system.c
src/libgame/system.h

index 3939deb97fc223b3607ae2ca65399797cbc1dbde..e331aac2b0857e210ebe1b5be8802cfc3e958dba 100644 (file)
@@ -667,6 +667,7 @@ void HandleWindowEvent(WindowEvent *event)
        UpdateMousePosition();
 
        SetWindowTitle();
+       SetWindowResized();
 
         // required if executed from outside setup menu
         SaveSetupIfNeeded();
index da27429e8747d6780166ccea638b52a17ad87350..a8bdf9626e04cba7b9b1b19d99f9cfb474a6d4a6 100644 (file)
@@ -31,6 +31,7 @@ static SDL_Renderer *sdl_renderer = NULL;
 static SDL_Texture *sdl_texture_stream = NULL;
 static SDL_Texture *sdl_texture_target = NULL;
 static boolean fullscreen_enabled = FALSE;
+static boolean window_resized = FALSE;
 static boolean limit_screen_updates = FALSE;
 
 
@@ -205,9 +206,11 @@ static void UpdateScreenExt(SDL_Rect *rect, boolean with_frame_delay)
   }
 #endif
 
+  boolean clear_complete_render_target = (fullscreen_enabled || window_resized);
+
   // clear render target (complete screen in fullscreen mode to clear visible off-screen areas)
   // (this is especially important for touch buttons on Android and for different window sizes)
-  if (fullscreen_enabled)
+  if (clear_complete_render_target)
     SDL_RenderClear(sdl_renderer);
 
   // set renderer to use target texture for rendering
@@ -216,7 +219,7 @@ static void UpdateScreenExt(SDL_Rect *rect, boolean with_frame_delay)
     SDL_SetRenderTarget(sdl_renderer, sdl_texture_target);
 
   // clear render target (target texture only to fix black flickering with Metal window on Mac)
-  if (!fullscreen_enabled)
+  if (!clear_complete_render_target)
     SDL_RenderClear(sdl_renderer);
 
   // copy backbuffer texture to render target buffer
@@ -250,6 +253,8 @@ static void UpdateScreenExt(SDL_Rect *rect, boolean with_frame_delay)
 
   // show render target buffer on screen
   SDL_RenderPresent(sdl_renderer);
+
+  window_resized = FALSE;
 }
 
 static void UpdateScreen_WithFrameDelay(SDL_Rect *rect)
@@ -882,6 +887,11 @@ void SDLSetWindowTitle(void)
   SDL_SetWindowTitle(sdl_window, program.window_title);
 }
 
+void SDLSetWindowResized(void)
+{
+  window_resized = TRUE;
+}
+
 void SDLSetWindowScaling(int window_scaling_percent)
 {
   if (sdl_window == NULL)
@@ -898,6 +908,7 @@ void SDLSetWindowScaling(int window_scaling_percent)
   video.window_height = new_window_height;
 
   SetWindowTitle();
+  SetWindowResized();
 }
 
 void SDLSetWindowScalingQuality(char *window_scaling_quality)
index c2b55c24818b1e9f180fd623a75cbfaeafce5328..c2e40269aa2f522e66b1c49772e0b2a242f6897b 100644 (file)
@@ -422,6 +422,7 @@ void SDLSetScreenRenderingMode(char *);
 void SDLSetScreenVsyncMode(char *);
 void SDLRedrawWindow(void);
 void SDLSetWindowTitle(void);
+void SDLSetWindowResized(void);
 
 void SDLLimitScreenUpdates(boolean);
 void SDLInitVideoDisplay(void);
index c9a72bbedbd6c54db0fc37388e39f4a94f39eae6..107de5d5170d7a33185a53051edf2654f7a4f82f 100644 (file)
@@ -140,6 +140,11 @@ void SetWindowTitle(void)
   SDLSetWindowTitle();
 }
 
+void SetWindowResized(void)
+{
+  SDLSetWindowResized();
+}
+
 void InitWindowTitleFunction(char *(*window_title_function)(void))
 {
   program.window_title_function = window_title_function;
index c8cb2f09f7cd62eaec807e53e2e034e9ea153ef1..21a36f732210c475900f291071809f1fcf33ee36 100644 (file)
@@ -2045,6 +2045,7 @@ void InitNetworkInfo(boolean, boolean, boolean, char *, int);
 void InitRuntimeInfo(void);
 
 void SetWindowTitle(void);
+void SetWindowResized(void);
 
 void InitWindowTitleFunction(char *(*window_title_function)(void));
 void InitExitMessageFunction(void (*exit_message_function)(char *, va_list));