From cc98594c3aed0b542e03818371a4636f549f80e1 Mon Sep 17 00:00:00 2001 From: Vaxry Date: Fri, 5 Jul 2024 23:05:03 +0200 Subject: pointer: update geometry after unplug events fixes #6700 fixes #6740 --- src/managers/eventLoop/EventLoopManager.cpp | 38 ++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 9 deletions(-) (limited to 'src/managers/eventLoop/EventLoopManager.cpp') diff --git a/src/managers/eventLoop/EventLoopManager.cpp b/src/managers/eventLoop/EventLoopManager.cpp index 1193ffb8..0d1b0223 100644 --- a/src/managers/eventLoop/EventLoopManager.cpp +++ b/src/managers/eventLoop/EventLoopManager.cpp @@ -9,8 +9,10 @@ #define TIMESPEC_NSEC_PER_SEC 1000000000L -CEventLoopManager::CEventLoopManager() { - m_sTimers.timerfd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC); +CEventLoopManager::CEventLoopManager(wl_display* display, wl_event_loop* wlEventLoop) { + m_sTimers.timerfd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC); + m_sWayland.loop = wlEventLoop; + m_sWayland.display = display; } CEventLoopManager::~CEventLoopManager() { @@ -23,13 +25,10 @@ static int timerWrite(int fd, uint32_t mask, void* data) { return 1; } -void CEventLoopManager::enterLoop(wl_display* display, wl_event_loop* wlEventLoop) { - m_sWayland.loop = wlEventLoop; - m_sWayland.display = display; - - m_sWayland.eventSource = wl_event_loop_add_fd(wlEventLoop, m_sTimers.timerfd, WL_EVENT_READABLE, timerWrite, nullptr); +void CEventLoopManager::enterLoop() { + m_sWayland.eventSource = wl_event_loop_add_fd(m_sWayland.loop, m_sTimers.timerfd, WL_EVENT_READABLE, timerWrite, nullptr); - wl_display_run(display); + wl_display_run(m_sWayland.display); Debug::log(LOG, "Kicked off the event loop! :("); } @@ -86,4 +85,25 @@ void CEventLoopManager::nudgeTimers() { itimerspec ts = {.it_value = now}; timerfd_settime(m_sTimers.timerfd, TFD_TIMER_ABSTIME, &ts, nullptr); -} \ No newline at end of file +} + +void CEventLoopManager::doLater(const std::function& fn) { + m_sIdle.fns.emplace_back(fn); + + if (m_sIdle.eventSource) + return; + + m_sIdle.eventSource = wl_event_loop_add_idle( + m_sWayland.loop, + [](void* data) { + auto IDLE = (CEventLoopManager::SIdleData*)data; + auto cpy = IDLE->fns; + IDLE->fns.clear(); + IDLE->eventSource = nullptr; + for (auto& c : cpy) { + if (c) + c(); + } + }, + &m_sIdle); +} -- cgit v1.2.3