wayland: Use wl_output_release with wl_output v3

wl_output_release, the use of which was recently introduced, is not
available until wl_output interface version 3.

However, only wl_output version 2 was bound. This lead to protocol
errors when a display was disconnected, causing foot to terminate.

Instead, only use wl_output_release if wl_output version 3 is provided
and bound. Otherwise, just use wl_output_destroy.

Closes: https://codeberg.org/dnkl/foot/issues/219
This commit is contained in:
Kenny Levinsen 2020-11-24 00:00:43 +01:00
parent 90edc09697
commit ab6327da26
2 changed files with 11 additions and 4 deletions

View file

@ -841,11 +841,12 @@ handle_global(void *data, struct wl_registry *registry,
return;
struct wl_output *output = wl_registry_bind(
wayl->registry, name, &wl_output_interface, required);
wayl->registry, name, &wl_output_interface, min(version, 3));
tll_push_back(
wayl->monitors,
((struct monitor){.wayl = wayl, .output = output, .wl_name = name}));
((struct monitor){.wayl = wayl, .output = output, .wl_name = name,
.use_output_release = version >= WL_OUTPUT_RELEASE_SINCE_VERSION}));
struct monitor *mon = &tll_back(wayl->monitors);
wl_output_add_listener(output, &output_listener, mon);
@ -901,8 +902,12 @@ monitor_destroy(struct monitor *mon)
{
if (mon->xdg != NULL)
zxdg_output_v1_destroy(mon->xdg);
if (mon->output != NULL)
wl_output_release(mon->output);
if (mon->output != NULL) {
if (mon->use_output_release)
wl_output_release(mon->output);
else
wl_output_destroy(mon->output);
}
free(mon->make);
free(mon->model);
free(mon->name);

View file

@ -294,6 +294,8 @@ struct monitor {
char *description;
float inch; /* e.g. 24" */
bool use_output_release;
};
struct wayland;