Fixed creating a window with both software and hardware renderer attached
This commit is contained in:
parent
3c6e6645fa
commit
48c00bfe6c
6 changed files with 39 additions and 5 deletions
|
@ -191,8 +191,8 @@ 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) {
|
||||
for (int i = 0; i < window->num_renderers; ++i) {
|
||||
SDL_Renderer *renderer = window->renderers[i];
|
||||
SDL_RendererEventWatch(renderer, &event);
|
||||
}
|
||||
|
||||
|
|
|
@ -45,6 +45,9 @@ 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"); \
|
||||
|
@ -1100,6 +1103,7 @@ SDL_Renderer *SDL_CreateRendererWithProperties(SDL_PropertiesID props)
|
|||
|
||||
if (window) {
|
||||
SDL_SetPointerProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_RENDERER_POINTER, renderer);
|
||||
SDL_AddWindowRenderer(window, renderer);
|
||||
}
|
||||
|
||||
SDL_SetRenderViewport(renderer, NULL);
|
||||
|
@ -5207,6 +5211,7 @@ void SDL_DestroyRendererWithoutFreeing(SDL_Renderer *renderer)
|
|||
if (SDL_GetPointerProperty(props, SDL_PROP_WINDOW_RENDERER_POINTER, NULL) == renderer) {
|
||||
SDL_ClearProperty(props, SDL_PROP_WINDOW_RENDERER_POINTER);
|
||||
}
|
||||
SDL_RemoveWindowRenderer(renderer->window, renderer);
|
||||
}
|
||||
|
||||
SDL_DiscardAllCommands(renderer);
|
||||
|
|
|
@ -32,9 +32,6 @@
|
|||
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,
|
||||
|
|
|
@ -124,6 +124,9 @@ struct SDL_Window
|
|||
|
||||
SDL_PropertiesID props;
|
||||
|
||||
int num_renderers;
|
||||
SDL_Renderer **renderers;
|
||||
|
||||
SDL_WindowData *internal;
|
||||
|
||||
SDL_Window *prev;
|
||||
|
|
|
@ -4132,6 +4132,31 @@ SDL_Window *SDL_GetToplevelForKeyboardFocus(void)
|
|||
return focus;
|
||||
}
|
||||
|
||||
bool SDL_AddWindowRenderer(SDL_Window *window, SDL_Renderer *renderer)
|
||||
{
|
||||
SDL_Renderer **renderers = (SDL_Renderer **)SDL_realloc(window->renderers, (window->num_renderers + 1) * sizeof(*renderers));
|
||||
if (!renderers) {
|
||||
return false;
|
||||
}
|
||||
|
||||
window->renderers = renderers;
|
||||
window->renderers[window->num_renderers++] = renderer;
|
||||
return true;
|
||||
}
|
||||
|
||||
void SDL_RemoveWindowRenderer(SDL_Window *window, SDL_Renderer *renderer)
|
||||
{
|
||||
for (int i = 0; i < window->num_renderers; ++i) {
|
||||
if (window->renderers[i] == renderer) {
|
||||
if (i < (window->num_renderers - 1)) {
|
||||
SDL_memmove(&window->renderers[i], &window->renderers[i + 1], (window->num_renderers - i - 1) * sizeof(window->renderers[i]));
|
||||
}
|
||||
--window->num_renderers;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SDL_DestroyWindow(SDL_Window *window)
|
||||
{
|
||||
CHECK_WINDOW_MAGIC(window,);
|
||||
|
@ -4238,6 +4263,7 @@ void SDL_DestroyWindow(SDL_Window *window)
|
|||
_this->windows = window->next;
|
||||
}
|
||||
|
||||
SDL_free(window->renderers);
|
||||
SDL_free(window);
|
||||
|
||||
#ifdef SDL_VIDEO_DRIVER_UIKIT
|
||||
|
|
|
@ -63,4 +63,7 @@ extern bool SDL_SetWindowTextureVSync(struct SDL_VideoDevice *_this, SDL_Window
|
|||
const char *SDL_GetCSSCursorName(SDL_SystemCursor id, const char **fallback_name);
|
||||
#endif
|
||||
|
||||
extern bool SDL_AddWindowRenderer(SDL_Window *window, SDL_Renderer *renderer);
|
||||
extern void SDL_RemoveWindowRenderer(SDL_Window *window, SDL_Renderer *renderer);
|
||||
|
||||
#endif // SDL_video_c_h_
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue