From 7d2d3958d5eedf5bf677a30dfd3e1dfb108474b3 Mon Sep 17 00:00:00 2001 From: Povilas Kanapickas Date: Wed, 20 May 2020 22:11:14 +0300 Subject: [PATCH] XWindowsEventQueueBuffer: Fix delays when waiting for new events QLength() may return 0 even if there are events pending because they need to be read from the display socket in order to become visible. We must use XPending() which will poll the socket if QLength() == 0. --- src/lib/platform/XWindowsEventQueueBuffer.cpp | 8 +++++++- src/lib/platform/XWindowsEventQueueBuffer.h | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/lib/platform/XWindowsEventQueueBuffer.cpp b/src/lib/platform/XWindowsEventQueueBuffer.cpp index 78f0e5af863..6c97c7edfd7 100644 --- a/src/lib/platform/XWindowsEventQueueBuffer.cpp +++ b/src/lib/platform/XWindowsEventQueueBuffer.cpp @@ -82,6 +82,12 @@ XWindowsEventQueueBuffer::~XWindowsEventQueueBuffer() close(m_pipefd[1]); } +int XWindowsEventQueueBuffer::getPendingCountLocked() +{ + Lock lock(&m_mutex); + return XPending(m_display); +} + void XWindowsEventQueueBuffer::waitForEvent(double dtimeout) { @@ -163,7 +169,7 @@ XWindowsEventQueueBuffer::waitForEvent(double dtimeout) // we want to give the cpu a chance s owe up this to 25ms #define TIMEOUT_DELAY 25 - while (((dtimeout < 0.0) || (remaining > 0)) && QLength(m_display)==0 && retval==0){ + while (((dtimeout < 0.0) || (remaining > 0)) && getPendingCountLocked() == 0 && retval == 0) { #if HAVE_POLL retval = poll(pfds, 2, TIMEOUT_DELAY); //16ms = 60hz, but we make it > to play nicely with the cpu if (pfds[1].revents & POLLIN) { diff --git a/src/lib/platform/XWindowsEventQueueBuffer.h b/src/lib/platform/XWindowsEventQueueBuffer.h index e49b282b05d..13f6b160d42 100644 --- a/src/lib/platform/XWindowsEventQueueBuffer.h +++ b/src/lib/platform/XWindowsEventQueueBuffer.h @@ -51,6 +51,8 @@ class XWindowsEventQueueBuffer : public IEventQueueBuffer { private: void flush(); + int getPendingCountLocked(); + private: typedef std::vector EventList; IXWindowsImpl* m_impl;