wayland: wl_display_flush() never blocks

Since it doesn't block, we need to detect EAGAIN failures and ensure
we actually flush everything.

If we don't, we sooner or later end up in a wayland client library
call that aborts due to the socket buffer being full.

Ideally, we'd simply enable POLLOUT in the FDM. However, we cannot
write *anything* to the wayland socket until we've actually managed to
send everything. This means enabling POLLOUT in the FDM wont work
since we may (*will*) end up trying to write more data to it before
we've flushed it.

So, add a wrapper function, wayl_flush(), that acts as a blocking
variant of wl_display_flush(), by detecting EAGAIN failiures and
calling poll() itself, on the wayland socket only, until all data has
been sent.
This commit is contained in:
Daniel Eklöf 2020-01-04 21:10:08 +01:00
parent 2128d5912f
commit abc36d8f09
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
3 changed files with 46 additions and 4 deletions

View file

@ -178,6 +178,7 @@ struct wayland {
struct wayland *wayl_init(const struct config *conf, struct fdm *fdm);
void wayl_destroy(struct wayland *wayl);
void wayl_flush(struct wayland *wayl);
void wayl_roundtrip(struct wayland *wayl);
struct terminal *wayl_terminal_from_surface(