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)
{
struct pollfd fds[] =
@ -730,7 +749,7 @@ static void handleEvents(int timeout)
// If an error other than EAGAIN happens, we have likely been disconnected
// 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;
while (window)

Loading…
Cancel
Save