backend/wayland: wait for xdg_surface.configure explicitly

We were assuming a roundtrip was enough to get an
xdg_surface.configure event. That's not the case, the protocol
spec doesn't make such a guarantee.
This commit is contained in:
Simon Ser 2023-08-16 22:09:01 +02:00
parent d3d3e19ffd
commit 22b6581a18
2 changed files with 10 additions and 1 deletions

View file

@ -718,6 +718,7 @@ static void xdg_surface_handle_configure(void *data,
struct wlr_wl_output *output = data; struct wlr_wl_output *output = data;
assert(output && output->xdg_surface == xdg_surface); assert(output && output->xdg_surface == xdg_surface);
output->configured = true;
xdg_surface_ack_configure(xdg_surface, serial); xdg_surface_ack_configure(xdg_surface, serial);
// nothing else? // nothing else?
@ -868,7 +869,14 @@ struct wlr_output *wlr_wl_output_create(struct wlr_backend *wlr_backend) {
&xdg_toplevel_listener, output); &xdg_toplevel_listener, output);
wl_surface_commit(output->surface); wl_surface_commit(output->surface);
wl_display_roundtrip(output->backend->remote_display); struct wl_event_loop *event_loop = wl_display_get_event_loop(backend->local_display);
while (!output->configured) {
int ret = wl_event_loop_dispatch(event_loop, -1);
if (ret < 0) {
wlr_log(WLR_ERROR, "wl_event_loop_dispatch() failed");
goto error;
}
}
output_start(output); output_start(output);

View file

@ -91,6 +91,7 @@ struct wlr_wl_output {
struct zxdg_toplevel_decoration_v1 *zxdg_toplevel_decoration_v1; struct zxdg_toplevel_decoration_v1 *zxdg_toplevel_decoration_v1;
struct wl_list presentation_feedbacks; struct wl_list presentation_feedbacks;
bool configured;
uint32_t enter_serial; uint32_t enter_serial;
struct { struct {