Pass argc and argv to modules
authorKristian Høgsberg <krh@bitplanet.net>
Wed, 20 Feb 2013 20:37:49 +0000 (15:37 -0500)
committerKristian Høgsberg <krh@bitplanet.net>
Wed, 20 Feb 2013 20:37:49 +0000 (15:37 -0500)
This lets modules parse options from the command line.

src/compositor.c
src/compositor.h
src/shell.c
src/tablet-shell.c
src/xwayland/launcher.c
tests/surface-global-test.c
tests/surface-test.c
tests/weston-test.c

index fb5cb2c..9198b3b 100644 (file)
@@ -3211,11 +3211,13 @@ load_module(const char *name, const char *entrypoint)
 }
 
 static int
-load_modules(struct weston_compositor *ec, const char *modules)
+load_modules(struct weston_compositor *ec, const char *modules,
+            int *argc, char *argv[], const char *config_file)
 {
        const char *p, *end;
        char buffer[256];
-       int (*module_init)(struct weston_compositor *ec);
+       int (*module_init)(struct weston_compositor *ec,
+                          int *argc, char *argv[], const char *config_file);
 
        if (modules == NULL)
                return 0;
@@ -3226,7 +3228,7 @@ load_modules(struct weston_compositor *ec, const char *modules)
                snprintf(buffer, sizeof buffer, "%.*s", (int) (end - p), p);
                module_init = load_module(buffer, "module_init");
                if (module_init)
-                       module_init(ec);
+                       module_init(ec, argc, argv, config_file);
                p = end;
                while (*p == ',')
                        p++;
@@ -3429,14 +3431,6 @@ int main(int argc, char *argv[])
        sigaction(SIGSEGV, &segv_action, NULL);
        segv_compositor = ec;
 
-
-       for (i = 1; i < argc; i++)
-               weston_log("fatal: unhandled option: %s\n", argv[i]);
-       if (argc > 1) {
-               ret = EXIT_FAILURE;
-               goto out;
-       }
-
        free(config_file);
 
        ec->option_idle_time = idle_time;
@@ -3444,11 +3438,18 @@ int main(int argc, char *argv[])
 
        setenv("WAYLAND_DISPLAY", socket_name, 1);
 
-       if (load_modules(ec, modules) < 0)
+       if (load_modules(ec, modules, &argc, argv, config_file) < 0)
                goto out;
-       if (load_modules(ec, option_modules) < 0)
+       if (load_modules(ec, option_modules, &argc, argv, config_file) < 0)
                goto out;
 
+       for (i = 1; i < argc; i++)
+               weston_log("fatal: unhandled option: %s\n", argv[i]);
+       if (argc > 1) {
+               ret = EXIT_FAILURE;
+               goto out;
+       }
+
        if (wl_display_add_socket(display, socket_name)) {
                weston_log("fatal: failed to add socket: %m\n");
                ret = EXIT_FAILURE;
index 11afbb9..a45fdf6 100644 (file)
@@ -843,7 +843,8 @@ backend_init(struct wl_display *display, int *argc, char *argv[],
             const char *config_file);
 
 int
-module_init(struct weston_compositor *compositor);
+module_init(struct weston_compositor *compositor,
+           int *argc, char *argv[], const char *config_file);
 
 void
 weston_transformed_coord(int width, int height,
index af802a5..a4511fd 100644 (file)
@@ -345,9 +345,8 @@ get_animation_type(char *animation)
 }
 
 static void
-shell_configuration(struct desktop_shell *shell)
+shell_configuration(struct desktop_shell *shell, const char *config_file)
 {
-       char *config_file;
        char *path = NULL;
        int duration = 60;
        unsigned int num_workspaces = DEFAULT_NUM_WORKSPACES;
@@ -371,9 +370,7 @@ shell_configuration(struct desktop_shell *shell)
                { "screensaver", saver_keys, ARRAY_LENGTH(saver_keys), NULL },
        };
 
-       config_file = config_file_path("weston.ini");
        parse_config_file(config_file, cs, ARRAY_LENGTH(cs), shell);
-       free(config_file);
 
        shell->screensaver.path = path;
        shell->screensaver.duration = duration;
@@ -3957,7 +3954,8 @@ shell_add_bindings(struct weston_compositor *ec, struct desktop_shell *shell)
 }
 
 WL_EXPORT int
-module_init(struct weston_compositor *ec)
+module_init(struct weston_compositor *ec,
+           int *argc, char *argv[], const char *config_file)
 {
        struct weston_seat *seat;
        struct desktop_shell *shell;
@@ -4002,7 +4000,7 @@ module_init(struct weston_compositor *ec)
        wl_array_init(&shell->workspaces.array);
        wl_list_init(&shell->workspaces.client_list);
 
-       shell_configuration(shell);
+       shell_configuration(shell, config_file);
 
        for (i = 0; i < shell->workspaces.num; i++) {
                pws = wl_array_add(&shell->workspaces.array, sizeof *pws);
index 9e88e27..57226e8 100644 (file)
@@ -531,7 +531,8 @@ tablet_shell_destroy(struct wl_listener *listener, void *data)
 }
 
 WL_EXPORT int
-module_init(struct weston_compositor *compositor)
+module_init(struct weston_compositor *compositor,
+           int *argc, char *argv[], const char *config_file)
 {
        struct tablet_shell *shell;
        struct wl_event_loop *loop;
index ddd9640..e50177e 100644 (file)
@@ -315,7 +315,9 @@ weston_xserver_destroy(struct wl_listener *l, void *data)
 }
 
 WL_EXPORT int
-module_init(struct weston_compositor *compositor)
+module_init(struct weston_compositor *compositor,
+           int *argc, char *argv[], const char *config_file)
+
 {
        struct wl_display *display = compositor->wl_display;
        struct weston_xserver *wxs;
index 5908f60..5bafa08 100644 (file)
@@ -67,7 +67,8 @@ surface_to_from_global(void *data)
 }
 
 WL_EXPORT int
-module_init(struct weston_compositor *compositor)
+module_init(struct weston_compositor *compositor,
+           int *argc, char *argv[], const char *config_file)
 {
        struct wl_event_loop *loop;
 
index b41c63f..8157e33 100644 (file)
@@ -50,7 +50,8 @@ surface_transform(void *data)
 }
 
 WL_EXPORT int
-module_init(struct weston_compositor *compositor)
+module_init(struct weston_compositor *compositor,
+           int *argc, char *argv[], const char *config_file)
 {
        struct wl_event_loop *loop;
 
index a9def4b..83a7124 100644 (file)
@@ -224,7 +224,8 @@ idle_launch_client(void *data)
 }
 
 WL_EXPORT int
-module_init(struct weston_compositor *ec)
+module_init(struct weston_compositor *ec,
+           int *argc, char *argv[], const char *config_file)
 {
        struct weston_test *test;
        struct wl_event_loop *loop;