diff --git a/src/managers/eventLoop/EventLoopManager.cpp b/src/managers/eventLoop/EventLoopManager.cpp index 6233a2d0e..5b2e09d1a 100644 --- a/src/managers/eventLoop/EventLoopManager.cpp +++ b/src/managers/eventLoop/EventLoopManager.cpp @@ -77,11 +77,6 @@ void CEventLoopManager::onFdReadable(SReadableWaiter* waiter) { UP taken = std::move(*it); m_readableWaiters.erase(it); - if (taken->source) { - wl_event_source_remove(taken->source); - taken->source = nullptr; - } - if (taken->fn) taken->fn(); } diff --git a/src/managers/eventLoop/EventLoopManager.hpp b/src/managers/eventLoop/EventLoopManager.hpp index 977d2b012..0835b242f 100644 --- a/src/managers/eventLoop/EventLoopManager.hpp +++ b/src/managers/eventLoop/EventLoopManager.hpp @@ -42,6 +42,23 @@ class CEventLoopManager { wl_event_source* source; Hyprutils::OS::CFileDescriptor fd; std::function fn; + + SReadableWaiter(wl_event_source* src, Hyprutils::OS::CFileDescriptor f, std::function func) : source(src), fd(std::move(f)), fn(std::move(func)) {} + + ~SReadableWaiter() { + if (source) { + wl_event_source_remove(source); + source = nullptr; + } + } + + // copy + SReadableWaiter(const SReadableWaiter&) = delete; + SReadableWaiter& operator=(const SReadableWaiter&) = delete; + + // move + SReadableWaiter(SReadableWaiter&& other) noexcept = default; + SReadableWaiter& operator=(SReadableWaiter&& other) noexcept = default; }; // schedule function to when fd is readable (WL_EVENT_READABLE / POLLIN),