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_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 ||
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue