From 8f6fcbfc2e83030cfa6fec38c7029a8c82f92dd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Sun, 26 May 2013 21:21:23 -0400 Subject: [PATCH] compositor-x11: Use new config file parser With the iterator API we can now convert the X11 backend. --- src/compositor-x11.c | 198 ++++++++++++++----------------------------- 1 file changed, 63 insertions(+), 135 deletions(-) diff --git a/src/compositor-x11.c b/src/compositor-x11.c index 9d106a94..be7b13ec 100644 --- a/src/compositor-x11.c +++ b/src/compositor-x11.c @@ -56,22 +56,9 @@ #define DEFAULT_AXIS_STEP_DISTANCE wl_fixed_from_int(10) -static char *output_name; -static char *output_mode; -static char *output_transform; -static char *output_scale; static int option_width; static int option_height; static int option_count; -static struct wl_list configured_output_list; - -struct x11_configured_output { - char *name; - int width, height; - uint32_t transform; - unsigned int scale; - struct wl_list link; -}; struct x11_compositor { struct weston_compositor base; @@ -1475,21 +1462,10 @@ x11_restore(struct weston_compositor *ec) { } -static void -x11_free_configured_output(struct x11_configured_output *output) -{ - free(output->name); - free(output); -} - static void x11_destroy(struct weston_compositor *ec) { struct x11_compositor *compositor = (struct x11_compositor *)ec; - struct x11_configured_output *o, *n; - - wl_list_for_each_safe(o, n, &configured_output_list, link) - x11_free_configured_output(o); wl_event_source_remove(compositor->xcb_source); x11_input_destroy(compositor); @@ -1502,6 +1478,31 @@ x11_destroy(struct weston_compositor *ec) free(ec); } +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 struct weston_compositor * x11_compositor_create(struct wl_display *display, int fullscreen, @@ -1510,11 +1511,14 @@ x11_compositor_create(struct wl_display *display, int *argc, char *argv[], int config_fd) { struct x11_compositor *c; - struct x11_configured_output *o; struct x11_output *output; + struct weston_config_section *section; xcb_screen_iterator_t s; int i, x = 0, output_count = 0; - int width, height, count; + int width, height, count, scale; + const char *section_name; + char *name, *t, *mode; + uint32_t transform; weston_log("initializing x11 backend\n"); @@ -1574,14 +1578,41 @@ x11_compositor_create(struct wl_display *display, height = option_height ? option_height : 640; count = option_count ? option_count : 1; - wl_list_for_each(o, &configured_output_list, link) { + section = NULL; + while (weston_config_next_section(c->base.config, + §ion, §ion_name)) { + if (strcmp(section_name, "output") != 0) + continue; + weston_config_section_get_string(section, "name", &name, NULL); + if (name == NULL || name[0] != 'X') + continue; + + weston_config_section_get_string(section, + "mode", &mode, "1024x600"); + if (sscanf(mode, "%dx%d", &width, &height) != 2) { + weston_log("Invalid mode \"%s\" for output %s\n", + mode, name); + width = 1024; + height = 600; + } + free(mode); + + if (option_width) + width = option_width; + if (option_height) + height = option_height; + + weston_config_section_get_int(section, "scale", &scale, 1); + weston_config_section_get_string(section, + "transform", &t, "normal"); + transform = parse_transform(t, name); + free(t); + output = x11_compositor_create_output(c, x, 0, - option_width ? width : - o->width, - option_height ? height : - o->height, + width, height, fullscreen, no_input, - o->name, o->transform, o->scale); + name, transform, scale); + free(name); if (output == NULL) goto err_x11_input; @@ -1621,92 +1652,6 @@ err_free: return NULL; } -static void -x11_output_set_transform(struct x11_configured_output *output) -{ - if (!output_transform) { - output->transform = WL_OUTPUT_TRANSFORM_NORMAL; - return; - } - - if (!strcmp(output_transform, "normal")) - output->transform = WL_OUTPUT_TRANSFORM_NORMAL; - else if (!strcmp(output_transform, "90")) - output->transform = WL_OUTPUT_TRANSFORM_90; - else if (!strcmp(output_transform, "180")) - output->transform = WL_OUTPUT_TRANSFORM_180; - else if (!strcmp(output_transform, "270")) - output->transform = WL_OUTPUT_TRANSFORM_270; - else if (!strcmp(output_transform, "flipped")) - output->transform = WL_OUTPUT_TRANSFORM_FLIPPED; - else if (!strcmp(output_transform, "flipped-90")) - output->transform = WL_OUTPUT_TRANSFORM_FLIPPED_90; - else if (!strcmp(output_transform, "flipped-180")) - output->transform = WL_OUTPUT_TRANSFORM_FLIPPED_180; - else if (!strcmp(output_transform, "flipped-270")) - output->transform = WL_OUTPUT_TRANSFORM_FLIPPED_270; - else { - weston_log("Invalid transform \"%s\" for output %s\n", - output_transform, output_name); - output->transform = WL_OUTPUT_TRANSFORM_NORMAL; - } -} - -static void -output_section_done(void *data) -{ - struct x11_configured_output *output; - - output = malloc(sizeof *output); - - if (!output || !output_name || (output_name[0] != 'X') || - (!output_mode && !output_transform && !output_scale)) { - if (output_name) - free(output_name); - output_name = NULL; - free(output); - goto err_free; - } - - output->name = output_name; - - if (output_mode) { - if (sscanf(output_mode, "%dx%d", &output->width, - &output->height) != 2) { - weston_log("Invalid mode \"%s\" for output %s\n", - output_mode, output_name); - x11_free_configured_output(output); - goto err_free; - } - } else { - output->width = 1024; - output->height = 640; - } - - output->scale = 1; - if (output_scale) { - if (sscanf(output_scale, "%d", &output->scale) != 1) { - weston_log("Invalid scale \"%s\" for output %s\n", - output_scale, output_name); - x11_free_configured_output(output); - goto err_free; - } - } - - x11_output_set_transform(output); - - wl_list_insert(configured_output_list.prev, &output->link); - -err_free: - if (output_mode) - free(output_mode); - if (output_transform) - free(output_transform); - output_mode = NULL; - output_transform = NULL; - output_scale = NULL; -} - WL_EXPORT struct weston_compositor * backend_init(struct wl_display *display, int *argc, char *argv[], int config_fd) @@ -1726,23 +1671,6 @@ backend_init(struct wl_display *display, int *argc, char *argv[], parse_options(x11_options, ARRAY_LENGTH(x11_options), argc, argv); - wl_list_init(&configured_output_list); - - const struct config_key x11_config_keys[] = { - { "name", CONFIG_KEY_STRING, &output_name }, - { "mode", CONFIG_KEY_STRING, &output_mode }, - { "transform", CONFIG_KEY_STRING, &output_transform }, - { "scale", CONFIG_KEY_STRING, &output_scale }, - }; - - const struct config_section config_section[] = { - { "output", x11_config_keys, - ARRAY_LENGTH(x11_config_keys), output_section_done }, - }; - - parse_config_file(config_fd, config_section, - ARRAY_LENGTH(config_section), NULL); - return x11_compositor_create(display, fullscreen, no_input,