diff options
Diffstat (limited to 'src/crepe/api/EventManager.cpp')
-rw-r--r-- | src/crepe/api/EventManager.cpp | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/src/crepe/api/EventManager.cpp b/src/crepe/api/EventManager.cpp index 869ec74..3d8558b 100644 --- a/src/crepe/api/EventManager.cpp +++ b/src/crepe/api/EventManager.cpp @@ -7,6 +7,9 @@ void EventManager::dispatch_events() { auto& event = std::get<0>(*event_it); int channel = std::get<1>(*event_it); std::type_index event_type = std::get<2>(*event_it); + + bool event_handled = false; + if (channel) { auto handlers_it = subscribers_by_event_id.find(event_type); if (handlers_it != subscribers_by_event_id.end()) { @@ -15,25 +18,33 @@ void EventManager::dispatch_events() { if (handlers != handlers_map.end()) { auto& callbacks = handlers->second; for (auto& handler : callbacks) { - handler->exec(*event); + if (handler->exec(*event)) { + event_it = events_queue.erase(event_it); + event_handled = true; + break; + } } } } } else { + // Handle event for all channels auto handlers_it = subscribers.find(event_type); if (handlers_it != subscribers.end()) { auto& handlers = handlers_it->second; for (auto& handler : handlers) { - handler->exec(*event); + if (handler->exec(*event)) { + event_it = events_queue.erase(event_it); + event_handled = true; + break; + } } } } - if (event->handled) { - event_it = events_queue.erase(event_it); - } else { + if (!event_handled) { ++event_it; } } } + |