wayland: don't use wl_display_dispatch()

wl_display_dispatch() calls poll(), which is unnecessary since we
already know the FD is readable.

Use the more lower level wl_display_read_events() +
wl_display_dispatch_pending().

These require wl_display_prepare_read() to have been called.

The idea is to call wl_display_prepare_read() **before** calling
poll().

Thus, we do this more or less last in wayl_init(), and at the **end**
of the FDM handler.

However, having taking this lock also means we no longer can call
wl_display_roundtrip() directly (it will hang).

So, add a wrapper, wayl_roundtrip(), that cancels the read intent,
does the roundtrip, and then re-acquires the read intent.
This commit is contained in:
Daniel Eklöf 2020-01-03 21:02:12 +01:00
parent c6e46bbfac
commit 0ea0323d0f
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
3 changed files with 30 additions and 8 deletions

View file

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