compositor-wayland: Move config parsing into backend_init

This cleans up the configuration and command parsing and separates it from
compositor/output initialization.

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
diff --git a/src/compositor-wayland.c b/src/compositor-wayland.c
index 181d6bb..5d86ca2 100644
--- a/src/compositor-wayland.c
+++ b/src/compositor-wayland.c
@@ -44,13 +44,6 @@
 
 #define WINDOW_TITLE "Weston Compositor"
 
-struct wayland_backend_options {
-	int width, height;
-	char *display_name;
-	int use_pixman;
-	int count;
-};
-
 struct wayland_compositor {
 	struct weston_compositor base;
 
@@ -712,8 +705,8 @@
 
 static struct wayland_output *
 wayland_output_create_for_config(struct wayland_compositor *c,
-				 struct wayland_backend_options *options,
 				 struct weston_config_section *config_section,
+				 int option_width, int option_height,
 				 int32_t x, int32_t y)
 {
 	struct wayland_output *output;
@@ -756,10 +749,10 @@
 	}
 	free(mode);
 
-	if (options->width)
-		width = options->width;
-	if (options->height)
-		height = options->height;
+	if (option_width)
+		width = option_width;
+	if (option_height)
+		height = option_height;
 
 	weston_config_section_get_int(config_section, "scale", &scale, 1);
 
@@ -1295,20 +1288,14 @@
 	}
 }
 
-static struct weston_compositor *
-wayland_compositor_create(struct wl_display *display,
-			  struct wayland_backend_options *options,
-			  int *argc, char *argv[],
+static struct wayland_compositor *
+wayland_compositor_create(struct wl_display *display, int use_pixman,
+			  const char *display_name, int *argc, char *argv[],
 			  struct weston_config *config)
 {
 	struct wayland_compositor *c;
-	struct wayland_output *wo;
 	struct wl_event_loop *loop;
-	struct weston_config_section *section;
-	struct weston_output *output;
-	char *name;
-	const char *section_name;
-	int fd, x, count, width, height;
+	int fd;
 
 	c = zalloc(sizeof *c);
 	if (c == NULL)
@@ -1318,7 +1305,7 @@
 				   config) < 0)
 		goto err_free;
 
-	c->parent.wl_display = wl_display_connect(options->display_name);
+	c->parent.wl_display = wl_display_connect(display_name);
 
 	if (c->parent.wl_display == NULL) {
 		weston_log("failed to create display: %m\n");
@@ -1334,7 +1321,7 @@
 
 	c->base.wl_display = display;
 
-	c->use_pixman = options->use_pixman;
+	c->use_pixman = use_pixman;
 
 	if (!c->use_pixman) {
 		gl_renderer = weston_load_module("gl-renderer.so",
@@ -1363,9 +1350,85 @@
 	c->base.destroy = wayland_destroy;
 	c->base.restore = wayland_restore;
 
+	loop = wl_display_get_event_loop(c->base.wl_display);
+
+	fd = wl_display_get_fd(c->parent.wl_display);
+	c->parent.wl_source =
+		wl_event_loop_add_fd(loop, fd, WL_EVENT_READABLE,
+				     wayland_compositor_handle_event, c);
+	if (c->parent.wl_source == NULL)
+		goto err_renderer;
+
+	wl_event_source_check(c->parent.wl_source);
+
+	return c;
+err_renderer:
+	c->base.renderer->destroy(&c->base);
+err_display:
+	wl_display_disconnect(c->parent.wl_display);
+err_compositor:
+	weston_compositor_shutdown(&c->base);
+err_free:
+	free(c);
+	return NULL;
+}
+
+static void
+wayland_compositor_destroy(struct wayland_compositor *c)
+{
+	struct weston_output *output;
+
+	wl_list_for_each(output, &c->base.output_list, link)
+		wayland_output_destroy(output);
+
+	c->base.renderer->destroy(&c->base);
+	wl_display_disconnect(c->parent.wl_display);
+
+	if (c->theme)
+		theme_destroy(c->theme);
+	if (c->frame_device)
+		cairo_device_destroy(c->frame_device);
+	wl_cursor_theme_destroy(c->cursor_theme);
+
+	weston_compositor_shutdown(&c->base);
+	free(c);
+}
+
+WL_EXPORT struct weston_compositor *
+backend_init(struct wl_display *display, int *argc, char *argv[],
+	     struct weston_config *config)
+{
+	struct wayland_compositor *c;
+	struct wayland_output *output;
+	struct weston_config_section *section;
+	int x, count, width, height, use_pixman;
+	const char *section_name, *display_name;
+	char *name;
+
+	const struct weston_option wayland_options[] = {
+		{ WESTON_OPTION_INTEGER, "width", 0, &width },
+		{ WESTON_OPTION_INTEGER, "height", 0, &height },
+		{ WESTON_OPTION_STRING, "display", 0, &display_name },
+		{ WESTON_OPTION_BOOLEAN, "use-pixman", 0, &use_pixman },
+		{ WESTON_OPTION_INTEGER, "output-count", 0, &count },
+	};
+
+	width = 0;
+	height = 0;
+	display_name = NULL;
+	use_pixman = 0;
+	count = 1;
+
+	parse_options(wayland_options,
+		      ARRAY_LENGTH(wayland_options), argc, argv);
+
+	c = wayland_compositor_create(display, use_pixman, display_name,
+				      argc, argv, config);
+	if (!c)
+		return NULL;
+
 	section = NULL;
 	x = 0;
-	count = 0;
 	while (weston_config_next_section(config, &section, &section_name)) {
 		if (!section_name || strcmp(section_name, "output") != 0)
 			continue;
@@ -1379,70 +1442,31 @@
 		}
 		free(name);
 
-		wo = wayland_output_create_for_config(c, options, section, x, 0);
-		if (!wo)
+		output = wayland_output_create_for_config(c, section, width,
+							  height, x, 0);
+		if (!output)
 			goto err_outputs;
-		x += wo->base.width;
-		++count;
+
+		x += output->base.width;
+		--count;
 	}
 
-
-	width = options->width > 0 ? options->width : 1024;
-	height = options->height > 0 ? options->height : 640;
-	while (count < options->count) {
-		if (!wayland_output_create(c, x, 0, width, height,
-					   WINDOW_TITLE, 0, 1))
+	if (!width)
+		width = 1024;
+	if (!height)
+		height = 640;
+	while (count > 0) {
+		output = wayland_output_create(c, x, 0, width, height, NULL, 0, 1);
+		if (!output)
 			goto err_outputs;
+
 		x += width;
-		++count;
+		--count;
 	}
 
-	loop = wl_display_get_event_loop(c->base.wl_display);
-
-	fd = wl_display_get_fd(c->parent.wl_display);
-	c->parent.wl_source =
-		wl_event_loop_add_fd(loop, fd, WL_EVENT_READABLE,
-				     wayland_compositor_handle_event, c);
-	if (c->parent.wl_source == NULL)
-		goto err_outputs;
-
-	wl_event_source_check(c->parent.wl_source);
-
 	return &c->base;
+
 err_outputs:
-	wl_list_for_each(output, &c->base.output_list, link)
-		wayland_output_destroy(output);
-
-	c->base.renderer->destroy(&c->base);
-err_display:
-	wl_display_disconnect(c->parent.wl_display);
-err_compositor:
-	weston_compositor_shutdown(&c->base);
-err_free:
-	free(c);
+	wayland_compositor_destroy(c);
 	return NULL;
 }
-
-WL_EXPORT struct weston_compositor *
-backend_init(struct wl_display *display, int *argc, char *argv[],
-	     struct weston_config *config)
-{
-	struct wayland_backend_options options;
-	memset(&options, 0, sizeof options);
-
-	const struct weston_option wayland_options[] = {
-		{ WESTON_OPTION_INTEGER, "width", 0, &options.width },
-		{ WESTON_OPTION_INTEGER, "height", 0, &options.height },
-		{ WESTON_OPTION_STRING, "display", 0, &options.display_name },
-		{ WESTON_OPTION_BOOLEAN, "use-pixman", 0, &options.use_pixman },
-		{ WESTON_OPTION_INTEGER, "output-count", 0, &options.count },
-	};
-
-	options.count = 1;
-
-	parse_options(wayland_options,
-		      ARRAY_LENGTH(wayland_options), argc, argv);
-
-	return wayland_compositor_create(display, &options,
-					 argc, argv, config);
-}