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.

(cherry picked from commit 3c2913dcb9)
This commit is contained in:
Camilla Löwy 2022-03-03 16:23:00 +01:00 committed by Camilla Löwy
parent 9f73e9afa3
commit 7302a8f520

View File

@ -831,6 +831,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[] =
@ -845,7 +864,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)