#pragma once #include #include #include #include #include #include "helpers/signal/Signal.hpp" #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: // Manages the event sources after AQ pollFDs change. void syncPollFDs(); struct SEventSourceData { SP pollFD; wl_event_source* eventSource = nullptr; }; struct { wl_event_loop* loop = nullptr; wl_display* display = nullptr; wl_event_source* eventSource = nullptr; } m_sWayland; struct { std::vector> timers; Hyprutils::OS::CFileDescriptor timerfd; } m_sTimers; SIdleData m_sIdle; std::map aqEventSources; struct { CHyprSignalListener pollFDsChanged; } m_sListeners; wl_event_source* m_configWatcherInotifySource = nullptr; friend class CSyncTimeline; }; inline UP g_pEventLoopManager;