diff --git a/src/events/SDL_events.c b/src/events/SDL_events.c index 5cecaa3d33..1068788ad0 100644 --- a/src/events/SDL_events.c +++ b/src/events/SDL_events.c @@ -1452,19 +1452,15 @@ SDL_bool SDL_WaitEventTimeoutNS(SDL_Event *event, Sint64 timeoutNS) } } -int SDL_PushEvent(SDL_Event *event) +static SDL_bool SDL_CallEventWatchers(SDL_Event *event) { - if (!event->common.timestamp) { - event->common.timestamp = SDL_GetTicksNS(); - } - if ((SDL_EventOK.callback || SDL_event_watchers_count > 0) && (event->common.type != SDL_EVENT_POLL_SENTINEL)) { SDL_LockMutex(SDL_event_watchers_lock); { if (SDL_EventOK.callback && !SDL_EventOK.callback(SDL_EventOK.userdata, event)) { SDL_UnlockMutex(SDL_event_watchers_lock); - return 0; + return SDL_FALSE; } if (SDL_event_watchers_count > 0) { @@ -1495,6 +1491,19 @@ int SDL_PushEvent(SDL_Event *event) SDL_UnlockMutex(SDL_event_watchers_lock); } + return SDL_TRUE; +} + +int SDL_PushEvent(SDL_Event *event) +{ + if (!event->common.timestamp) { + event->common.timestamp = SDL_GetTicksNS(); + } + + if (!SDL_CallEventWatchers(event)) { + return 0; + } + if (SDL_PeepEvents(event, 1, SDL_ADDEVENT, 0, 0) <= 0) { return -1; } @@ -1707,7 +1716,21 @@ int SDL_SendAppEvent(SDL_EventType eventType) SDL_Event event; event.type = eventType; event.common.timestamp = 0; - posted = (SDL_PushEvent(&event) > 0); + + switch (eventType) { + case SDL_EVENT_TERMINATING: + case SDL_EVENT_LOW_MEMORY: + case SDL_EVENT_WILL_ENTER_BACKGROUND: + case SDL_EVENT_DID_ENTER_BACKGROUND: + case SDL_EVENT_WILL_ENTER_FOREGROUND: + case SDL_EVENT_DID_ENTER_FOREGROUND: + // We won't actually queue this event, it needs to be handled in this call stack by an event watcher + posted = SDL_CallEventWatchers(&event); + break; + default: + posted = (SDL_PushEvent(&event) > 0); + break; + } } return posted; }