uint32_t crtc_id;
uint32_t connector_id;
+ drmModeCrtcPtr original_crtc;
GLuint rbo[2];
uint32_t fb_id[2];
EGLImageKHR image[2];
return ret;
}
+static void
+drm_output_destroy(struct wlsc_output *output_base)
+{
+ struct drm_output *output = (struct drm_output *) output_base;
+ struct drm_compositor *c =
+ (struct drm_compositor *) output_base->compositor;
+ drmModeCrtcPtr origcrtc = output->original_crtc;
+ int i;
+
+ /* Turn off hardware cursor */
+ drm_output_set_cursor(output_base, NULL);
+
+ /* Restore original CRTC state */
+ drmModeSetCrtc(c->drm.fd, origcrtc->crtc_id, origcrtc->buffer_id,
+ origcrtc->x, origcrtc->y, &output->connector_id, 1, &origcrtc->mode);
+ drmModeFreeCrtc(origcrtc);
+
+ /* Destroy output buffers */
+ for (i = 0; i < 2; i++) {
+ drmModeRmFB(c->drm.fd, output->fb_id[i]);
+ c->base.destroy_image(c->base.display, output->image[i]);
+ gbm_bo_destroy(output->bo[i]);
+ }
+
+ free(output);
+}
+
static int
on_drm_input(int fd, uint32_t mask, void *data)
{
output->connector_id = connector->connector_id;
ec->connector_allocator |= (1 << output->connector_id);
+ output->original_crtc = drmModeGetCrtc(ec->drm.fd, output->crtc_id);
+
for (i = 0; i < connector->count_modes; i++)
drm_output_add_mode(output, &connector->modes[i]);
if (connector->count_modes == 0)
output->base.prepare_scanout_surface =
drm_output_prepare_scanout_surface;
output->base.set_hardware_cursor = drm_output_set_cursor;
+ output->base.destroy = drm_output_destroy;
return 0;
}
{
struct drm_compositor *d = (struct drm_compositor *) ec;
+ wlsc_compositor_shutdown(ec);
+ gbm_device_destroy(d->gbm);
tty_destroy(d->tty);
free(d);
return -1;
}
+static void
+wfd_output_destroy(struct wlsc_output *output_base)
+{
+ destroy_output(output_base);
+
+ return;
+}
+
static int
wfd_output_add_mode(struct wfd_output *output, WFDPortMode mode)
{
output->base.prepare_scanout_surface =
wfd_output_prepare_scanout_surface;
output->base.set_hardware_cursor = wfd_output_set_cursor;
+ output->base.destroy = wfd_output_destroy;
wl_list_insert(ec->base.output_list.prev, &output->base.link);
{
struct wfd_compositor *d = (struct wfd_compositor *) ec;
+ wlsc_compositor_shutdown(ec);
+
udev_unref(d->udev);
wfdDestroyDevice(d->dev);
return -1;
}
+static void
+wayland_output_destroy(struct wlsc_output *output_base)
+{
+ struct wayland_output *output = (struct wayland_output *) output_base;
+ struct wlsc_compositor *ec = output->base.compositor;
+
+ eglDestroySurface(ec->display, output->egl_surface);
+ wl_egl_window_destroy(output->parent.egl_window);
+ free(output);
+
+ return;
+}
+
static int
wayland_compositor_create_output(struct wayland_compositor *c,
int width, int height)
output->base.prepare_scanout_surface =
wayland_output_prepare_scanout_surface;
output->base.set_hardware_cursor = wayland_output_set_cursor;
+ output->base.destroy = wayland_output_destroy;
wl_list_insert(c->base.output_list.prev, &output->base.link);
static void
wayland_destroy(struct wlsc_compositor *ec)
{
+ wlsc_compositor_shutdown(ec);
+
free(ec);
}
return -1;
}
+static void
+x11_output_destroy(struct wlsc_output *output_base)
+{
+ return;
+}
static void
x11_output_set_wm_protocols(struct x11_output *output)
output->base.prepare_scanout_surface =
x11_output_prepare_scanout_surface;
output->base.set_hardware_cursor = x11_output_set_cursor;
+ output->base.destroy = x11_output_destroy;
wl_list_insert(c->base.output_list.prev, &output->base.link);
static void
x11_destroy(struct wlsc_compositor *ec)
{
+ wlsc_compositor_shutdown(ec);
+
free(ec);
}
return 0;
}
+WL_EXPORT int
+wlsc_compositor_shutdown(struct wlsc_compositor *ec)
+{
+ struct wlsc_output *output;
+
+ /* Destroy all outputs associated with this compositor */
+ wl_list_for_each(output, &ec->output_list, link)
+ output->destroy(output);
+}
+
static int on_term_signal(int signal_number, void *data)
{
struct wl_display *display = data;
struct wlsc_surface *es);
int (*set_hardware_cursor)(struct wlsc_output *output,
struct wlsc_input_device *input);
+ void (*destroy)(struct wlsc_output *output);
};
enum wlsc_pointer_type {
int
wlsc_compositor_init(struct wlsc_compositor *ec, struct wl_display *display);
+int
+wlsc_compositor_shutdown(struct wlsc_compositor *ec);
void
wlsc_output_move(struct wlsc_output *output, int x, int y);
void