Use a "well" defined structure to configure x11-backend and move configuration file parsing inside the weston's compositor code. --- Makefile.am | 1 + src/compositor-x11.c | 160 ++++++++++++++++++------------------------------- src/compositor-x11.h | 61 +++++++++++++++++++ src/compositor.h | 1 + src/main.c | 164 ++++++++++++++++++++++++++++++++++++++++++++++++++- 5 files changed, 283 insertions(+), 104 deletions(-) create mode 100644 src/compositor-x11.h
diff --git a/Makefile.am b/Makefile.am index 623621d..7acef6a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -72,6 +72,7 @@ weston_SOURCES = \ src/log.c \ src/compositor.c \ src/compositor.h \ + src/compositor-x11.h \ src/input.c \ src/data-device.c \ src/screenshooter.c \ diff --git a/src/compositor-x11.c b/src/compositor-x11.c index 13a5d73..3966faf 100644 --- a/src/compositor-x11.c +++ b/src/compositor-x11.c @@ -50,6 +50,7 @@ #include <xkbcommon/xkbcommon.h> #include "compositor.h" +#include "compositor-x11.h" #include "gl-renderer.h" #include "pixman-renderer.h" #include "shared/config-parser.h" @@ -60,11 +61,6 @@ #define DEFAULT_AXIS_STEP_DISTANCE wl_fixed_from_int(10) -static int option_width; -static int option_height; -static int option_scale; -static int option_count; - struct x11_backend { struct weston_backend base; struct weston_compositor *compositor; @@ -105,6 +101,7 @@ struct x11_backend { xcb_atom_t cardinal; xcb_atom_t xkb_names; } atom; + }; struct x11_output { @@ -130,6 +127,25 @@ struct window_delete_data { struct gl_renderer_interface *gl_renderer; +static void +weston_x11_backend_config_outputs_clear( + struct weston_x11_backend_config * ths) { + struct weston_x11_backend_output_config * pos; + struct weston_x11_backend_output_config * tmp; + wl_list_for_each_safe(pos, tmp, &ths->outputs, link) { + wl_list_remove(&pos->link); + free(pos->name); + free(pos); + } +} + +static void +weston_x11_backend_config_destroy( + struct weston_x11_backend_config * ths) { + weston_x11_backend_config_outputs_clear(ths); + free(ths); +} + static xcb_screen_t * x11_compositor_get_default_screen(struct x11_backend *b) { @@ -1548,6 +1564,7 @@ x11_destroy(struct weston_compositor *ec) weston_compositor_shutdown(ec); /* destroys outputs, too */ XCloseDisplay(backend->dpy); + free(backend); } @@ -1568,20 +1585,11 @@ init_gl_renderer(struct x11_backend *b) } 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) + struct weston_x11_backend_config *config) { struct x11_backend *b; struct x11_output *output; - struct weston_config_section *section; - int i, x = 0, output_count = 0; - int width, height, scale, count; - const char *section_name; - char *name, *t, *mode; - uint32_t transform; + int x = 0; weston_log("initializing x11 backend\n"); @@ -1609,13 +1617,13 @@ x11_backend_create(struct weston_compositor *compositor, x11_backend_get_resources(b); x11_backend_get_wm_info(b); - if (!b->has_net_wm_state_fullscreen && fullscreen) { + if (!b->has_net_wm_state_fullscreen && config->fullscreen) { weston_log("Can not fullscreen without window manager support" "(need _NET_WM_STATE_FULLSCREEN)\n"); - fullscreen = 0; + config->fullscreen = 0; } - b->use_pixman = use_pixman; + b->use_pixman = config->use_pixman; if (b->use_pixman) { if (pixman_renderer_init(compositor) < 0) { weston_log("Failed to initialize pixman renderer for X11 backend\n"); @@ -1625,84 +1633,53 @@ x11_backend_create(struct weston_compositor *compositor, else if (init_gl_renderer(b) < 0) { goto err_xdisplay; } - weston_log("Using %s renderer\n", use_pixman ? "pixman" : "gl"); + weston_log("Using %s renderer\n", config->use_pixman ? "pixman" : "gl"); b->base.destroy = x11_destroy; b->base.restore = x11_restore; - if (x11_input_create(b, no_input) < 0) { + if (x11_input_create(b, config->no_input) < 0) { weston_log("Failed to create X11 input\n"); goto err_renderer; } - width = option_width ? option_width : 1024; - height = option_height ? option_height : 640; - scale = option_scale ? option_scale : 1; - count = option_count ? option_count : 1; + struct weston_x11_backend_output_config * output_iterator; + wl_list_for_each(output_iterator, &config->outputs, link) { - section = NULL; - while (weston_config_next_section(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') { - free(name); + if (output_iterator->name == NULL) { 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); - if (option_scale) - scale = option_scale; - - weston_config_section_get_string(section, - "transform", &t, "normal"); - if (weston_parse_transform(t, &transform) < 0) - weston_log("Invalid transform \"%s\" for output %s\n", - t, name); - free(t); - - output = x11_backend_create_output(b, x, 0, - width, height, - fullscreen, no_input, - name, transform, scale); - free(name); - if (output == NULL) { - weston_log("Failed to create configured x11 output\n"); - goto err_x11_input; + if(output_iterator->width < 1) { + weston_log("Invalid width \"%d\" for output %s\n", + output_iterator->width, output_iterator->name); + output_iterator->width = 1024; } - x = pixman_region32_extents(&output->base.region)->x2; + if(output_iterator->height < 1) { + weston_log("Invalid height \"%d\" for output %s\n", + output_iterator->height, output_iterator->name); + output_iterator->height = 600; + } - output_count++; - if (option_count && output_count >= option_count) - break; - } + output = x11_backend_create_output(b, + x, + 0, + output_iterator->width, + output_iterator->height, + config->fullscreen, + config->no_input, + output_iterator->name, + output_iterator->transform, + output_iterator->scale); - for (i = output_count; i < count; i++) { - output = x11_backend_create_output(b, x, 0, width, height, - fullscreen, no_input, NULL, - WL_OUTPUT_TRANSFORM_NORMAL, scale); if (output == NULL) { - weston_log("Failed to create x11 output #%d\n", i); + weston_log("Failed to create configured x11 output\n"); goto err_x11_input; } + x = pixman_region32_extents(&output->base.region)->x2; + } b->xcb_source = @@ -1719,6 +1696,7 @@ x11_backend_create(struct weston_compositor *compositor, } compositor->backend = &b->base; + weston_x11_backend_config_destroy(config); return b; @@ -1730,36 +1708,16 @@ err_xdisplay: XCloseDisplay(b->dpy); err_free: free(b); + weston_x11_backend_config_destroy(config); return NULL; } WL_EXPORT int -backend_init(struct weston_compositor *compositor, int *argc, char *argv[], - struct weston_config *config, - struct weston_backend_config *config_base) +x11_backend_init(struct weston_compositor *compositor, + struct weston_x11_backend_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); + b = x11_backend_create(compositor, config); if (b == NULL) return -1; return 0; diff --git a/src/compositor-x11.h b/src/compositor-x11.h new file mode 100644 index 0000000..2283a10 --- /dev/null +++ b/src/compositor-x11.h @@ -0,0 +1,61 @@ +/* + * Copyright © 2016 Benoit Gschwind + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#ifndef SRC_COMPOSITOR_X11_H_ +#define SRC_COMPOSITOR_X11_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "compositor.h" + +struct weston_x11_backend_output_config { + struct wl_list link; /* link defined output from config file */ + int width, height; + char *name; + uint32_t transform; + int32_t scale; +}; + +struct weston_x11_backend_config { + bool fullscreen; + bool no_input; + bool use_pixman; + struct wl_list outputs; +}; + +typedef int (*x11_backend_init_func)( + struct weston_compositor *c, + struct weston_x11_backend_config *config); + +WL_EXPORT int +x11_backend_init(struct weston_compositor *compositor, + struct weston_x11_backend_config *config); + +#ifdef __cplusplus +} +#endif + +#endif /* SRC_COMPOSITOR_X11_H_ */ diff --git a/src/compositor.h b/src/compositor.h index 58ae94b..8abec40 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -1666,6 +1666,7 @@ backend_init(struct weston_compositor *c, int *argc, char *argv[], struct weston_config *config, struct weston_backend_config *config_base); + int module_init(struct weston_compositor *compositor, int *argc, char *argv[]); diff --git a/src/main.c b/src/main.c index 1850fa6..5ddad09 100644 --- a/src/main.c +++ b/src/main.c @@ -42,6 +42,7 @@ #endif #include "compositor.h" +#include "compositor-x11.h" #include "../shared/os-compatibility.h" #include "../shared/helpers.h" #include "git-version.h" @@ -653,17 +654,174 @@ load_backend_old(struct weston_compositor *compositor, const char *backend, return backend_init(compositor, argc, argv, wc, NULL); } +/** Create a new default drm backend configuration */ +static struct weston_x11_backend_config * +weston_x11_backend_config_create(void) { + struct weston_x11_backend_config * ret = + (__typeof__(ret))zalloc(sizeof *ret); + + wl_list_init(&ret->outputs); + return ret; + +} + +static void +weston_x11_backend_config_add_output( + struct weston_x11_backend_config * ths, + int width, int height, + char const *name, uint32_t transform, int32_t scale) { + + struct weston_x11_backend_output_config * output = + (__typeof__(output))malloc(sizeof *output); + + wl_list_init(&output->link); + output->width = width; + output->height = height; + output->name = strdup(name); + output->transform = transform; + output->scale = scale; + + wl_list_insert(ths->outputs.prev, &output->link); + +} + +static int +weston_x11_backend_load( + struct weston_compositor *compositor, + struct weston_x11_backend_config *config) { + + x11_backend_init_func backend_init; + + backend_init = weston_load_module("x11-backend.so", "x11_backend_init"); + if (!backend_init) + return -1; + + return backend_init(compositor, config); +} + + +static int +load_x11_backend(struct weston_compositor *c, char const * backend, + int *argc, char **argv, struct weston_config *wc) +{ + struct weston_x11_backend_config *config; + struct weston_config_section *section; + int ret = 0; + + config = weston_x11_backend_config_create(); + if (!config) + return -1; + + + int option_width = 0; + int option_height = 0; + int option_scale = 0; + int option_count = 0; + + config->fullscreen = 0; + config->no_input = 0; + config->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', &config->fullscreen }, + { WESTON_OPTION_INTEGER, "output-count", 0, &option_count }, + { WESTON_OPTION_BOOLEAN, "no-input", 0, &config->no_input }, + { WESTON_OPTION_BOOLEAN, "use-pixman", 0, &config->use_pixman }, + }; + + parse_options(x11_options, ARRAY_LENGTH(x11_options), argc, argv); + + int output_count = 0; + char const *section_name; + char *name; + section = NULL; + while (weston_config_next_section(wc, §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') { + free(name); + continue; + } + + char *t; + char *mode; + int width; + int height; + int32_t scale; + uint32_t transform; + 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 (width < 1) + width = 1024; + if (height < 1) + height = 600; + + weston_config_section_get_int(section, "scale", &scale, 1); + if (option_scale) + scale = option_scale; + + weston_config_section_get_string(section, + "transform", &t, "normal"); + if (weston_parse_transform(t, &transform) < 0) + weston_log("Invalid transform \"%s\" for output %s\n", + t, name); + free(t); + + weston_x11_backend_config_add_output(config, + width, height, + name, transform, scale); + free(name); + + output_count++; + if (option_count && output_count >= option_count) + break; + + } + + int width = option_width ? option_width : 1024; + int height = option_height ? option_height : 600; + int scale = option_scale ? option_scale : 1; + + int i; + for (i = output_count; i < option_count; i++) { + char name[16]; + snprintf(name, 16, "screen%d", i); + weston_x11_backend_config_add_output(config, width, height, + name, WL_OUTPUT_TRANSFORM_NORMAL, scale); + } + + /* load the actual drm backend and configure it */ + if (weston_x11_backend_load(c, config) < 0) { + ret = -1; + } + + return ret; +} + static int load_backend(struct weston_compositor *compositor, const char *backend, int *argc, char **argv, struct weston_config *config) { + if (strstr(backend, "x11-backend.so")) + return load_x11_backend(compositor, backend, argc, argv, config); #if 0 - if (strstr(backend, "drm-backend.so")) + else if (strstr(backend, "drm-backend.so")) return load_drm_backend(compositor, backend, argc, argv, config); else if (strstr(backend, "wayland-backend.so")) return load_wayland_backend(compositor, backend, argc, argv, config); - else if (strstr(backend, "x11-backend.so")) - return load_x11_backend(compositor, backend, argc, argv, config); else if (strstr(backend, "fbdev-backend.so")) return load_fbdev_backend(compositor, backend, argc, argv, config); else if (strstr(backend, "headless-backend.so")) -- 2.4.10 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/wayland-devel