Wayland: Fix potential incomplete display flushing

The flushing of a Wayland display may need to be done in several steps,
signalled by it failing with EAGAIN.
master
Camilla Löwy ago%!(EXTRA string=3 years)
parent 84b0923fe6
commit 3c2913dcb9
  1. 21
      src/wl_window.c

@ -716,6 +716,25 @@ static void incrementCursorImage(_GLFWwindow* window)
} }
} }
static GLFWbool flushDisplay(void)
{
while (wl_display_flush(_glfw.wl.display) == -1)
{
if (errno != EAGAIN)
return GLFW_FALSE;
struct pollfd fd = { wl_display_get_fd(_glfw.wl.display), POLLOUT };
while (poll(&fd, 1, -1) == -1)
{
if (errno != EINTR && errno != EAGAIN)
return GLFW_FALSE;
}
}
return GLFW_TRUE;
}
static void handleEvents(int timeout) static void handleEvents(int timeout)
{ {
struct pollfd fds[] = struct pollfd fds[] =
@ -730,7 +749,7 @@ static void handleEvents(int timeout)
// If an error other than EAGAIN happens, we have likely been disconnected // If an error other than EAGAIN happens, we have likely been disconnected
// from the Wayland session; try to handle that the best we can. // from the Wayland session; try to handle that the best we can.
if (wl_display_flush(_glfw.wl.display) < 0 && errno != EAGAIN) if (!flushDisplay())
{ {
_GLFWwindow* window = _glfw.windowListHead; _GLFWwindow* window = _glfw.windowListHead;
while (window) while (window)

Loading…
Cancel
Save