Let the renderer always see window events

These are necessary for proper operation of the renderer and shouldn't be blocked by event filters, etc.
This commit is contained in:
Sam Lantinga 2025-02-06 14:25:00 -08:00
parent c59ac249d2
commit ad8429f1b0
3 changed files with 44 additions and 49 deletions

View file

@ -24,6 +24,7 @@
#include "SDL_events_c.h" #include "SDL_events_c.h"
#include "SDL_mouse_c.h" #include "SDL_mouse_c.h"
#include "../render/SDL_sysrender.h"
#include "../tray/SDL_tray_utils.h" #include "../tray/SDL_tray_utils.h"
static bool SDLCALL RemoveSupercededWindowEvents(void *userdata, SDL_Event *event) static bool SDLCALL RemoveSupercededWindowEvents(void *userdata, SDL_Event *event)
@ -183,14 +184,19 @@ bool SDL_SendWindowEvent(SDL_Window *window, SDL_EventType windowevent, int data
} }
// Post the event, if desired // Post the event, if desired
if (SDL_EventEnabled(windowevent)) { SDL_Event event;
SDL_Event event; event.type = windowevent;
event.type = windowevent; event.common.timestamp = 0;
event.common.timestamp = 0; event.window.data1 = data1;
event.window.data1 = data1; event.window.data2 = data2;
event.window.data2 = data2; event.window.windowID = window->id;
event.window.windowID = window->id;
SDL_Renderer *renderer = (SDL_Renderer *)SDL_GetPointerProperty(window->props, SDL_PROP_WINDOW_RENDERER_POINTER, NULL);
if (renderer) {
SDL_RendererEventWatch(renderer, &event);
}
if (SDL_EventEnabled(windowevent)) {
// Fixes queue overflow with move/resize events that aren't processed // Fixes queue overflow with move/resize events that aren't processed
if (windowevent == SDL_EVENT_WINDOW_MOVED || if (windowevent == SDL_EVENT_WINDOW_MOVED ||
windowevent == SDL_EVENT_WINDOW_RESIZED || windowevent == SDL_EVENT_WINDOW_RESIZED ||

View file

@ -45,9 +45,6 @@ this should probably be removed at some point in the future. --ryan. */
#define DONT_DRAW_WHILE_HIDDEN 0 #define DONT_DRAW_WHILE_HIDDEN 0
#endif #endif
#define SDL_PROP_WINDOW_RENDERER_POINTER "SDL.internal.window.renderer"
#define SDL_PROP_TEXTURE_PARENT_POINTER "SDL.internal.texture.parent"
#define CHECK_RENDERER_MAGIC_BUT_NOT_DESTROYED_FLAG(renderer, result) \ #define CHECK_RENDERER_MAGIC_BUT_NOT_DESTROYED_FLAG(renderer, result) \
if (!SDL_ObjectValid(renderer, SDL_OBJECT_TYPE_RENDERER)) { \ if (!SDL_ObjectValid(renderer, SDL_OBJECT_TYPE_RENDERER)) { \
SDL_InvalidParamError("renderer"); \ SDL_InvalidParamError("renderer"); \
@ -821,43 +818,35 @@ const char *SDL_GetRenderDriver(int index)
#endif #endif
} }
static bool SDLCALL SDL_RendererEventWatch(void *userdata, SDL_Event *event) void SDL_RendererEventWatch(SDL_Renderer *renderer, SDL_Event *event)
{ {
SDL_Renderer *renderer = (SDL_Renderer *)userdata; SDL_Window *window = renderer->window;
if (event->type >= SDL_EVENT_WINDOW_FIRST && event->type <= SDL_EVENT_WINDOW_LAST) { if (renderer->WindowEvent) {
SDL_Window *window = SDL_GetWindowFromID(event->window.windowID); renderer->WindowEvent(renderer, &event->window);
if (window == renderer->window) {
if (renderer->WindowEvent) {
renderer->WindowEvent(renderer, &event->window);
}
if (event->type == SDL_EVENT_WINDOW_RESIZED ||
event->type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED ||
event->type == SDL_EVENT_WINDOW_METAL_VIEW_RESIZED) {
UpdateLogicalPresentation(renderer);
} else if (event->type == SDL_EVENT_WINDOW_HIDDEN) {
renderer->hidden = true;
} else if (event->type == SDL_EVENT_WINDOW_SHOWN) {
if (!(SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED)) {
renderer->hidden = false;
}
} else if (event->type == SDL_EVENT_WINDOW_MINIMIZED) {
renderer->hidden = true;
} else if (event->type == SDL_EVENT_WINDOW_RESTORED ||
event->type == SDL_EVENT_WINDOW_MAXIMIZED) {
if (!(SDL_GetWindowFlags(window) & SDL_WINDOW_HIDDEN)) {
renderer->hidden = false;
}
} else if (event->type == SDL_EVENT_WINDOW_DISPLAY_CHANGED) {
UpdateHDRProperties(renderer);
}
}
} else if (event->type == SDL_EVENT_WINDOW_HDR_STATE_CHANGED) {
UpdateHDRProperties(renderer);
} }
return true; if (event->type == SDL_EVENT_WINDOW_RESIZED ||
event->type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED ||
event->type == SDL_EVENT_WINDOW_METAL_VIEW_RESIZED) {
UpdateLogicalPresentation(renderer);
} else if (event->type == SDL_EVENT_WINDOW_HIDDEN) {
renderer->hidden = true;
} else if (event->type == SDL_EVENT_WINDOW_SHOWN) {
if (!(SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED)) {
renderer->hidden = false;
}
} else if (event->type == SDL_EVENT_WINDOW_MINIMIZED) {
renderer->hidden = true;
} else if (event->type == SDL_EVENT_WINDOW_RESTORED ||
event->type == SDL_EVENT_WINDOW_MAXIMIZED) {
if (!(SDL_GetWindowFlags(window) & SDL_WINDOW_HIDDEN)) {
renderer->hidden = false;
}
} else if (event->type == SDL_EVENT_WINDOW_DISPLAY_CHANGED ||
event->type == SDL_EVENT_WINDOW_HDR_STATE_CHANGED) {
UpdateHDRProperties(renderer);
}
} }
bool SDL_CreateWindowAndRenderer(const char *title, int width, int height, SDL_WindowFlags window_flags, SDL_Window **window, SDL_Renderer **renderer) bool SDL_CreateWindowAndRenderer(const char *title, int width, int height, SDL_WindowFlags window_flags, SDL_Window **window, SDL_Renderer **renderer)
@ -1115,10 +1104,6 @@ SDL_Renderer *SDL_CreateRendererWithProperties(SDL_PropertiesID props)
SDL_SetRenderViewport(renderer, NULL); SDL_SetRenderViewport(renderer, NULL);
if (window) {
SDL_AddEventWatch(SDL_RendererEventWatch, renderer);
}
int vsync = (int)SDL_GetNumberProperty(props, SDL_PROP_RENDERER_CREATE_PRESENT_VSYNC_NUMBER, 0); int vsync = (int)SDL_GetNumberProperty(props, SDL_PROP_RENDERER_CREATE_PRESENT_VSYNC_NUMBER, 0);
if (!SDL_SetRenderVSync(renderer, vsync)) { if (!SDL_SetRenderVSync(renderer, vsync)) {
if (vsync == 0) { if (vsync == 0) {
@ -5217,8 +5202,6 @@ void SDL_DestroyRendererWithoutFreeing(SDL_Renderer *renderer)
renderer->destroyed = true; renderer->destroyed = true;
SDL_RemoveEventWatch(SDL_RendererEventWatch, renderer);
if (renderer->window) { if (renderer->window) {
SDL_PropertiesID props = SDL_GetWindowProperties(renderer->window); SDL_PropertiesID props = SDL_GetWindowProperties(renderer->window);
if (SDL_GetPointerProperty(props, SDL_PROP_WINDOW_RENDERER_POINTER, NULL) == renderer) { if (SDL_GetPointerProperty(props, SDL_PROP_WINDOW_RENDERER_POINTER, NULL) == renderer) {

View file

@ -32,6 +32,9 @@
extern "C" { extern "C" {
#endif #endif
#define SDL_PROP_WINDOW_RENDERER_POINTER "SDL.internal.window.renderer"
#define SDL_PROP_TEXTURE_PARENT_POINTER "SDL.internal.texture.parent"
typedef enum SDL_TextureAddressMode typedef enum SDL_TextureAddressMode
{ {
SDL_TEXTURE_ADDRESS_AUTO, SDL_TEXTURE_ADDRESS_AUTO,
@ -339,6 +342,9 @@ extern SDL_RenderDriver GPU_RenderDriver;
// Clean up any renderers at shutdown // Clean up any renderers at shutdown
extern void SDL_QuitRender(void); extern void SDL_QuitRender(void);
// Handle window events for a renderer
extern void SDL_RendererEventWatch(SDL_Renderer *renderer, SDL_Event *event);
// Add a supported texture format to a renderer // Add a supported texture format to a renderer
extern bool SDL_AddSupportedTextureFormat(SDL_Renderer *renderer, SDL_PixelFormat format); extern bool SDL_AddSupportedTextureFormat(SDL_Renderer *renderer, SDL_PixelFormat format);