diff --git a/CHANGELOG.md b/CHANGELOG.md index e5e4bbf4..69c5db1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -126,6 +126,9 @@ * Rare occurrences where the window did not close when the shell exited. Only seen on FreeBSD (https://codeberg.org/dnkl/foot/issues/534) +* Foot process(es) sometimes remaining, using 100% CPU, when closing + multiple foot windows at the same time + (https://codeberg.org/dnkl/foot/issues/542). ### Security diff --git a/wayland.c b/wayland.c index e1055101..3c0209d4 100644 --- a/wayland.c +++ b/wayland.c @@ -1589,14 +1589,21 @@ void wayl_roundtrip(struct wayland *wayl) { wl_display_cancel_read(wayl->display); - wl_display_roundtrip(wayl->display); + if (wl_display_roundtrip(wayl->display) < 0) { + LOG_ERRNO("failed to roundtrip Wayland display"); + return; + } /* I suspect the roundtrip above clears the pending queue, and * that prepare_read() will always succeed in the first call. But, * better safe than sorry... */ - while (wl_display_prepare_read(wayl->display) != 0) - wl_display_dispatch_pending(wayl->display); + while (wl_display_prepare_read(wayl->display) != 0) { + if (wl_display_dispatch_pending(wayl->display) < 0) { + LOG_ERRNO("failed to dispatch pending Wayland events"); + return; + } + } wayl_flush(wayl); }