// Function to process event list once per frame. // First advances event times, then processes each event with the appropriate // handler depending on the type of event. void Events::handleEvents(long msec) { long delta_time; int result; // Advance event times processEventTime(msec); // Process each event in list for (EventList::iterator eventi = _eventList.begin(); eventi != _eventList.end(); ++eventi) { Event *event_p = &eventi->front(); // Call the appropriate event handler for the specific event type switch (event_p->type) { case kEvTOneshot: result = handleOneShot(event_p); break; case kEvTContinuous: result = handleContinuous(event_p); break; case kEvTInterval: result = handleInterval(event_p); break; case kEvTImmediate: result = handleImmediate(event_p); break; default: result = kEvStInvalidCode; warning("Invalid event code encountered"); break; } // Process the event appropriately based on result code from // handler if ((result == kEvStDelete) || (result == kEvStInvalidCode)) { // If there is no event chain, delete the base event. if (eventi->size() < 2) { eventi = _eventList.reverse_erase(eventi); } else { // If there is an event chain present, move the next event // in the chain up, adjust it by the previous delta time, // and reprocess the event delta_time = event_p->time; eventi->pop_front(); event_p = &eventi->front(); event_p->time += delta_time; --eventi; } } else if (result == kEvStBreak) { break; } } }
// Function to process event list once per frame. // First advances event times, then processes each event with the appropriate // handler depending on the type of event. int Events::handleEvents(long msec) { Event *event_p; long delta_time; int result; // Advance event times processEventTime(msec); // Process each event in list for (EventList::iterator eventi = _eventList.begin(); eventi != _eventList.end(); ++eventi) { event_p = (Event *)eventi.operator->(); // Call the appropriate event handler for the specific event type switch (event_p->type) { case kEvTOneshot: result = handleOneShot(event_p); break; case kEvTContinuous: result = handleContinuous(event_p); break; case kEvTInterval: result = handleInterval(event_p); break; case kEvTImmediate: result = handleImmediate(event_p); break; default: result = kEvStInvalidCode; warning("Invalid event code encountered"); break; } // Process the event appropriately based on result code from // handler if ((result == kEvStDelete) || (result == kEvStInvalidCode)) { // If there is no event chain, delete the base event. if (event_p->chain == NULL) { eventi = _eventList.eraseAndPrev(eventi); } else { // If there is an event chain present, move the next event // in the chain up, adjust it by the previous delta time, // and reprocess the event delta_time = event_p->time; Event *from_chain = event_p->chain; memcpy(event_p, from_chain, sizeof(*event_p)); free(from_chain); event_p->time += delta_time; --eventi; } } else if (result == kEvStBreak) { break; } } return SUCCESS; }