From 55556aaac4d867c9ed797274ffe0b206e1744f74 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 13 Jul 2018 10:56:12 +0530 Subject: [PATCH] Ensure queued display events are dispatched when polling/waiting for events --- glfw/wl_window.c | 5 ++++- glfw/x11_window.c | 13 ++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/glfw/wl_window.c b/glfw/wl_window.c index a5f06ac4c..d75eba810 100644 --- a/glfw/wl_window.c +++ b/glfw/wl_window.c @@ -1163,16 +1163,19 @@ void _glfwPlatformSetWindowOpacity(_GLFWwindow* window, float opacity) void _glfwPlatformPollEvents(void) { + wl_display_dispatch_pending(_glfw.wl.display); handleEvents(0); } void _glfwPlatformWaitEvents(void) { - handleEvents(-1); + double timeout = wl_display_dispatch_pending(_glfw.wl.display) > 0 ? 0 : -1; + handleEvents(timeout); } void _glfwPlatformWaitEventsTimeout(double timeout) { + if (wl_display_dispatch_pending(_glfw.wl.display) > 0) timeout = 0; handleEvents(timeout); } diff --git a/glfw/x11_window.c b/glfw/x11_window.c index cea7478b5..213ead16d 100644 --- a/glfw/x11_window.c +++ b/glfw/x11_window.c @@ -54,7 +54,7 @@ // This avoids blocking other threads via the per-display Xlib lock that also // covers GLX functions // -void _glfwDispatchX11Events(void); +GLFWbool _glfwDispatchX11Events(void); static void handleEvents(double timeout) { @@ -2543,8 +2543,10 @@ void _glfwPlatformSetWindowOpacity(_GLFWwindow* window, float opacity) PropModeReplace, (unsigned char*) &value, 1); } -void _glfwDispatchX11Events(void) { +GLFWbool +_glfwDispatchX11Events(void) { _GLFWwindow* window; + GLFWbool dispatched = GLFW_FALSE; #if defined(__linux__) _glfwDetectJoystickConnectionLinux(); @@ -2556,6 +2558,7 @@ void _glfwDispatchX11Events(void) { XEvent event; XNextEvent(_glfw.x11.display, &event); processEvent(&event); + dispatched = GLFW_TRUE; } window = _glfw.x11.disabledCursorWindow; @@ -2574,20 +2577,24 @@ void _glfwDispatchX11Events(void) { } XFlush(_glfw.x11.display); + return dispatched; } void _glfwPlatformPollEvents(void) { + _glfwDispatchX11Events(); handleEvents(0); } void _glfwPlatformWaitEvents(void) { - handleEvents(-1); + double timeout = _glfwDispatchX11Events() ? 0 : -1; + handleEvents(timeout); } void _glfwPlatformWaitEventsTimeout(double timeout) { + if (_glfwDispatchX11Events()) timeout = 0; handleEvents(timeout); }