mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-05 04:06:08 -05:00
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:
parent
66b2097275
commit
95b7c405d4
2 changed files with 23 additions and 0 deletions
21
wayland.c
21
wayland.c
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue