Browse Source

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.
Sam Lantinga 10 months ago
parent
commit
ad8429f1b0
3 changed files with 42 additions and 47 deletions
  1. 13 7
      src/events/SDL_windowevents.c
  2. 23 40
      src/render/SDL_render.c
  3. 6 0
      src/render/SDL_sysrender.h

+ 13 - 7
src/events/SDL_windowevents.c

@@ -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;
-        event.type = windowevent;
-        event.common.timestamp = 0;
-        event.window.data1 = data1;
-        event.window.data2 = data2;
-        event.window.windowID = window->id;
+    SDL_Event event;
+    event.type = windowevent;
+    event.common.timestamp = 0;
+    event.window.data1 = data1;
+    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
         // 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 ||

+ 23 - 40
src/render/SDL_render.c

@@ -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) {
-        SDL_Window *window = SDL_GetWindowFromID(event->window.windowID);
-        if (window == renderer->window) {
-            if (renderer->WindowEvent) {
-                renderer->WindowEvent(renderer, &event->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);
-            }
+    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_HDR_STATE_CHANGED) {
+    } 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);
         UpdateHDRProperties(renderer);
     }
     }
-
-    return true;
 }
 }
 
 
 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) {

+ 6 - 0
src/render/SDL_sysrender.h

@@ -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);