From a141bbbea503ae7b320eba614a80ca2f4e5c1cba Mon Sep 17 00:00:00 2001 From: Vaxry Date: Sun, 21 Apr 2024 01:47:24 +0100 Subject: helpers: Add new C++ Signal and Listener classes A memory-safe alternative to wl_signal --- src/helpers/signal/Signal.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/helpers/signal/Signal.cpp (limited to 'src/helpers/signal/Signal.cpp') diff --git a/src/helpers/signal/Signal.cpp b/src/helpers/signal/Signal.cpp new file mode 100644 index 00000000..a8adc275 --- /dev/null +++ b/src/helpers/signal/Signal.cpp @@ -0,0 +1,22 @@ +#include "Signal.hpp" +#include + +void CSignal::emit(std::any data) { + bool dirty = false; + + for (auto& l : m_vListeners) { + if (const CHyprSignalListener L = l.lock()) + L->emit(data); + else + dirty = true; + } + + if (dirty) + std::erase_if(m_vListeners, [](const auto& other) { return !other.lock(); }); +} + +CHyprSignalListener CSignal::registerListener(std::function handler) { + CHyprSignalListener listener = std::make_shared(handler); + m_vListeners.emplace_back(std::weak_ptr(listener)); + return listener; +} -- cgit v1.2.3