This commit is contained in:
Doug Binks 2025-12-29 16:10:30 +00:00 committed by GitHub
commit 051de33160
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 60 additions and 30 deletions

View File

@ -148,6 +148,8 @@ information on what to include when reporting a bug.
potential segmentation fault (#2744) potential segmentation fault (#2744)
- [Wayland] Bugfix: Confining or disabling the cursor could segfault on - [Wayland] Bugfix: Confining or disabling the cursor could segfault on
compositors without `pointer-constraints-unstable-v1` compositors without `pointer-constraints-unstable-v1`
- [Wayland] Bugfix: Events being lost due to some drivers moving events
to the default event queue during buffer swapping (#2793)
- [X11] Bugfix: Running without a WM could trigger an assert (#2593,#2601,#2631) - [X11] Bugfix: Running without a WM could trigger an assert (#2593,#2601,#2631)
- [X11] Bugfix: Occasional crash when an idle display awakes (#2766) - [X11] Bugfix: Occasional crash when an idle display awakes (#2766)
- [X11] Bugfix: Prevent BadWindow when creating small windows with a content scale - [X11] Bugfix: Prevent BadWindow when creating small windows with a content scale

View File

@ -1356,6 +1356,7 @@ static void handleEvents(double* timeout)
#endif #endif
GLFWbool event = GLFW_FALSE; GLFWbool event = GLFW_FALSE;
GLFWbool wlcanread = GLFW_FALSE;
enum { DISPLAY_FD, KEYREPEAT_FD, CURSOR_FD, LIBDECOR_FD }; enum { DISPLAY_FD, KEYREPEAT_FD, CURSOR_FD, LIBDECOR_FD };
struct pollfd fds[] = struct pollfd fds[] =
{ {
@ -1370,42 +1371,70 @@ static void handleEvents(double* timeout)
while (!event) while (!event)
{ {
while (wl_display_prepare_read(_glfw.wl.display) != 0) wlcanread = GLFW_FALSE;
while (!wlcanread && !event)
{ {
if (wl_display_dispatch_pending(_glfw.wl.display) > 0) if (wl_display_prepare_read(_glfw.wl.display) == 0)
return; {
wlcanread = GLFW_TRUE;
}
else if (wl_display_dispatch_pending(_glfw.wl.display) > 0)
{
event = GLFW_TRUE;
if (wl_display_prepare_read(_glfw.wl.display) == 0)
{
wlcanread = GLFW_TRUE;
}
}
} }
// If an error other than EAGAIN happens, we have likely been disconnected if (wlcanread)
// from the Wayland session; try to handle that the best we can. {
if (!flushDisplay()) // If an error other than EAGAIN happens, we have likely been disconnected
{ // from the Wayland session; try to handle that the best we can.
wl_display_cancel_read(_glfw.wl.display); if (!flushDisplay())
{
wl_display_cancel_read(_glfw.wl.display);
_GLFWwindow* window = _glfw.windowListHead; _GLFWwindow* window = _glfw.windowListHead;
while (window) while (window)
{ {
_glfwInputWindowCloseRequest(window); _glfwInputWindowCloseRequest(window);
window = window->next; window = window->next;
} }
return; return;
} }
if (!_glfwPollPOSIX(fds, sizeof(fds) / sizeof(fds[0]), timeout)) double* ptimeout = timeout;
{ double notimeout = 0.0;
wl_display_cancel_read(_glfw.wl.display); if (event)
return; ptimeout = &notimeout; // do not wait if we already have an event
}
if (!_glfwPollPOSIX(fds, sizeof(fds) / sizeof(fds[0]), ptimeout))
{
wl_display_cancel_read(_glfw.wl.display);
return;
}
if (fds[DISPLAY_FD].revents & POLLIN) if (fds[DISPLAY_FD].revents & POLLIN)
{ {
wl_display_read_events(_glfw.wl.display); wl_display_read_events(_glfw.wl.display);
if (wl_display_dispatch_pending(_glfw.wl.display) > 0) if (wl_display_dispatch_pending(_glfw.wl.display) > 0)
event = GLFW_TRUE; event = GLFW_TRUE;
} }
else else
wl_display_cancel_read(_glfw.wl.display); wl_display_cancel_read(_glfw.wl.display);
}
else
{
fds[DISPLAY_FD].fd = -1; // ignore wl events
double notimeout = 0.0;
if (!_glfwPollPOSIX(fds, sizeof(fds) / sizeof(fds[0]), &notimeout))
{
return;
}
}
if (fds[KEYREPEAT_FD].revents & POLLIN) if (fds[KEYREPEAT_FD].revents & POLLIN)
{ {
@ -1427,7 +1456,6 @@ static void handleEvents(double* timeout)
event = GLFW_TRUE; event = GLFW_TRUE;
} }
} }
} }