#pragma once #include #include #include #include #include "EventLoopTimer.hpp" namespace Aquamarine { struct SPollFD; }; class CEventLoopManager { public: CEventLoopManager(wl_display* display, wl_event_loop* wlEventLoop); ~CEventLoopManager(); void enterLoop(); // Note: will remove the timer if the ptr is lost. void addTimer(SP timer); void removeTimer(SP timer); void onTimerFire(); // recalculates timers void nudgeTimers(); // schedules a function to run later, aka in a wayland idle event. void doLater(const std::function& fn); struct SIdleData { wl_event_source* eventSource = nullptr; std::vector> fns; }; private: struct { wl_event_loop* loop = nullptr; wl_display* display = nullptr; wl_event_source* eventSource = nullptr; std::vector aqEventSources; } m_sWayland; struct { std::vector> timers; int timerfd = -1; } m_sTimers; SIdleData m_sIdle; std::vector> aqPollFDs; friend class CSyncTimeline; }; inline std::unique_ptr g_pEventLoopManager;