From 6d0ae714166fc0a5007431823f9cf65f2739ab99 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Wed, 12 Feb 2025 20:02:57 +0100 Subject: [PATCH] fixed clearing off-screen areas in window mode after resizing window --- src/events.c | 1 + src/libgame/sdl.c | 15 +++++++++++++-- src/libgame/sdl.h | 1 + src/libgame/system.c | 5 +++++ src/libgame/system.h | 1 + 5 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/events.c b/src/events.c index 3939deb9..e331aac2 100644 --- a/src/events.c +++ b/src/events.c @@ -667,6 +667,7 @@ void HandleWindowEvent(WindowEvent *event) UpdateMousePosition(); SetWindowTitle(); + SetWindowResized(); // required if executed from outside setup menu SaveSetupIfNeeded(); diff --git a/src/libgame/sdl.c b/src/libgame/sdl.c index da27429e..a8bdf962 100644 --- a/src/libgame/sdl.c +++ b/src/libgame/sdl.c @@ -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) diff --git a/src/libgame/sdl.h b/src/libgame/sdl.h index c2b55c24..c2e40269 100644 --- a/src/libgame/sdl.h +++ b/src/libgame/sdl.h @@ -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); diff --git a/src/libgame/system.c b/src/libgame/system.c index c9a72bbe..107de5d5 100644 --- a/src/libgame/system.c +++ b/src/libgame/system.c @@ -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; diff --git a/src/libgame/system.h b/src/libgame/system.h index c8cb2f09..21a36f73 100644 --- a/src/libgame/system.h +++ b/src/libgame/system.h @@ -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)); -- 2.34.1