diff --git a/yoga/event/event.cpp b/yoga/event/event.cpp index bde5fca8..29b6493e 100644 --- a/yoga/event/event.cpp +++ b/yoga/event/event.cpp @@ -15,31 +15,26 @@ namespace yoga { namespace { -// For now, a single subscriber is enough. -// This can be changed as soon as the need for more than one subscriber arises. -std::function& globalEventSubscriber() { - static std::function subscriber = nullptr; - return subscriber; +Event::Subscribers& eventSubscribers() { + static Event::Subscribers subscribers = {}; + return subscribers; } } // namespace void Event::reset() { - globalEventSubscriber() = nullptr; + eventSubscribers() = {}; } void Event::subscribe(std::function&& subscriber) { - if (globalEventSubscriber() != nullptr) { - throw std::logic_error( - "Yoga currently supports only one global event subscriber"); - } - globalEventSubscriber() = std::move(subscriber); + eventSubscribers().push_back(subscriber); } void Event::publish(const YGNode& node, Type eventType, const Data& eventData) { - auto& subscriber = globalEventSubscriber(); - if (subscriber) { - subscriber(node, eventType, eventData); + for (auto& subscriber : eventSubscribers()) { + if (subscriber) { + subscriber(node, eventType, eventData); + } } } diff --git a/yoga/event/event.h b/yoga/event/event.h index c86d5bde..578d2f3a 100644 --- a/yoga/event/event.h +++ b/yoga/event/event.h @@ -7,6 +7,7 @@ #pragma once #include +#include struct YGConfig; struct YGNode; @@ -24,6 +25,7 @@ struct Event { }; class Data; using Subscriber = void(const YGNode&, Type, Data); + using Subscribers = std::vector>; template struct TypedData {};