Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

XWindowsEventQueueBuffer: Fix delays when waiting for new events #679

Merged
merged 1 commit into from
May 30, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion src/lib/platform/XWindowsEventQueueBuffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,19 @@ XWindowsEventQueueBuffer::~XWindowsEventQueueBuffer()
close(m_pipefd[1]);
}

int XWindowsEventQueueBuffer::getPendingCountLocked()
{
Lock lock(&m_mutex);
// work around a bug in old libx11 which causes the first XPending not to read events under
// certain conditions. The issue happens when libx11 has not yet received replies for all
// flushed events. In that case, internally XPending will not try to process received events
// as the reply for the last event was not found. As a result, XPending will return the number
// of pending events without regard to the events it has just read.
// https://gitlab.freedesktop.org/xorg/lib/libx11/-/merge_requests/1 fixes this on libx11 side.
m_impl->XPending(m_display);
return m_impl->XPending(m_display);
}

void
XWindowsEventQueueBuffer::waitForEvent(double dtimeout)
{
Expand Down Expand Up @@ -163,7 +176,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) {
Expand Down
2 changes: 2 additions & 0 deletions src/lib/platform/XWindowsEventQueueBuffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ class XWindowsEventQueueBuffer : public IEventQueueBuffer {
private:
void flush();

int getPendingCountLocked();

private:
typedef std::vector<XEvent> EventList;
IXWindowsImpl* m_impl;
Expand Down