diff --git a/include/SDL3/SDL_events.h b/include/SDL3/SDL_events.h index e8fddab842..ecd64eb68d 100644 --- a/include/SDL3/SDL_events.h +++ b/include/SDL3/SDL_events.h @@ -1011,7 +1011,7 @@ typedef enum SDL_EventAction * event queue. * - `SDL_PEEKEVENT`: `numevents` events at the front of the event queue, * within the specified minimum and maximum type, will be returned to the - * caller and will _not_ be removed from the queue. + * caller and will _not_ be removed from the queue. If you pass NULL for `events`, then `numevents` is ignored and the total number of matching events will be returned. * - `SDL_GETEVENT`: up to `numevents` events at the front of the event queue, * within the specified minimum and maximum type, will be returned to the * caller and will be removed from the queue. diff --git a/src/events/SDL_events.c b/src/events/SDL_events.c index 81bed4459f..6f2ee90581 100644 --- a/src/events/SDL_events.c +++ b/src/events/SDL_events.c @@ -1105,12 +1105,28 @@ int SDL_PeepEvents(SDL_Event *events, int numevents, SDL_EventAction action, bool SDL_HasEvent(Uint32 type) { - return SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, type, type) > 0; + return SDL_HasEvents(type, type); } bool SDL_HasEvents(Uint32 minType, Uint32 maxType) { - return SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, minType, maxType) > 0; + bool found = false; + + SDL_LockMutex(SDL_EventQ.lock); + { + if (SDL_EventQ.active) { + for (SDL_EventEntry *entry = SDL_EventQ.head; entry; entry = entry->next) { + const Uint32 type = entry->event.type; + if (minType <= type && type <= maxType) { + found = true; + break; + } + } + } + } + SDL_UnlockMutex(SDL_EventQ.lock); + + return found; } void SDL_FlushEvent(Uint32 type)