summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--man/weston.man4
-rw-r--r--src/compositor.c78
-rw-r--r--tests/weston-test2
3 files changed, 46 insertions, 38 deletions
diff --git a/man/weston.man b/man/weston.man
index eff09c0a..7b7ae43d 100644
--- a/man/weston.man
+++ b/man/weston.man
@@ -100,8 +100,8 @@ Append log messages to the file
.I file.log
instead of writing them to stderr.
.TP
-\fB\-\-module\fR=\fImodule.so\fR
-Load a generic plugin module \fImodule.so\fR. Only used by the test
+\fB\-\-modules\fR=\fImodule1.so,module2.so\fR
+Load the comma-separated list of modules. Only used by the test
suite. The file is searched for in
.IR "__weston_modules_dir__" ,
or you can pass an absolute path.
diff --git a/src/compositor.c b/src/compositor.c
index 8e23e324..2afdd947 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -2871,6 +2871,13 @@ load_module(const char *name, const char *entrypoint)
else
snprintf(path, sizeof path, "%s", name);
+ module = dlopen(path, RTLD_NOW | RTLD_NOLOAD);
+ if (module) {
+ weston_log("Module '%s' already loaded\n", path);
+ dlclose(module);
+ return NULL;
+ }
+
weston_log("Loading module '%s'\n", path);
module = dlopen(path, RTLD_NOW);
if (!module) {
@@ -2887,6 +2894,32 @@ load_module(const char *name, const char *entrypoint)
return init;
}
+static int
+load_modules(struct weston_compositor *ec, const char *modules)
+{
+ const char *p, *end;
+ char buffer[256];
+ int (*module_init)(struct weston_compositor *ec);
+
+ if (modules == NULL)
+ return 0;
+
+ p = modules;
+ while (*p) {
+ end = strchrnul(p, ',');
+ snprintf(buffer, sizeof buffer, "%.*s", (int) (end - p), p);
+ module_init = load_module(buffer, "module_init");
+ if (module_init)
+ module_init(ec);
+ p = end;
+ while (*p == ',')
+ p++;
+
+ }
+
+ return 0;
+}
+
static const char xdg_error_message[] =
"fatal: environment variable XDG_RUNTIME_DIR is not set.\n";
@@ -2945,8 +2978,7 @@ usage(int error_code)
"\t\t\t\tx11-backend.so or wayland-backend.so\n"
" -S, --socket=NAME\tName of socket to listen on\n"
" -i, --idle-time=SECS\tIdle time in seconds\n"
- " --xserver\t\tEnable X server integration\n"
- " --module\t\tLoad the specified module\n"
+ " --modules\t\tLoad the comma-separated list of modules\n"
" --log==FILE\t\tLog to the given file\n"
" -h, --help\t\tThis help message\n\n");
@@ -2982,36 +3014,32 @@ int main(int argc, char *argv[])
struct wl_event_source *signals[4];
struct wl_event_loop *loop;
struct sigaction segv_action;
- int (*module_init)(struct weston_compositor *ec);
struct weston_compositor
*(*backend_init)(struct wl_display *display,
int argc, char *argv[], const char *config_file);
int i;
char *backend = NULL;
- char *shell = NULL;
- char *module = NULL;
+ const char *modules = "desktop-shell.so", *option_modules = NULL;
char *log = NULL;
int32_t idle_time = 300;
- int32_t xserver = 0;
int32_t help = 0;
char *socket_name = "wayland-0";
char *config_file;
- const struct config_key shell_config_keys[] = {
- { "type", CONFIG_KEY_STRING, &shell },
+ const struct config_key core_config_keys[] = {
+ { "modules", CONFIG_KEY_STRING, &modules },
};
const struct config_section cs[] = {
- { "shell",
- shell_config_keys, ARRAY_LENGTH(shell_config_keys) },
+ { "core",
+ core_config_keys, ARRAY_LENGTH(core_config_keys) },
};
const struct weston_option core_options[] = {
{ WESTON_OPTION_STRING, "backend", 'B', &backend },
{ WESTON_OPTION_STRING, "socket", 'S', &socket_name },
{ WESTON_OPTION_INTEGER, "idle-time", 'i', &idle_time },
- { WESTON_OPTION_BOOLEAN, "xserver", 0, &xserver },
- { WESTON_OPTION_STRING, "module", 0, &module },
+ { WESTON_OPTION_STRING, "modules", 0, &option_modules },
{ WESTON_OPTION_STRING, "log", 0, &log },
{ WESTON_OPTION_BOOLEAN, "help", 'h', &help },
};
@@ -3058,7 +3086,7 @@ int main(int argc, char *argv[])
}
config_file = config_file_path("weston.ini");
- parse_config_file(config_file, cs, ARRAY_LENGTH(cs), shell);
+ parse_config_file(config_file, cs, ARRAY_LENGTH(cs), NULL);
backend_init = load_module(backend, "backend_init");
if (!backend_init)
@@ -3090,30 +3118,10 @@ int main(int argc, char *argv[])
setenv("WAYLAND_DISPLAY", socket_name, 1);
- module_init = NULL;
- if (xserver)
- module_init = load_module("xwayland.so", "module_init");
- if (module_init && module_init(ec) < 0) {
- ret = EXIT_FAILURE;
+ if (load_modules(ec, modules) < 0)
goto out;
- }
-
- if (!shell)
- shell = "desktop-shell.so";
- module_init = load_module(shell, "module_init");
- if (!module_init || module_init(ec) < 0) {
- ret = EXIT_FAILURE;
+ if (load_modules(ec, option_modules) < 0)
goto out;
- }
-
-
- module_init = NULL;
- if (module)
- module_init = load_module(module, "module_init");
- if (module_init && module_init(ec) < 0) {
- ret = EXIT_FAILURE;
- goto out;
- }
if (wl_display_add_socket(display, socket_name)) {
weston_log("fatal: failed to add socket: %m\n");
diff --git a/tests/weston-test b/tests/weston-test
index 23145140..27b40de2 100644
--- a/tests/weston-test
+++ b/tests/weston-test
@@ -1,4 +1,4 @@
#!/bin/sh
-../src/weston --module=$abs_builddir/.libs/${1/.la/.so}
+../src/weston --modules=$abs_builddir/.libs/${1/.la/.so}