term: destroy: unref key bindings *after* destroying window

This fixes a crash-on-exit on compositors that emit a _"keyboard
leave"_ event when a surface is unmapped.

In our case, destroying the window (where we unmap it) in
term_destroy(), lead to a crash in term_mouse_grabbed(), due to
key_binding_for() returning NULL.

The call chain in this is case is, roughly:

  term_destroy() ->
  wayl_win_destroy() ->
  keyboard_leave() ->
  term_xcursor_update_for_seat() ->
  term_mouse_grabbed()
This commit is contained in:
Daniel Eklöf 2023-07-18 16:13:36 +02:00
parent 27b4c2ac2d
commit fdd753263b
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
2 changed files with 4 additions and 2 deletions

View file

@ -70,6 +70,8 @@
connected ([#1404][1404]).
* Crash when _pointer capability_ is removed from a seat, on
compositors without `cursor-shape-v1 support` ([#1411][1411]).
* Crash on exit, if the mouse is hovering over the foot window (does
not happen on all compositors)
[1404]: https://codeberg.org/dnkl/foot/issues/1404
[1411]: https://codeberg.org/dnkl/foot/pulls/1411

View file

@ -1607,8 +1607,6 @@ term_destroy(struct terminal *term)
if (term == NULL)
return 0;
key_binding_unref(term->wl->key_binding_manager, term->conf);
tll_foreach(term->wl->terms, it) {
if (it->item == term) {
tll_remove(term->wl->terms, it);
@ -1654,6 +1652,8 @@ term_destroy(struct terminal *term)
}
mtx_unlock(&term->render.workers.lock);
key_binding_unref(term->wl->key_binding_manager, term->conf);
urls_reset(term);
free(term->vt.osc.data);