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, &params);
+       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, &params.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", &params->mode.width,
+                                   &params->mode.height) == 2)
+               params->mode.config = OUTPUT_CONFIG_MODE;
+       else if (parse_modeline(s, &params->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", &params->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, &params->format);
+
+       free(s);
+
+       weston_config_section_get_string(section, "seat", &params->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, &param.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, &param, 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, &param.format);
+       free(s);
+       if (ret == -1)
+               return -1;
+
+       b = drm_backend_create(compositor, &param);
        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, &param);
+       b = fbdev_backend_create(compositor, &param);
        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, &registry_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

Reply via email to