diff --git a/compositor/compositor.c b/compositor/compositor.c index 0fa9ed8d..06ee7f3f 100644 --- a/compositor/compositor.c +++ b/compositor/compositor.c @@ -2172,6 +2172,8 @@ int main(int argc, char *argv[]) if (xserver) wlsc_xserver_destroy(ec); + ec->shell->destroy(ec->shell); + if (ec->has_bind_display) ec->unbind_display(ec->display, display); diff --git a/compositor/compositor.h b/compositor/compositor.h index 4c011f01..8611b40a 100644 --- a/compositor/compositor.h +++ b/compositor/compositor.h @@ -161,6 +161,7 @@ struct wlsc_shell { void (*configure)(struct wlsc_shell *shell, struct wlsc_surface *surface, int32_t x, int32_t y, int32_t width, int32_t height); + void (*destroy)(struct wlsc_shell *shell); }; enum { diff --git a/compositor/shell.c b/compositor/shell.c index ee15ddfe..0f44addd 100644 --- a/compositor/shell.c +++ b/compositor/shell.c @@ -58,7 +58,7 @@ struct wl_shell { struct wl_list panels; struct { - const char *path; + char *path; int duration; struct wl_resource *binding; struct wl_list surfaces; @@ -123,7 +123,6 @@ shell_configuration(struct wl_shell *shell) shell->screensaver.duration = duration; return ret; - /* FIXME: free(shell->screensaver.path) on plugin fini */ } static void @@ -1234,6 +1233,15 @@ bind_screensaver(struct wl_client *client, wl_resource_destroy(resource, 0); } +static void +shell_destroy(struct wlsc_shell *base) +{ + struct wl_shell *shell = container_of(base, struct wl_shell, shell); + + free(shell->screensaver.path); + free(shell); +} + int shell_init(struct wlsc_compositor *ec); @@ -1252,6 +1260,7 @@ shell_init(struct wlsc_compositor *ec) shell->shell.unlock = unlock; shell->shell.map = map; shell->shell.configure = configure; + shell->shell.destroy = shell_destroy; wl_list_init(&shell->hidden_surface_list); wl_list_init(&shell->backgrounds); diff --git a/compositor/tablet-shell.c b/compositor/tablet-shell.c index 54985b21..5f91209d 100644 --- a/compositor/tablet-shell.c +++ b/compositor/tablet-shell.c @@ -511,6 +511,16 @@ bind_shell(struct wl_client *client, void *data, uint32_t version, uint32_t id) wl_client_add_resource(client, &shell->resource); } +static void +tablet_shell_destroy(struct wlsc_shell *base) +{ + struct tablet_shell *shell = + container_of(base, struct tablet_shell, shell); + + wl_event_source_remove(shell->long_press_source); + free(shell); +} + void shell_init(struct wlsc_compositor *compositor); @@ -552,6 +562,7 @@ shell_init(struct wlsc_compositor *compositor) shell->shell.unlock = tablet_shell_unlock; shell->shell.map = tablet_shell_map; shell->shell.configure = tablet_shell_configure; + shell->shell.destroy = tablet_shell_destroy; launch_ux_daemon(shell);