mirror of
https://github.com/glfw/glfw.git
synced 2024-11-26 03:52:01 +00:00
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:
parent
9f73e9afa3
commit
7302a8f520
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user