From d3dcb4222772462dd8193ce154efd1c1e4d82e95 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 17 Mar 2019 01:30:23 +0100 Subject: [PATCH] WindowServer: Don't nap in the message loop if there's a queued message. This fixes a bug where clicking on a button would sometimes take a while before showing up visually. --- WindowServer/WSMessageLoop.cpp | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/WindowServer/WSMessageLoop.cpp b/WindowServer/WSMessageLoop.cpp index 1d8f8a92e3b..88fe0d5a957 100644 --- a/WindowServer/WSMessageLoop.cpp +++ b/WindowServer/WSMessageLoop.cpp @@ -131,20 +131,22 @@ void WSMessageLoop::wait_for_message() }); struct timeval timeout = { 0, 0 }; - bool had_any_timer = false; - for (auto& it : m_timers) { - auto& timer = *it.value; - if (!had_any_timer) { - timeout = timer.next_fire_time; - had_any_timer = true; - continue; + if (m_queued_messages.is_empty()) { + bool had_any_timer = false; + for (auto& it : m_timers) { + auto& timer = *it.value; + if (!had_any_timer) { + timeout = timer.next_fire_time; + had_any_timer = true; + continue; + } + if (timer.next_fire_time.tv_sec > timeout.tv_sec || (timer.next_fire_time.tv_sec == timeout.tv_sec && timer.next_fire_time.tv_usec > timeout.tv_usec)) + timeout = timer.next_fire_time; } - if (timer.next_fire_time.tv_sec > timeout.tv_sec || (timer.next_fire_time.tv_sec == timeout.tv_sec && timer.next_fire_time.tv_usec > timeout.tv_usec)) - timeout = timer.next_fire_time; } - int rc = select(max_fd + 1, &rfds, nullptr, nullptr, m_timers.is_empty() && m_queued_messages.is_empty() ? nullptr : &timeout); + int rc = select(max_fd + 1, &rfds, nullptr, nullptr, m_queued_messages.is_empty() ? nullptr : &timeout); if (rc < 0) { ASSERT_NOT_REACHED(); }