output = wl_container_of(listener, output, output_destroy);
assert(output->output == data);
- if (output->fullscreen_view.fs->view) {
+ if (output->fullscreen_view.fs &&
+ output->fullscreen_view.fs->view) {
weston_surface_destroy(output->fullscreen_view.fs->view->surface);
output->fullscreen_view.fs->view = NULL;
}
weston_head_detach(head);
if (count_heads(ivi_output->output) == 0) {
- weston_output_disable(ivi_output->output);
+ if (ivi_output->output) {
+ /* ivi_output->output destruction may be deferred in
+ * some cases (see drm_output_destroy()), so we need to
+ * forcibly trigger the destruction callback now, or
+ * otherwise would later access data that we are about
+ * to free
+ */
+ struct weston_output *save = ivi_output->output;
+
+ handle_output_destroy(&ivi_output->output_destroy, save);
+ weston_output_destroy(save);
+ }
}
+ wl_list_remove(&ivi_output->link);
+ free(ivi_output);
}
static struct weston_config_section *
weston_compositor_wake(ivi.compositor);
ivi_shell_create_global(&ivi);
- ivi_launch_shell_client(&ivi);
+
+ ivi_launch_shell_client(&ivi, "shell-client",
+ &ivi.shell_client.client);
+ ivi_launch_shell_client(&ivi, "shell-client-ext",
+ &ivi.shell_client_ext.client);
+
if (debug)
ivi_screenshooter_create(&ivi);
ivi_agl_systemd_notify(&ivi);