From 2dc0c96c8d02c9763b332f25936a82b7000a3fd6 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Mon, 26 May 2003 01:43:23 +0000 Subject: [PATCH] add mySDL_GetAllEvents and mySDL_PushEvents --- stepmania/src/SDL_utils.cpp | 47 ++++++++++++++++++++++++++----------- stepmania/src/SDL_utils.h | 3 +++ 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/stepmania/src/SDL_utils.cpp b/stepmania/src/SDL_utils.cpp index bc61f83c8d..024bb12901 100644 --- a/stepmania/src/SDL_utils.cpp +++ b/stepmania/src/SDL_utils.cpp @@ -508,6 +508,26 @@ bool SDL_GetEvent(SDL_Event &event, int mask) default: RageException::Throw("SDL_PeepEvents returned unexpected error: %s", SDL_GetError()); } } +#include "RageLog.h" +/* Reads all currently queued SDL events, clearing them from the queue. */ +void mySDL_GetAllEvents(vector &events) +{ + while(1) + { + SDL_Event ev; + if(SDL_PollEvent(&ev) <= 0) + break; + + events.push_back(ev); + } +} + +/* Pushes the given events onto the SDL event queue. */ +void mySDL_PushEvents(vector &events) +{ + for(unsigned i = 0; i < events.size(); ++i) + LOG->Trace("push ev %i: %i", events[i].type, SDL_PushEvent(&events[i])); +} /* For some bizarre reason, SDL_EventState flushes all events. This is a pain, so * avoid it. */ @@ -517,24 +537,23 @@ Uint8 mySDL_EventState(Uint8 type, int state) return SDL_EventState(type, state); vector events; - while(1) - { - SDL_Event ev; - if(SDL_PollEvent(&ev) <= 0) - break; - - /* Don't bother readding it if we're turning this event type off. */ - if(state == SDL_IGNORE && ev.type == type) - continue; - - events.push_back(ev); - } + mySDL_GetAllEvents(events); + /* Set the event mask. */ Uint8 ret = SDL_EventState(type, state); + /* Don't readding events that we just turned off; they'll just sit around + * in the buffer. */ + for(unsigned i = 0; i < events.size(); ) + { + if(state == SDL_IGNORE && events[i].type == type) + events.erase(events.begin()+i); + else + i++; + } + /* Put them back. */ - for(unsigned i = 0; i < events.size(); ++i) - SDL_PushEvent(&events[i]); + mySDL_PushEvents(events); return ret; } diff --git a/stepmania/src/SDL_utils.h b/stepmania/src/SDL_utils.h index 556d2e02b3..6d2603ceb3 100644 --- a/stepmania/src/SDL_utils.h +++ b/stepmania/src/SDL_utils.h @@ -38,6 +38,9 @@ bool SDL_GetEvent(SDL_Event &event, int mask); /* Change the event state without dropping extra events. */ Uint8 mySDL_EventState(Uint8 type, int state); +void mySDL_GetAllEvents(vector &events); +void mySDL_PushEvents(vector &events); + /* The surface contains no transparent pixels and/or never uses its color * key, so it doesn't need any alpha bits at all. */ #define TRAIT_NO_TRANSPARENCY 0x0001 /* 0alpha */