wayland: wayl_win_destroy(): unmap windows before destroying

This will trigger e.d. keyboard_leave() and wl_pointer_leave() events,
which ensures there aren't any references to the destroyed window from
the global wayland struct.

Call wl_display_roundtrip() to trigger those events *before* we
destroy the window.
This commit is contained in:
Daniel Eklöf 2019-11-01 20:19:53 +01:00
parent 66b2097275
commit 95b7c405d4
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
2 changed files with 23 additions and 0 deletions

View file

@ -639,6 +639,7 @@ struct wl_window *
wayl_win_init(struct wayland *wayl)
{
struct wl_window *win = calloc(1, sizeof(*win));
win->wayl = wayl;
win->surface = wl_compositor_create_surface(wayl->compositor);
if (win->surface == NULL) {
@ -687,6 +688,25 @@ wayl_win_destroy(struct wl_window *win)
if (win == NULL)
return;
/*
* First, unmap all surfaces to trigger things like
* keyboard_leave() and wl_pointer_leave().
*
* This ensures we remove all references to *this* window from the
* global wayland struct (since it no longer has neither keyboard
* nor mouse focus).
*/
/* Scrollback search */
wl_surface_attach(win->search_surface, NULL, 0, 0);
wl_surface_commit(win->search_surface);
wl_display_roundtrip(win->wayl->display);
/* Main window */
wl_surface_attach(win->surface, NULL, 0, 0);
wl_surface_commit(win->surface);
wl_display_roundtrip(win->wayl->display);
tll_free(win->on_outputs);
if (win->search_sub_surface != NULL)
wl_subsurface_destroy(win->search_sub_surface);
@ -702,6 +722,7 @@ wayl_win_destroy(struct wl_window *win)
xdg_surface_destroy(win->xdg_surface);
if (win->surface != NULL)
wl_surface_destroy(win->surface);
free(win);
}

View file

@ -72,7 +72,9 @@ struct wl_primary {
uint32_t serial;
};
struct wayland;
struct wl_window {
struct wayland *wayl;
struct wl_surface *surface;
struct xdg_surface *xdg_surface;
struct xdg_toplevel *xdg_toplevel;