--- src/compositor-drm.c | 2 +- src/compositor-wayland.c | 4 +-- src/compositor-x11.c | 2 +- src/compositor.c | 85 +++++++++++++++++++++++++++++++----------------- src/compositor.h | 9 +++-- 5 files changed, 67 insertions(+), 35 deletions(-)
diff --git a/src/compositor-drm.c b/src/compositor-drm.c index 643bb2b..c264ac8 100644 --- a/src/compositor-drm.c +++ b/src/compositor-drm.c @@ -2273,7 +2273,7 @@ update_outputs(struct drm_backend *b, struct udev_device *drm_device) /* FIXME: handle zero outputs, without terminating */ if (b->connector_allocator == 0) - wl_display_terminate(b->compositor->wl_display); + weston_compositor_terminate(b->compositor); } static int diff --git a/src/compositor-wayland.c b/src/compositor-wayland.c index 56fdcdf..40d6f64 100644 --- a/src/compositor-wayland.c +++ b/src/compositor-wayland.c @@ -1393,7 +1393,7 @@ input_handle_button(void *data, struct wl_pointer *pointer, } if (frame_status(input->output->frame) & FRAME_STATUS_CLOSE) - wl_display_terminate(input->backend->compositor->wl_display); + weston_compositor_terminate(input->backend->compositor); if (frame_status(input->output->frame) & FRAME_STATUS_REPAINT) weston_output_schedule_repaint(&input->output->base); @@ -1838,7 +1838,7 @@ wayland_backend_handle_event(int fd, uint32_t mask, void *data) int count = 0; if ((mask & WL_EVENT_HANGUP) || (mask & WL_EVENT_ERROR)) { - wl_display_terminate(b->compositor->wl_display); + weston_compositor_terminate(b->compositor); return 0; } diff --git a/src/compositor-x11.c b/src/compositor-x11.c index f8e061f..a09a502 100644 --- a/src/compositor-x11.c +++ b/src/compositor-x11.c @@ -935,7 +935,7 @@ x11_backend_delete_window(struct x11_backend *b, xcb_window_t window) xcb_flush(b->conn); if (wl_list_empty(&b->compositor->output_list)) - wl_display_terminate(b->compositor->wl_display); + weston_compositor_terminate(b->compositor); } #ifdef HAVE_XCB_XKB diff --git a/src/compositor.c b/src/compositor.c index 2243509..633f08c 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -4016,12 +4016,9 @@ weston_environment_get_fd(const char *env) } WL_EXPORT int -weston_compositor_init(struct weston_compositor *ec, - struct weston_config *config) +weston_compositor_init(struct weston_compositor *ec) { struct wl_event_loop *loop; - struct xkb_rule_names xkb_names; - struct weston_config_section *s; wl_signal_init(&ec->destroy_signal); wl_signal_init(&ec->create_surface_signal); @@ -4073,6 +4070,31 @@ weston_compositor_init(struct weston_compositor *ec, weston_plane_init(&ec->primary_plane, ec, 0, 0); weston_compositor_stack_plane(ec, &ec->primary_plane, NULL); + wl_data_device_manager_init(ec->wl_display); + + wl_display_init_shm(ec->wl_display); + + loop = wl_display_get_event_loop(ec->wl_display); + ec->idle_source = wl_event_loop_add_timer(loop, idle_handler, ec); + wl_event_source_timer_update(ec->idle_source, ec->idle_time * 1000); + + ec->input_loop = wl_event_loop_create(); + + weston_layer_init(&ec->fade_layer, &ec->layer_list); + weston_layer_init(&ec->cursor_layer, &ec->fade_layer.link); + + weston_compositor_schedule_repaint(ec); + + return 0; +} + +static int +weston_compositor_init_config(struct weston_compositor *ec, + struct weston_config *config) +{ + struct xkb_rule_names xkb_names; + struct weston_config_section *s; + s = weston_config_get_section(config, "keyboard", NULL, NULL); weston_config_section_get_string(s, "keymap_rules", (char **) &xkb_names.rules, NULL); @@ -4095,21 +4117,6 @@ weston_compositor_init(struct weston_compositor *ec, text_backend_init(ec, config); - wl_data_device_manager_init(ec->wl_display); - - wl_display_init_shm(ec->wl_display); - - loop = wl_display_get_event_loop(ec->wl_display); - ec->idle_source = wl_event_loop_add_timer(loop, idle_handler, ec); - wl_event_source_timer_update(ec->idle_source, ec->idle_time * 1000); - - ec->input_loop = wl_event_loop_create(); - - weston_layer_init(&ec->fade_layer, &ec->layer_list); - weston_layer_init(&ec->cursor_layer, &ec->fade_layer.link); - - weston_compositor_schedule_repaint(ec); - return 0; } @@ -4612,6 +4619,12 @@ weston_create_listening_socket(struct wl_display *display, const char *socket_na return 0; } +static void +handle_terminate(struct weston_compositor *c) +{ + wl_display_terminate(c->wl_display); +} + int main(int argc, char *argv[]) { int ret = EXIT_SUCCESS; @@ -4725,7 +4738,8 @@ int main(int argc, char *argv[]) } ec->wl_display = display; - if (weston_compositor_init(ec, config) < 0) { + if (weston_compositor_init(ec) < 0 || + weston_compositor_init_config(ec, config) < 0) { ret = EXIT_FAILURE; goto out_signals; } @@ -4741,6 +4755,7 @@ int main(int argc, char *argv[]) ec->idle_time = idle_time; ec->default_pointer_grab = NULL; + ec->terminate = handle_terminate; for (i = 1; i < argc; i++) weston_log("fatal: unhandled option: %s\n", argv[i]); @@ -4807,15 +4822,7 @@ int main(int argc, char *argv[]) wl_display_run(display); out: - /* prevent further rendering while shutting down */ - ec->state = WESTON_COMPOSITOR_OFFSCREEN; - - wl_signal_emit(&ec->destroy_signal, ec); - - weston_compositor_xkb_destroy(ec); - - ec->backend->destroy(ec); - free(ec); + weston_compositor_destroy(ec); out_signals: for (i = ARRAY_LENGTH(signals) - 1; i >= 0; i--) @@ -4836,3 +4843,23 @@ out_signals: return ret; } + +WL_EXPORT void +weston_compositor_destroy(struct weston_compositor *ec) +{ + /* prevent further rendering while shutting down */ + ec->state = WESTON_COMPOSITOR_OFFSCREEN; + + wl_signal_emit(&ec->destroy_signal, ec); + + weston_compositor_xkb_destroy(ec); + + ec->backend->destroy(ec); + free(ec); +} + +WL_EXPORT void +weston_compositor_terminate(struct weston_compositor *ec) +{ + ec->terminate(ec); +} diff --git a/src/compositor.h b/src/compositor.h index 75e3961..3fc8eaa 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -665,6 +665,8 @@ struct weston_compositor { int32_t kb_repeat_delay; clockid_t presentation_clock; + + void (*terminate)(struct weston_compositor *c); }; struct weston_buffer { @@ -1253,9 +1255,12 @@ weston_buffer_reference(struct weston_buffer_reference *ref, uint32_t weston_compositor_get_time(void); +void +weston_compositor_destroy(struct weston_compositor *ec); int -weston_compositor_init(struct weston_compositor *ec, - struct weston_config *config); +weston_compositor_init(struct weston_compositor *ec); +void +weston_compositor_terminate(struct weston_compositor *ec); int weston_compositor_set_presentation_clock(struct weston_compositor *compositor, clockid_t clk_id); -- 2.1.3 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel