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:
parent
c59ac249d2
commit
ad8429f1b0
3 changed files with 44 additions and 49 deletions
|
@ -24,6 +24,7 @@
|
|||
|
||||
#include "SDL_events_c.h"
|
||||
#include "SDL_mouse_c.h"
|
||||
#include "../render/SDL_sysrender.h"
|
||||
#include "../tray/SDL_tray_utils.h"
|
||||
|
||||
static bool SDLCALL RemoveSupercededWindowEvents(void *userdata, SDL_Event *event)
|
||||
|
@ -183,7 +184,6 @@ bool SDL_SendWindowEvent(SDL_Window *window, SDL_EventType windowevent, int data
|
|||
}
|
||||
|
||||
// Post the event, if desired
|
||||
if (SDL_EventEnabled(windowevent)) {
|
||||
SDL_Event event;
|
||||
event.type = windowevent;
|
||||
event.common.timestamp = 0;
|
||||
|
@ -191,6 +191,12 @@ bool SDL_SendWindowEvent(SDL_Window *window, SDL_EventType windowevent, int data
|
|||
event.window.data2 = data2;
|
||||
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
|
||||
if (windowevent == SDL_EVENT_WINDOW_MOVED ||
|
||||
windowevent == SDL_EVENT_WINDOW_RESIZED ||
|
||||
|
|
|
@ -45,9 +45,6 @@ this should probably be removed at some point in the future. --ryan. */
|
|||
#define DONT_DRAW_WHILE_HIDDEN 0
|
||||
#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) \
|
||||
if (!SDL_ObjectValid(renderer, SDL_OBJECT_TYPE_RENDERER)) { \
|
||||
SDL_InvalidParamError("renderer"); \
|
||||
|
@ -821,13 +818,10 @@ const char *SDL_GetRenderDriver(int index)
|
|||
#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) {
|
||||
SDL_Window *window = SDL_GetWindowFromID(event->window.windowID);
|
||||
if (window == renderer->window) {
|
||||
if (renderer->WindowEvent) {
|
||||
renderer->WindowEvent(renderer, &event->window);
|
||||
}
|
||||
|
@ -849,16 +843,11 @@ static bool SDLCALL SDL_RendererEventWatch(void *userdata, SDL_Event *event)
|
|||
if (!(SDL_GetWindowFlags(window) & SDL_WINDOW_HIDDEN)) {
|
||||
renderer->hidden = false;
|
||||
}
|
||||
} else if (event->type == SDL_EVENT_WINDOW_DISPLAY_CHANGED) {
|
||||
} else if (event->type == SDL_EVENT_WINDOW_DISPLAY_CHANGED ||
|
||||
event->type == SDL_EVENT_WINDOW_HDR_STATE_CHANGED) {
|
||||
UpdateHDRProperties(renderer);
|
||||
}
|
||||
}
|
||||
} else if (event->type == SDL_EVENT_WINDOW_HDR_STATE_CHANGED) {
|
||||
UpdateHDRProperties(renderer);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
if (window) {
|
||||
SDL_AddEventWatch(SDL_RendererEventWatch, renderer);
|
||||
}
|
||||
|
||||
int vsync = (int)SDL_GetNumberProperty(props, SDL_PROP_RENDERER_CREATE_PRESENT_VSYNC_NUMBER, 0);
|
||||
if (!SDL_SetRenderVSync(renderer, vsync)) {
|
||||
if (vsync == 0) {
|
||||
|
@ -5217,8 +5202,6 @@ void SDL_DestroyRendererWithoutFreeing(SDL_Renderer *renderer)
|
|||
|
||||
renderer->destroyed = true;
|
||||
|
||||
SDL_RemoveEventWatch(SDL_RendererEventWatch, renderer);
|
||||
|
||||
if (renderer->window) {
|
||||
SDL_PropertiesID props = SDL_GetWindowProperties(renderer->window);
|
||||
if (SDL_GetPointerProperty(props, SDL_PROP_WINDOW_RENDERER_POINTER, NULL) == renderer) {
|
||||
|
|
|
@ -32,6 +32,9 @@
|
|||
extern "C" {
|
||||
#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
|
||||
{
|
||||
SDL_TEXTURE_ADDRESS_AUTO,
|
||||
|
@ -339,6 +342,9 @@ extern SDL_RenderDriver GPU_RenderDriver;
|
|||
// Clean up any renderers at shutdown
|
||||
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
|
||||
extern bool SDL_AddSupportedTextureFormat(SDL_Renderer *renderer, SDL_PixelFormat format);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue