Fix wlr_wl/xdg_shell_destroy segfault

- Implement xdg_shell_destroy and use it at the right place
(impl->destroy is never called)
- Remove wl_global_destroy for now, something is missing with the
display/registry_resource_list
This commit is contained in:
Dominique Martinet 2017-08-15 15:38:30 +02:00
parent f9b55dfa95
commit dca3f630dd
2 changed files with 9 additions and 4 deletions

View file

@ -145,6 +145,7 @@ void wlr_wl_shell_destroy(struct wlr_wl_shell *wlr_wl_shell) {
wl_list_remove(link); wl_list_remove(link);
} }
// TODO: destroy surfaces // TODO: destroy surfaces
wl_global_destroy(wlr_wl_shell->wl_global); // TODO: this segfault (wl_display->registry_resource_list is not init)
// wl_global_destroy(wlr_wl_shell->wl_global);
free(wlr_wl_shell); free(wlr_wl_shell);
} }

View file

@ -158,12 +158,15 @@ static void xdg_shell_pong(struct wl_client *client,
} }
static struct zxdg_shell_v6_interface xdg_shell_impl = { static struct zxdg_shell_v6_interface xdg_shell_impl = {
.destroy = resource_destroy,
.create_positioner = xdg_shell_create_positioner, .create_positioner = xdg_shell_create_positioner,
.get_xdg_surface = xdg_shell_get_xdg_surface, .get_xdg_surface = xdg_shell_get_xdg_surface,
.pong = xdg_shell_pong, .pong = xdg_shell_pong,
}; };
static void xdg_shell_destroy(struct wl_resource *resource) {
wl_list_remove(wl_resource_get_link(resource));
}
static void xdg_shell_bind(struct wl_client *wl_client, void *_xdg_shell, static void xdg_shell_bind(struct wl_client *wl_client, void *_xdg_shell,
uint32_t version, uint32_t id) { uint32_t version, uint32_t id) {
struct wlr_xdg_shell_v6 *xdg_shell = _xdg_shell; struct wlr_xdg_shell_v6 *xdg_shell = _xdg_shell;
@ -175,7 +178,7 @@ static void xdg_shell_bind(struct wl_client *wl_client, void *_xdg_shell,
} }
struct wl_resource *wl_resource = wl_resource_create( struct wl_resource *wl_resource = wl_resource_create(
wl_client, &zxdg_shell_v6_interface, version, id); wl_client, &zxdg_shell_v6_interface, version, id);
wl_resource_set_implementation(wl_resource, &xdg_shell_impl, xdg_shell, NULL); wl_resource_set_implementation(wl_resource, &xdg_shell_impl, xdg_shell, xdg_shell_destroy);
wl_list_insert(&xdg_shell->wl_resources, wl_resource_get_link(wl_resource)); wl_list_insert(&xdg_shell->wl_resources, wl_resource_get_link(wl_resource));
} }
@ -207,6 +210,7 @@ void wlr_xdg_shell_v6_destroy(struct wlr_xdg_shell_v6 *xdg_shell) {
wl_list_remove(link); wl_list_remove(link);
} }
// TODO: destroy surfaces // TODO: destroy surfaces
wl_global_destroy(xdg_shell->wl_global); // TODO: this segfault (wl_display->registry_resource_list is not init)
// wl_global_destroy(xdg_shell->wl_global);
free(xdg_shell); free(xdg_shell);
} }