From afd54a64e40aff6729b94356e0393eafe2be2f34 Mon Sep 17 00:00:00 2001 From: altalk23 <45172705+altalk23@users.noreply.github.com> Date: Sun, 25 Feb 2024 10:38:46 +0300 Subject: [PATCH] fix dispatch --- loader/include/Geode/loader/Dispatch.hpp | 20 ++++++++++++-------- loader/src/loader/Dispatch.cpp | 8 ++++++++ loader/test/dependency/main.cpp | 2 +- loader/test/main/main.cpp | 13 ++++++++++++- 4 files changed, 33 insertions(+), 10 deletions(-) create mode 100644 loader/src/loader/Dispatch.cpp diff --git a/loader/include/Geode/loader/Dispatch.hpp b/loader/include/Geode/loader/Dispatch.hpp index c1edc075..69130b0b 100644 --- a/loader/include/Geode/loader/Dispatch.hpp +++ b/loader/include/Geode/loader/Dispatch.hpp @@ -9,6 +9,8 @@ namespace geode { // Mod interoperability + std::unordered_map<std::string, EventListenerPool*>& dispatchPools(); + template <class... Args> class DispatchEvent : public Event { protected: @@ -26,6 +28,13 @@ namespace geode { std::string getID() const { return m_id; } + + EventListenerPool* getPool() const override { + if (dispatchPools().count(m_id) == 0) { + dispatchPools()[m_id] = new DefaultEventListenerPool(); + } + return dispatchPools()[m_id]; + } }; template <class... Args> @@ -33,20 +42,15 @@ namespace geode { protected: std::string m_id; - static auto& pools() { - static std::unordered_map<std::string, EventListenerPool*> s_pools; - return s_pools; - } - public: using Ev = DispatchEvent<Args...>; using Callback = ListenerResult(Args...); EventListenerPool* getPool() const { - if (pools().count(m_id) == 0) { - pools()[m_id] = new DefaultEventListenerPool(); + if (dispatchPools().count(m_id) == 0) { + dispatchPools()[m_id] = new DefaultEventListenerPool(); } - return pools()[m_id]; + return dispatchPools()[m_id]; } ListenerResult handle(utils::MiniFunction<Callback> fn, Ev* event) { diff --git a/loader/src/loader/Dispatch.cpp b/loader/src/loader/Dispatch.cpp new file mode 100644 index 00000000..53ef91af --- /dev/null +++ b/loader/src/loader/Dispatch.cpp @@ -0,0 +1,8 @@ +#include <Geode/loader/Dispatch.hpp> + +using namespace geode::prelude; + +std::unordered_map<std::string, EventListenerPool*>& geode::dispatchPools() { + static std::unordered_map<std::string, EventListenerPool*> pools; + return pools; +} \ No newline at end of file diff --git a/loader/test/dependency/main.cpp b/loader/test/dependency/main.cpp index 34cccb33..c9a898fd 100644 --- a/loader/test/dependency/main.cpp +++ b/loader/test/dependency/main.cpp @@ -171,5 +171,5 @@ $on_mod(Loaded) { label->setZOrder(99999); gl->addChild(label); return ListenerResult::Propagate; - }, MyDispatchFilter("geode.testdep/test-garage-open")); + }, MyDispatchFilter("geode.test/test-garage-open")); } \ No newline at end of file diff --git a/loader/test/main/main.cpp b/loader/test/main/main.cpp index 07f8fdc3..b4b2e686 100644 --- a/loader/test/main/main.cpp +++ b/loader/test/main/main.cpp @@ -16,10 +16,13 @@ $on_mod(Loaded) { log::info("Loaded"); } +static std::string s_recievedEvent; + // Events $execute { new EventListener<TestEventFilter>(+[](TestEvent* event) { log::info("Received event: {}", event->getData()); + s_recievedEvent = event->getData(); }); } @@ -99,7 +102,15 @@ struct GJGarageLayerTest : Modify<GJGarageLayerTest, GJGarageLayer> { addChild(label2); // Dispatch system pt. 1 - MyDispatchEvent("test-garage-open"_spr, this).post(); + MyDispatchEvent("geode.test/test-garage-open", this).post(); + + if (s_recievedEvent.size() > 0) { + auto label = CCLabelBMFont::create("Event works!", "bigFont.fnt"); + label->setPosition(100, 70); + label->setScale(.4f); + label->setZOrder(99999); + addChild(label); + } return true; }