/* Lock the event queue, take a peep at it, and unlock it */ int SDL_PeepEvents(SDL_Event * events, int numevents, SDL_eventaction action, Uint32 minType, Uint32 maxType) { int i, used; /* Don't look after we've quit */ if (!SDL_EventQ.active) { return (-1); } /* Lock the event queue */ used = 0; if (SDL_mutexP(SDL_EventQ.lock) == 0) { if (action == SDL_ADDEVENT) { for (i = 0; i < numevents; ++i) { used += SDL_AddEvent(&events[i]); } } else { SDL_Event tmpevent; int spot; /* If 'events' is NULL, just see if they exist */ if (events == NULL) { action = SDL_PEEKEVENT; numevents = 1; events = &tmpevent; } spot = SDL_EventQ.head; while ((used < numevents) && (spot != SDL_EventQ.tail)) { Uint32 type = SDL_EventQ.event[spot].type; if (minType <= type && type <= maxType) { events[used++] = SDL_EventQ.event[spot]; if (action == SDL_GETEVENT) { spot = SDL_CutEvent(spot); } else { spot = (spot + 1) % MAXEVENTS; } } else { spot = (spot + 1) % MAXEVENTS; } } } SDL_mutexV(SDL_EventQ.lock); } else { SDL_SetError("Couldn't lock event queue"); used = -1; } return (used); }
int SDL_PeepEvents(SDL_Event *events, int numevents, SDL_eventaction action, Uint32 mask) { int i, used; if ( ! SDL_EventQ.active ) { return(-1); } used = 0; if ( SDL_mutexP(SDL_EventQ.lock) == 0 ) { if ( action == SDL_ADDEVENT ) { for ( i=0; i<numevents; ++i ) { used += SDL_AddEvent(&events[i]); } } else { SDL_Event tmpevent; int spot; if ( events == NULL ) { action = SDL_PEEKEVENT; numevents = 1; events = &tmpevent; } spot = SDL_EventQ.head; while ((used < numevents)&&(spot != SDL_EventQ.tail)) { if ( mask & SDL_EVENTMASK(SDL_EventQ.event[spot].type) ) { events[used++] = SDL_EventQ.event[spot]; if ( action == SDL_GETEVENT ) { spot = SDL_CutEvent(spot); } else { spot = (spot+1)%MAXEVENTS; } } else { spot = (spot+1)%MAXEVENTS; } } } SDL_mutexV(SDL_EventQ.lock); } else { SDL_SetError("Couldn't lock event queue"); used = -1; } return(used); }
void SDL_FilterEvents(SDL_EventFilter filter, void *userdata) { if (SDL_mutexP(SDL_EventQ.lock) == 0) { int spot; spot = SDL_EventQ.head; while (spot != SDL_EventQ.tail) { if (filter(userdata, &SDL_EventQ.event[spot])) { spot = (spot + 1) % MAXEVENTS; } else { spot = SDL_CutEvent(spot); } } } SDL_mutexV(SDL_EventQ.lock); }