diff --git a/include/rootston/config.h b/include/rootston/config.h index 66347c3c..5fa4890f 100644 --- a/include/rootston/config.h +++ b/include/rootston/config.h @@ -42,6 +42,7 @@ struct roots_config { struct wl_list devices; struct wl_list bindings; char *config_path; + char *startup_cmd; }; struct roots_config *parse_args(int argc, char *argv[]); diff --git a/rootston/config.c b/rootston/config.c index 5ed299a7..71a4731b 100644 --- a/rootston/config.c +++ b/rootston/config.c @@ -16,12 +16,13 @@ static void usage(const char *name, int ret) { fprintf(stderr, - "usage: %s [-C ]\n" + "usage: %s [-C ] [-E ]\n" "\n" " -C Path to the configuration file\n" " (default: rootston.ini).\n" " See `rootston.ini.example` for config\n" - " file documentation.\n", name); + " file documentation.\n" + " -E Command that will be ran at startup.\n" , name); exit(ret); } @@ -273,11 +274,14 @@ struct roots_config *parse_args(int argc, char *argv[]) { wl_list_init(&config->bindings); int c; - while ((c = getopt(argc, argv, "C:h")) != -1) { + while ((c = getopt(argc, argv, "C:E:h")) != -1) { switch (c) { case 'C': config->config_path = strdup(optarg); break; + case 'E': + config->startup_cmd = strdup(optarg); + break; case 'h': case '?': usage(argv[0], c != 'h'); diff --git a/rootston/main.c b/rootston/main.c index 5a60000c..b80c2efd 100644 --- a/rootston/main.c +++ b/rootston/main.c @@ -1,6 +1,7 @@ #define _POSIX_C_SOURCE 200112L #include #include +#include #include #include #include @@ -42,6 +43,18 @@ int main(int argc, char **argv) { } setenv("WAYLAND_DISPLAY", socket, true); + + if (server.config->startup_cmd != NULL) { + const char *cmd = server.config->startup_cmd; + pid_t pid = fork(); + if (pid < 0) { + wlr_log(L_ERROR, "cannot execute binding command: fork() failed"); + return 1; + } else if (pid == 0) { + execl("/bin/sh", "/bin/sh", "-c", cmd, (void *)NULL); + } + } + wl_display_run(server.wl_display); wlr_backend_destroy(server.backend); return 0;