static int headless_compositor_create_output(struct headless_compositor *c, int width, int height) { struct headless_output *output; struct wl_event_loop *loop; output = malloc(sizeof *output); if (output == NULL) return -1; memset(output, 0, sizeof *output); output->mode.flags = WL_OUTPUT_MODE_CURRENT | WL_OUTPUT_MODE_PREFERRED; output->mode.width = width; output->mode.height = height; output->mode.refresh = 60; wl_list_init(&output->base.mode_list); wl_list_insert(&output->base.mode_list, &output->mode.link); output->base.current = &output->mode; weston_output_init(&output->base, &c->base, 0, 0, width, height, WL_OUTPUT_TRANSFORM_NORMAL); output->base.make = "weston"; output->base.model = "headless"; weston_output_move(&output->base, 0, 0); loop = wl_display_get_event_loop(c->base.wl_display); output->finish_frame_timer = wl_event_loop_add_timer(loop, finish_frame_handler, output); output->base.origin = output->base.current; output->base.repaint = headless_output_repaint; output->base.destroy = headless_output_destroy; output->base.assign_planes = NULL; output->base.set_backlight = NULL; output->base.set_dpms = NULL; output->base.switch_mode = NULL; wl_list_insert(c->base.output_list.prev, &output->base.link); return 0; }
static int wayland_compositor_create_output(struct wayland_compositor *c, int width, int height) { struct wayland_output *output; output = malloc(sizeof *output); if (output == NULL) return -1; memset(output, 0, sizeof *output); output->mode.flags = WL_OUTPUT_MODE_CURRENT | WL_OUTPUT_MODE_PREFERRED; output->mode.width = width; output->mode.height = height; output->mode.refresh = 60; wl_list_init(&output->base.mode_list); wl_list_insert(&output->base.mode_list, &output->mode.link); output->base.current = &output->mode; weston_output_init(&output->base, &c->base, 0, 0, width, height, WL_OUTPUT_TRANSFORM_NORMAL, 1); output->base.make = "waywayland"; output->base.model = "none"; weston_output_move(&output->base, 0, 0); output->parent.surface = wl_compositor_create_surface(c->parent.compositor); wl_surface_set_user_data(output->parent.surface, output); output->parent.egl_window = wl_egl_window_create(output->parent.surface, width + c->border.left + c->border.right, height + c->border.top + c->border.bottom); if (!output->parent.egl_window) { weston_log("failure to create wl_egl_window\n"); goto cleanup_output; } if (gl_renderer_output_create(&output->base, output->parent.egl_window) < 0) goto cleanup_window; output->parent.draw_initial_frame = 1; output->parent.shell_surface = wl_shell_get_shell_surface(c->parent.shell, output->parent.surface); wl_shell_surface_add_listener(output->parent.shell_surface, &shell_surface_listener, output); wl_shell_surface_set_toplevel(output->parent.shell_surface); output->base.origin = output->base.current; output->base.start_repaint_loop = wayland_output_start_repaint_loop; output->base.repaint = wayland_output_repaint; output->base.destroy = wayland_output_destroy; output->base.assign_planes = NULL; output->base.set_backlight = NULL; output->base.set_dpms = NULL; output->base.switch_mode = NULL; wl_list_insert(c->base.output_list.prev, &output->base.link); return 0; cleanup_window: wl_egl_window_destroy(output->parent.egl_window); cleanup_output: /* FIXME: cleanup weston_output */ free(output); return -1; }