fixed issue where video events could be posted while system was quitting (#14572)

This commit is contained in:
milkmull
2025-12-03 17:17:11 -05:00
committed by GitHub
parent f97e53509e
commit 70c2f576c8
4 changed files with 23 additions and 3 deletions

View File

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

View File

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

View File

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

View File

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