mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-03-23 05:33:57 -04: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)
|
wayl_win_init(struct wayland *wayl)
|
||||||
{
|
{
|
||||||
struct wl_window *win = calloc(1, sizeof(*win));
|
struct wl_window *win = calloc(1, sizeof(*win));
|
||||||
|
win->wayl = wayl;
|
||||||
|
|
||||||
win->surface = wl_compositor_create_surface(wayl->compositor);
|
win->surface = wl_compositor_create_surface(wayl->compositor);
|
||||||
if (win->surface == NULL) {
|
if (win->surface == NULL) {
|
||||||
|
|
@ -687,6 +688,25 @@ wayl_win_destroy(struct wl_window *win)
|
||||||
if (win == NULL)
|
if (win == NULL)
|
||||||
return;
|
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);
|
tll_free(win->on_outputs);
|
||||||
if (win->search_sub_surface != NULL)
|
if (win->search_sub_surface != NULL)
|
||||||
wl_subsurface_destroy(win->search_sub_surface);
|
wl_subsurface_destroy(win->search_sub_surface);
|
||||||
|
|
@ -702,6 +722,7 @@ wayl_win_destroy(struct wl_window *win)
|
||||||
xdg_surface_destroy(win->xdg_surface);
|
xdg_surface_destroy(win->xdg_surface);
|
||||||
if (win->surface != NULL)
|
if (win->surface != NULL)
|
||||||
wl_surface_destroy(win->surface);
|
wl_surface_destroy(win->surface);
|
||||||
|
|
||||||
free(win);
|
free(win);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -72,7 +72,9 @@ struct wl_primary {
|
||||||
uint32_t serial;
|
uint32_t serial;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct wayland;
|
||||||
struct wl_window {
|
struct wl_window {
|
||||||
|
struct wayland *wayl;
|
||||||
struct wl_surface *surface;
|
struct wl_surface *surface;
|
||||||
struct xdg_surface *xdg_surface;
|
struct xdg_surface *xdg_surface;
|
||||||
struct xdg_toplevel *xdg_toplevel;
|
struct xdg_toplevel *xdg_toplevel;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue