This is to make them usable by future libweston users, since they will not use weston_config. weston_config is still used in the backends entry points, which will later on live in their own files. --- src/compositor-drm.c | 349 +++++++++++++++++++++++++---------------------- src/compositor-fbdev.c | 10 +- src/compositor-rdp.c | 8 +- src/compositor-wayland.c | 32 ++--- src/compositor-x11.c | 117 ++++++++-------- src/compositor.c | 6 +- src/compositor.h | 2 +- 7 files changed, 266 insertions(+), 258 deletions(-)
diff --git a/src/compositor-drm.c b/src/compositor-drm.c index 4fdf5db..b858b93 100644 --- a/src/compositor-drm.c +++ b/src/compositor-drm.c @@ -78,6 +78,19 @@ enum output_config { OUTPUT_CONFIG_MODELINE }; +struct drm_output_parameters { + uint32_t format; + char *seat; + int scale; + uint32_t transform; + struct { + enum output_config config; + int width; + int height; + drmModeModeInfo modeline; + } mode; +}; + struct drm_backend { struct weston_backend base; struct weston_compositor *compositor; @@ -123,6 +136,9 @@ struct drm_backend { uint32_t cursor_width; uint32_t cursor_height; + + void (*get_output_parameters)(const char *name, + struct drm_output_parameters *parameters); }; struct drm_mode { @@ -216,6 +232,9 @@ struct drm_parameters { int tty; int use_pixman; const char *seat_id; + uint32_t format; + void (*get_output_parameters)(const char *name, + struct drm_output_parameters *parameters); }; static struct gl_renderer_interface *gl_renderer; @@ -1820,76 +1839,6 @@ find_and_parse_output_edid(struct drm_backend *b, drmModeFreePropertyBlob(edid_blob); } - - -static int -parse_modeline(const char *s, drmModeModeInfo *mode) -{ - char hsync[16]; - char vsync[16]; - float fclock; - - mode->type = DRM_MODE_TYPE_USERDEF; - mode->hskew = 0; - mode->vscan = 0; - mode->vrefresh = 0; - mode->flags = 0; - - if (sscanf(s, "%f %hd %hd %hd %hd %hd %hd %hd %hd %15s %15s", - &fclock, - &mode->hdisplay, - &mode->hsync_start, - &mode->hsync_end, - &mode->htotal, - &mode->vdisplay, - &mode->vsync_start, - &mode->vsync_end, - &mode->vtotal, hsync, vsync) != 11) - return -1; - - mode->clock = fclock * 1000; - if (strcmp(hsync, "+hsync") == 0) - mode->flags |= DRM_MODE_FLAG_PHSYNC; - else if (strcmp(hsync, "-hsync") == 0) - mode->flags |= DRM_MODE_FLAG_NHSYNC; - else - return -1; - - if (strcmp(vsync, "+vsync") == 0) - mode->flags |= DRM_MODE_FLAG_PVSYNC; - else if (strcmp(vsync, "-vsync") == 0) - mode->flags |= DRM_MODE_FLAG_NVSYNC; - else - return -1; - - return 0; -} - -static uint32_t -parse_transform(const char *transform, const char *output_name) -{ - static const struct { const char *name; uint32_t token; } names[] = { - { "normal", WL_OUTPUT_TRANSFORM_NORMAL }, - { "90", WL_OUTPUT_TRANSFORM_90 }, - { "180", WL_OUTPUT_TRANSFORM_180 }, - { "270", WL_OUTPUT_TRANSFORM_270 }, - { "flipped", WL_OUTPUT_TRANSFORM_FLIPPED }, - { "flipped-90", WL_OUTPUT_TRANSFORM_FLIPPED_90 }, - { "flipped-180", WL_OUTPUT_TRANSFORM_FLIPPED_180 }, - { "flipped-270", WL_OUTPUT_TRANSFORM_FLIPPED_270 }, - }; - unsigned int i; - - for (i = 0; i < ARRAY_LENGTH(names); i++) - if (strcmp(names[i].name, transform) == 0) - return names[i].token; - - weston_log("Invalid transform \"%s\" for output %s\n", - transform, output_name); - - return WL_OUTPUT_TRANSFORM_NORMAL; -} - static void setup_output_seat_constraint(struct drm_backend *b, struct weston_output *output, @@ -1910,35 +1859,6 @@ setup_output_seat_constraint(struct drm_backend *b, } static int -get_gbm_format_from_section(struct weston_config_section *section, - uint32_t default_value, - uint32_t *format) -{ - char *s; - int ret = 0; - - weston_config_section_get_string(section, - "gbm-format", &s, NULL); - - if (s == NULL) - *format = default_value; - else if (strcmp(s, "xrgb8888") == 0) - *format = GBM_FORMAT_XRGB8888; - else if (strcmp(s, "rgb565") == 0) - *format = GBM_FORMAT_RGB565; - else if (strcmp(s, "xrgb2101010") == 0) - *format = GBM_FORMAT_XRGB2101010; - else { - weston_log("fatal: unrecognized pixel format: %s\n", s); - ret = -1; - } - - free(s); - - return ret; -} - -static int create_output_for_connector(struct drm_backend *b, drmModeRes *resources, drmModeConnector *connector, @@ -1947,15 +1867,13 @@ create_output_for_connector(struct drm_backend *b, struct drm_output *output; struct drm_mode *drm_mode, *next, *preferred, *current, *configured, *best; struct weston_mode *m; - struct weston_config_section *section; drmModeEncoder *encoder; - drmModeModeInfo crtc_mode, modeline; + drmModeModeInfo crtc_mode; drmModeCrtc *crtc; - int i, width, height, scale; - char name[32], *s; + int i; + char name[32]; const char *type_name; - enum output_config config; - uint32_t transform; + struct drm_output_parameters params = { 0 }; i = find_crtc_for_connector(b, resources, connector); if (i < 0) { @@ -1980,39 +1898,13 @@ create_output_for_connector(struct drm_backend *b, snprintf(name, 32, "%s%d", type_name, connector->connector_type_id); output->base.name = strdup(name); - section = weston_config_get_section(b->compositor->config, "output", "name", - output->base.name); - weston_config_section_get_string(section, "mode", &s, "preferred"); - if (strcmp(s, "off") == 0) - config = OUTPUT_CONFIG_OFF; - else if (strcmp(s, "preferred") == 0) - config = OUTPUT_CONFIG_PREFERRED; - else if (strcmp(s, "current") == 0) - config = OUTPUT_CONFIG_CURRENT; - else if (sscanf(s, "%dx%d", &width, &height) == 2) - config = OUTPUT_CONFIG_MODE; - else if (parse_modeline(s, &modeline) == 0) - config = OUTPUT_CONFIG_MODELINE; - else { - weston_log("Invalid mode \"%s\" for output %s\n", - s, output->base.name); - config = OUTPUT_CONFIG_PREFERRED; - } - free(s); + params.format = b->format; - weston_config_section_get_int(section, "scale", &scale, 1); - weston_config_section_get_string(section, "transform", &s, "normal"); - transform = parse_transform(s, output->base.name); - free(s); + b->get_output_parameters(output->base.name, ¶ms); + output->format = params.format; - if (get_gbm_format_from_section(section, - b->format, - &output->format) == -1) - output->format = b->format; - - weston_config_section_get_string(section, "seat", &s, ""); - setup_output_seat_constraint(b, &output->base, s); - free(s); + setup_output_seat_constraint(b, &output->base, params.seat); + free(params.seat); output->crtc_id = resources->crtcs[i]; output->pipe = i; @@ -2043,7 +1935,7 @@ create_output_for_connector(struct drm_backend *b, goto err_free; } - if (config == OUTPUT_CONFIG_OFF) { + if (params.mode.config == OUTPUT_CONFIG_OFF) { weston_log("Disabling output %s\n", output->base.name); drmModeSetCrtc(b->drm.fd, output->crtc_id, 0, 0, 0, 0, 0, NULL); @@ -2056,9 +1948,9 @@ create_output_for_connector(struct drm_backend *b, best = NULL; wl_list_for_each_reverse(drm_mode, &output->base.mode_list, base.link) { - if (config == OUTPUT_CONFIG_MODE && - width == drm_mode->base.width && - height == drm_mode->base.height) + if (params.mode.config == OUTPUT_CONFIG_MODE && + params.mode.width == drm_mode->base.width && + params.mode.height == drm_mode->base.height) configured = drm_mode; if (!memcmp(&crtc_mode, &drm_mode->mode_info, sizeof crtc_mode)) current = drm_mode; @@ -2067,8 +1959,8 @@ create_output_for_connector(struct drm_backend *b, best = drm_mode; } - if (config == OUTPUT_CONFIG_MODELINE) { - configured = drm_output_add_mode(output, &modeline); + if (params.mode.config == OUTPUT_CONFIG_MODELINE) { + configured = drm_output_add_mode(output, ¶ms.mode.modeline); if (!configured) goto err_free; } @@ -2079,7 +1971,7 @@ create_output_for_connector(struct drm_backend *b, goto err_free; } - if (config == OUTPUT_CONFIG_CURRENT) + if (params.mode.config == OUTPUT_CONFIG_CURRENT) configured = current; if (option_current_mode && current) @@ -2102,7 +1994,7 @@ create_output_for_connector(struct drm_backend *b, weston_output_init(&output->base, b->compositor, x, y, connector->mmWidth, connector->mmHeight, - transform, scale); + params.transform, params.scale); if (b->use_pixman) { if (drm_output_init_pixman(output, b) < 0) { @@ -2762,12 +2654,9 @@ renderer_switch_binding(struct weston_seat *seat, uint32_t time, uint32_t key, static struct drm_backend * drm_backend_create(struct weston_compositor *compositor, - struct drm_parameters *param, - int *argc, char *argv[], - struct weston_config *config) + struct drm_parameters *param) { struct drm_backend *b; - struct weston_config_section *section; struct udev_device *drm_device; struct wl_event_loop *loop; const char *path; @@ -2783,20 +2672,9 @@ drm_backend_create(struct weston_compositor *compositor, * functionality for now. */ b->sprites_are_broken = 1; b->compositor = compositor; - - section = weston_config_get_section(config, "core", NULL, NULL); - if (get_gbm_format_from_section(section, - GBM_FORMAT_XRGB8888, - &b->format) == -1) - goto err_base; - b->use_pixman = param->use_pixman; - - if (weston_compositor_init(compositor, argc, argv, - config) < 0) { - weston_log("%s failed\n", __func__); - goto err_base; - } + b->get_output_parameters = param->get_output_parameters; + b->format = param->format; /* Check if we run drm-backend using weston-launch */ compositor->launcher = weston_launcher_connect(compositor, param->tty, @@ -2928,17 +2806,153 @@ err_udev: udev_unref(b->udev); err_compositor: weston_compositor_shutdown(compositor); -err_base: + free(b); return NULL; } +static int +parse_modeline(const char *s, drmModeModeInfo *mode) +{ + char hsync[16]; + char vsync[16]; + float fclock; + + mode->type = DRM_MODE_TYPE_USERDEF; + mode->hskew = 0; + mode->vscan = 0; + mode->vrefresh = 0; + mode->flags = 0; + + if (sscanf(s, "%f %hd %hd %hd %hd %hd %hd %hd %hd %15s %15s", + &fclock, + &mode->hdisplay, + &mode->hsync_start, + &mode->hsync_end, + &mode->htotal, + &mode->vdisplay, + &mode->vsync_start, + &mode->vsync_end, + &mode->vtotal, hsync, vsync) != 11) + return -1; + + mode->clock = fclock * 1000; + if (strcmp(hsync, "+hsync") == 0) + mode->flags |= DRM_MODE_FLAG_PHSYNC; + else if (strcmp(hsync, "-hsync") == 0) + mode->flags |= DRM_MODE_FLAG_NHSYNC; + else + return -1; + + if (strcmp(vsync, "+vsync") == 0) + mode->flags |= DRM_MODE_FLAG_PVSYNC; + else if (strcmp(vsync, "-vsync") == 0) + mode->flags |= DRM_MODE_FLAG_NVSYNC; + else + return -1; + + return 0; +} + +static uint32_t +parse_transform(const char *transform, const char *output_name) +{ + static const struct { const char *name; uint32_t token; } names[] = { + { "normal", WL_OUTPUT_TRANSFORM_NORMAL }, + { "90", WL_OUTPUT_TRANSFORM_90 }, + { "180", WL_OUTPUT_TRANSFORM_180 }, + { "270", WL_OUTPUT_TRANSFORM_270 }, + { "flipped", WL_OUTPUT_TRANSFORM_FLIPPED }, + { "flipped-90", WL_OUTPUT_TRANSFORM_FLIPPED_90 }, + { "flipped-180", WL_OUTPUT_TRANSFORM_FLIPPED_180 }, + { "flipped-270", WL_OUTPUT_TRANSFORM_FLIPPED_270 }, + }; + unsigned int i; + + for (i = 0; i < ARRAY_LENGTH(names); i++) + if (strcmp(names[i].name, transform) == 0) + return names[i].token; + + weston_log("Invalid transform \"%s\" for output %s\n", + transform, output_name); + + return WL_OUTPUT_TRANSFORM_NORMAL; +} + +static int +parse_gbm_format(const char *s, uint32_t default_value, uint32_t *format) +{ + int ret = 0; + + if (s == NULL) + *format = default_value; + else if (strcmp(s, "xrgb8888") == 0) + *format = GBM_FORMAT_XRGB8888; + else if (strcmp(s, "rgb565") == 0) + *format = GBM_FORMAT_RGB565; + else if (strcmp(s, "xrgb2101010") == 0) + *format = GBM_FORMAT_XRGB2101010; + else { + weston_log("fatal: unrecognized pixel format: %s\n", s); + ret = -1; + } + + return ret; +} + +static struct weston_config *wconfig; + +static void +output_parameters(const char *name, struct drm_output_parameters *params) +{ + struct weston_config_section *section; + char *s; + + section = weston_config_get_section(wconfig, "output", "name", name); + weston_config_section_get_string(section, "mode", &s, "preferred"); + if (strcmp(s, "off") == 0) + params->mode.config = OUTPUT_CONFIG_OFF; + else if (strcmp(s, "preferred") == 0) + params->mode.config = OUTPUT_CONFIG_PREFERRED; + else if (strcmp(s, "current") == 0) + params->mode.config = OUTPUT_CONFIG_CURRENT; + else if (sscanf(s, "%dx%d", ¶ms->mode.width, + ¶ms->mode.height) == 2) + params->mode.config = OUTPUT_CONFIG_MODE; + else if (parse_modeline(s, ¶ms->mode.modeline) == 0) + params->mode.config = OUTPUT_CONFIG_MODELINE; + else { + weston_log("Invalid mode \"%s\" for output %s\n", + s, name); + params->mode.config = OUTPUT_CONFIG_PREFERRED; + } + free(s); + + weston_config_section_get_int(section, "scale", ¶ms->scale, 1); + weston_config_section_get_string(section, "transform", &s, "normal"); + params->transform = parse_transform(s, name); + free(s); + + weston_config_section_get_string(section, + "gbm-format", &s, NULL); + parse_gbm_format(s, params->format, ¶ms->format); + + free(s); + + weston_config_section_get_string(section, "seat", ¶ms->seat, ""); +} + WL_EXPORT int backend_init(struct weston_compositor *compositor, int *argc, char *argv[], struct weston_config *config) { struct drm_backend *b; struct drm_parameters param = { 0, }; + struct weston_config_section *section; + char *s; + int ret; + + wconfig = config; const struct weston_option drm_options[] = { { WESTON_OPTION_INTEGER, "connector", 0, ¶m.connector }, @@ -2949,10 +2963,19 @@ backend_init(struct weston_compositor *compositor, int *argc, char *argv[], }; param.seat_id = default_seat; + param.get_output_parameters = output_parameters; parse_options(drm_options, ARRAY_LENGTH(drm_options), argc, argv); - b = drm_backend_create(compositor, ¶m, argc, argv, config); + section = weston_config_get_section(config, "core", NULL, NULL); + weston_config_section_get_string(section, + "gbm-format", &s, NULL); + ret = parse_gbm_format(s, GBM_FORMAT_XRGB8888, ¶m.format); + free(s); + if (ret == -1) + return -1; + + b = drm_backend_create(compositor, ¶m); if (b == NULL) return -1; return 0; diff --git a/src/compositor-fbdev.c b/src/compositor-fbdev.c index 586c8a5..28cd55e 100644 --- a/src/compositor-fbdev.c +++ b/src/compositor-fbdev.c @@ -865,8 +865,7 @@ switch_vt_binding(struct weston_seat *seat, uint32_t time, uint32_t key, void *d } static struct fbdev_backend * -fbdev_backend_create(struct weston_compositor *compositor, int *argc, char *argv[], - struct weston_config *config, +fbdev_backend_create(struct weston_compositor *compositor, struct fbdev_parameters *param) { struct fbdev_backend *backend; @@ -880,10 +879,6 @@ fbdev_backend_create(struct weston_compositor *compositor, int *argc, char *argv return NULL; backend->compositor = compositor; - if (weston_compositor_init(compositor, argc, argv, - config) < 0) - goto out_free; - if (weston_compositor_set_presentation_clock_software( compositor) < 0) goto out_compositor; @@ -956,7 +951,6 @@ out_udev: out_compositor: weston_compositor_shutdown(compositor); -out_free: free(backend); return NULL; @@ -983,7 +977,7 @@ backend_init(struct weston_compositor *compositor, int *argc, char *argv[], parse_options(fbdev_options, ARRAY_LENGTH(fbdev_options), argc, argv); - b = fbdev_backend_create(compositor, argc, argv, config, ¶m); + b = fbdev_backend_create(compositor, ¶m); if (b == NULL) return -1; return 0; diff --git a/src/compositor-rdp.c b/src/compositor-rdp.c index 678c35e..191e0c3 100644 --- a/src/compositor-rdp.c +++ b/src/compositor-rdp.c @@ -1085,8 +1085,7 @@ rdp_incoming_peer(freerdp_listener *instance, freerdp_peer *client) static struct rdp_backend * rdp_backend_create(struct weston_compositor *compositor, - struct rdp_backend_config *config, - int *argc, char *argv[], struct weston_config *wconfig) + struct rdp_backend_config *config) { struct rdp_backend *b; char *fd_str; @@ -1097,9 +1096,6 @@ rdp_backend_create(struct weston_compositor *compositor, return NULL; b->compositor = compositor; - if (weston_compositor_init(compositor, argc, argv, wconfig) < 0) - goto err_free; - b->base.destroy = rdp_destroy; b->base.restore = rdp_restore; b->rdp_key = config->rdp_key ? strdup(config->rdp_key) : NULL; @@ -1196,7 +1192,7 @@ backend_init(struct weston_compositor *compositor, int *argc, char *argv[], }; parse_options(rdp_options, ARRAY_LENGTH(rdp_options), argc, argv); - b = rdp_backend_create(compositor, &config, argc, argv, wconfig); + b = rdp_backend_create(compositor, &config); if (b == NULL) return -1; return 0; diff --git a/src/compositor-wayland.c b/src/compositor-wayland.c index 66ce87b..56fdcdf 100644 --- a/src/compositor-wayland.c +++ b/src/compositor-wayland.c @@ -1881,25 +1881,16 @@ static const char *left_ptrs[] = { }; static void -create_cursor(struct wayland_backend *b, struct weston_config *config) +create_cursor(struct wayland_backend *b, const char *theme, int size) { - struct weston_config_section *s; - int size; - char *theme = NULL; unsigned int i; - s = weston_config_get_section(config, "shell", NULL, NULL); - weston_config_section_get_string(s, "cursor-theme", &theme, NULL); - weston_config_section_get_int(s, "cursor-size", &size, 32); - b->cursor_theme = wl_cursor_theme_load(theme, size, b->parent.shm); if (!b->cursor_theme) { fprintf(stderr, "could not load cursor theme\n"); return; } - free(theme); - b->cursor = NULL; for (i = 0; !b->cursor && i < ARRAY_LENGTH(left_ptrs); ++i) b->cursor = wl_cursor_theme_get_cursor(b->cursor_theme, @@ -1934,8 +1925,8 @@ fullscreen_binding(struct weston_seat *seat_base, uint32_t time, uint32_t key, static struct wayland_backend * wayland_backend_create(struct weston_compositor *compositor, int use_pixman, - const char *display_name, int *argc, char *argv[], - struct weston_config *config) + const char *display_name, + const char *cursor_theme, int cursor_size) { struct wayland_backend *b; struct wl_event_loop *loop; @@ -1946,10 +1937,6 @@ wayland_backend_create(struct weston_compositor *compositor, int use_pixman, return NULL; b->compositor = compositor; - if (weston_compositor_init(compositor, argc, argv, - config) < 0) - goto err_free; - if (weston_compositor_set_presentation_clock_software(compositor) < 0) goto err_compositor; @@ -1965,7 +1952,7 @@ wayland_backend_create(struct weston_compositor *compositor, int use_pixman, wl_registry_add_listener(b->parent.registry, ®istry_listener, b); wl_display_roundtrip(b->parent.wl_display); - create_cursor(b, config); + create_cursor(b, cursor_theme, cursor_size); b->use_pixman = use_pixman; @@ -2015,7 +2002,7 @@ err_display: wl_display_disconnect(b->parent.wl_display); err_compositor: weston_compositor_shutdown(compositor); -err_free: + free(b); return NULL; } @@ -2052,6 +2039,8 @@ backend_init(struct weston_compositor *compositor, int *argc, char *argv[], int x, count, width, height, scale, use_pixman, fullscreen, sprawl; const char *section_name, *display_name; char *name; + int size; + char *theme = NULL; const struct weston_option wayland_options[] = { { WESTON_OPTION_INTEGER, "width", 0, &width }, @@ -2075,8 +2064,13 @@ backend_init(struct weston_compositor *compositor, int *argc, char *argv[], parse_options(wayland_options, ARRAY_LENGTH(wayland_options), argc, argv); + section = weston_config_get_section(config, "shell", NULL, NULL); + weston_config_section_get_string(section, "cursor-theme", &theme, NULL); + weston_config_section_get_int(section, "cursor-size", &size, 32); + b = wayland_backend_create(compositor, use_pixman, display_name, - argc, argv, config); + theme, size); + free(theme); if (!b) return -1; diff --git a/src/compositor-x11.c b/src/compositor-x11.c index 87f9fa1..f8e061f 100644 --- a/src/compositor-x11.c +++ b/src/compositor-x11.c @@ -1474,19 +1474,10 @@ static struct x11_backend * x11_backend_create(struct weston_compositor *compositor, int fullscreen, int no_input, - int use_pixman, - int *argc, char *argv[], - struct weston_config *config) + int use_pixman) { struct x11_backend *b; - struct x11_output *output; - struct weston_config_section *section; xcb_screen_iterator_t s; - int i, x = 0, output_count = 0; - int width, height, scale, count; - const char *section_name; - char *name, *t, *mode; - uint32_t transform; weston_log("initializing x11 backend\n"); @@ -1495,9 +1486,6 @@ x11_backend_create(struct weston_compositor *compositor, return NULL; b->compositor = compositor; - if (weston_compositor_init(compositor, argc, argv, config) < 0) - goto err_free; - if (weston_compositor_set_presentation_clock_software(compositor) < 0) goto err_free; @@ -1540,6 +1528,60 @@ x11_backend_create(struct weston_compositor *compositor, if (x11_input_create(b, no_input) < 0) goto err_renderer; + b->xcb_source = + wl_event_loop_add_fd(compositor->input_loop, + xcb_get_file_descriptor(b->conn), + WL_EVENT_READABLE, + x11_backend_handle_event, b); + wl_event_source_check(b->xcb_source); + + compositor->backend = &b->base; + return b; + +err_renderer: + compositor->renderer->destroy(compositor); +err_xdisplay: + XCloseDisplay(b->dpy); +err_free: + free(b); + return NULL; +} + +WL_EXPORT int +backend_init(struct weston_compositor *compositor, int *argc, char *argv[], + struct weston_config *config) +{ + struct x11_backend *b; + int fullscreen = 0; + int no_input = 0; + int use_pixman = 0; + struct weston_config_section *section; + int width, height, scale, count; + const char *section_name; + int i, x = 0, output_count = 0; + char *name, *t, *mode; + uint32_t transform; + struct x11_output *output; + + const struct weston_option x11_options[] = { + { WESTON_OPTION_INTEGER, "width", 0, &option_width }, + { WESTON_OPTION_INTEGER, "height", 0, &option_height }, + { WESTON_OPTION_INTEGER, "scale", 0, &option_scale }, + { WESTON_OPTION_BOOLEAN, "fullscreen", 'f', &fullscreen }, + { WESTON_OPTION_INTEGER, "output-count", 0, &option_count }, + { WESTON_OPTION_BOOLEAN, "no-input", 0, &no_input }, + { WESTON_OPTION_BOOLEAN, "use-pixman", 0, &use_pixman }, + }; + + parse_options(x11_options, ARRAY_LENGTH(x11_options), argc, argv); + + b = x11_backend_create(compositor, + fullscreen, + no_input, + use_pixman); + if (b == NULL) + return -1; + width = option_width ? option_width : 1024; height = option_height ? option_height : 640; scale = option_scale ? option_scale : 1; @@ -1604,54 +1646,9 @@ x11_backend_create(struct weston_compositor *compositor, x = pixman_region32_extents(&output->base.region)->x2; } - b->xcb_source = - wl_event_loop_add_fd(compositor->input_loop, - xcb_get_file_descriptor(b->conn), - WL_EVENT_READABLE, - x11_backend_handle_event, b); - wl_event_source_check(b->xcb_source); - - compositor->backend = &b->base; - return b; + return 0; err_x11_input: x11_input_destroy(b); -err_renderer: - compositor->renderer->destroy(compositor); -err_xdisplay: - XCloseDisplay(b->dpy); -err_free: - free(b); - return NULL; -} - -WL_EXPORT int -backend_init(struct weston_compositor *compositor, int *argc, char *argv[], - struct weston_config *config) -{ - struct x11_backend *b; - int fullscreen = 0; - int no_input = 0; - int use_pixman = 0; - - const struct weston_option x11_options[] = { - { WESTON_OPTION_INTEGER, "width", 0, &option_width }, - { WESTON_OPTION_INTEGER, "height", 0, &option_height }, - { WESTON_OPTION_INTEGER, "scale", 0, &option_scale }, - { WESTON_OPTION_BOOLEAN, "fullscreen", 'f', &fullscreen }, - { WESTON_OPTION_INTEGER, "output-count", 0, &option_count }, - { WESTON_OPTION_BOOLEAN, "no-input", 0, &no_input }, - { WESTON_OPTION_BOOLEAN, "use-pixman", 0, &use_pixman }, - }; - - parse_options(x11_options, ARRAY_LENGTH(x11_options), argc, argv); - - b = x11_backend_create(compositor, - fullscreen, - no_input, - use_pixman, - argc, argv, config); - if (b == NULL) - return -1; - return 0; + return -1; } diff --git a/src/compositor.c b/src/compositor.c index 222af4f..6a94565 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -4017,7 +4017,6 @@ weston_environment_get_fd(const char *env) WL_EXPORT int weston_compositor_init(struct weston_compositor *ec, - int *argc, char *argv[], struct weston_config *config) { struct wl_event_loop *loop; @@ -4728,6 +4727,11 @@ int main(int argc, char *argv[]) } ec->wl_display = display; + if (weston_compositor_init(ec, config) < 0) { + ret = EXIT_FAILURE; + goto out_signals; + } + if (backend_init(ec, &argc, argv, config) < 0) { weston_log("fatal: failed to create compositor backend\n"); ret = EXIT_FAILURE; diff --git a/src/compositor.h b/src/compositor.h index 3961789..dd11124 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -1256,7 +1256,7 @@ weston_compositor_get_time(void); int weston_compositor_init(struct weston_compositor *ec, - int *argc, char *argv[], struct weston_config *config); + struct weston_config *config); 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