wayland: ignore configure events for unmapped surfaces

Closes #1249

Note that it is still unclear whether ack:ing a configure event for an
unmapped surface is a protocol violation, or something that should be
handled by the compositor.

According to
https://gitlab.freedesktop.org/wayland/wayland-protocols/-/issues/108,
Kwin, Mutter and Weston handles it, while wlroots does not.
This commit is contained in:
Daniel Eklöf 2022-12-29 11:32:21 +01:00
parent f2356adee3
commit 7f26914583
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
3 changed files with 15 additions and 0 deletions

View file

@ -123,6 +123,8 @@
causing a crash (double-free) on exit ([#1259][1259]).
* Double-width glyphs glitching when surrounded by glyphs overflowing
into the double-width glyph ([#1256][1256]).
* Wayland protocol violation when ack:ing a configure event for an
unmapped surface ([#1249][1249]).
[1173]: https://codeberg.org/dnkl/foot/issues/1173
[1190]: https://codeberg.org/dnkl/foot/issues/1190
@ -131,6 +133,7 @@
[1218]: https://codeberg.org/dnkl/foot/issues/1218
[1259]: https://codeberg.org/dnkl/foot/issues/1259
[1256]: https://codeberg.org/dnkl/foot/issues/1256
[1249]: https://codeberg.org/dnkl/foot/issues/1249
### Security

View file

@ -769,6 +769,16 @@ xdg_surface_configure(void *data, struct xdg_surface *xdg_surface,
struct wl_window *win = data;
struct terminal *term = win->term;
if (win->unmapped) {
/*
* https://codeberg.org/dnkl/foot/issues/1249
* https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3487
* https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3719
* https://gitlab.freedesktop.org/wayland/wayland-protocols/-/issues/108
*/
return;
}
bool wasnt_configured = !win->is_configured;
bool was_resizing = win->is_resizing;
bool csd_was_enabled = win->csd_mode == CSD_YES && !win->is_fullscreen;
@ -1619,6 +1629,7 @@ wayl_win_destroy(struct wl_window *win)
wayl_roundtrip(win->term->wl);
/* Main window */
win->unmapped = true;
wl_surface_attach(win->surface, NULL, 0, 0);
wl_surface_commit(win->surface);
wayl_roundtrip(win->term->wl);

View file

@ -327,6 +327,7 @@ struct wl_window {
tll(struct xdg_activation_token_context *) xdg_tokens;
bool urgency_token_is_pending;
#endif
bool unmapped;
struct zxdg_toplevel_decoration_v1 *xdg_toplevel_decoration;