diff --git a/src/events/SDL_displayevents.c b/src/events/SDL_displayevents.c index e41f75cca7..0bcd4ccfd8 100644 --- a/src/events/SDL_displayevents.c +++ b/src/events/SDL_displayevents.c @@ -26,6 +26,9 @@ void SDL_SendDisplayEvent(SDL_VideoDisplay *display, SDL_EventType displayevent, int data1, int data2) { + SDL_VideoDevice *_this; + bool post_event = true; + if (!display || display->id == 0) { return; } @@ -40,8 +43,14 @@ void SDL_SendDisplayEvent(SDL_VideoDisplay *display, SDL_EventType displayevent, break; } + // Only post if we are not currently quitting + _this = SDL_GetVideoDevice(); + if (_this == NULL || _this->is_quitting) { + post_event = false; + } + // Post the event, if desired - if (SDL_EventEnabled(displayevent)) { + if (post_event && SDL_EventEnabled(displayevent)) { SDL_Event event; event.type = displayevent; event.common.timestamp = 0; diff --git a/src/events/SDL_windowevents.c b/src/events/SDL_windowevents.c index 7d4bd15090..f31faf09af 100644 --- a/src/events/SDL_windowevents.c +++ b/src/events/SDL_windowevents.c @@ -70,6 +70,8 @@ static bool SDLCALL RemoveSupersededWindowEvents(void *userdata, SDL_Event *even bool SDL_SendWindowEvent(SDL_Window *window, SDL_EventType windowevent, int data1, int data2) { + SDL_VideoDevice *_this; + bool post_event = true; bool posted = false; if (!window) { @@ -220,6 +222,12 @@ bool SDL_SendWindowEvent(SDL_Window *window, SDL_EventType windowevent, int data return false; } + // Only post if we are not currently quitting + _this = SDL_GetVideoDevice(); + if (_this == NULL || _this->is_quitting) { + post_event = false; + } + // Post the event, if desired SDL_Event event; event.type = windowevent; @@ -231,7 +239,7 @@ bool SDL_SendWindowEvent(SDL_Window *window, SDL_EventType windowevent, int data SDL_DispatchEventWatchList(&SDL_window_event_watchers[SDL_WINDOW_EVENT_WATCH_EARLY], &event); SDL_DispatchEventWatchList(&SDL_window_event_watchers[SDL_WINDOW_EVENT_WATCH_NORMAL], &event); - if (SDL_EventEnabled(windowevent)) { + if (post_event && 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 || @@ -291,7 +299,7 @@ bool SDL_SendWindowEvent(SDL_Window *window, SDL_EventType windowevent, int data if (windowevent == SDL_EVENT_WINDOW_CLOSE_REQUESTED && !window->parent && !SDL_HasActiveTrays()) { int toplevel_count = 0; SDL_Window *n; - for (n = SDL_GetVideoDevice()->windows; n; n = n->next) { + for (n = _this->windows; n; n = n->next) { if (!n->parent && !(n->flags & SDL_WINDOW_HIDDEN)) { ++toplevel_count; } diff --git a/src/video/SDL_sysvideo.h b/src/video/SDL_sysvideo.h index 27819d4e7c..06b88b3642 100644 --- a/src/video/SDL_sysvideo.h +++ b/src/video/SDL_sysvideo.h @@ -422,6 +422,7 @@ struct SDL_VideoDevice Uint32 device_caps; SDL_SystemTheme system_theme; bool screen_keyboard_shown; + bool is_quitting; /* * * */ // Data used by the GL drivers diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index 4f9bb6a437..2bae47e1a1 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -4627,6 +4627,8 @@ void SDL_VideoQuit(void) return; } + _this->is_quitting = true; + // Halt event processing before doing anything else #if 0 // This was moved to the end to fix a memory leak SDL_QuitPen();