diff options
| -rw-r--r-- | include/rootston/config.h | 1 | ||||
| -rw-r--r-- | rootston/config.c | 10 | ||||
| -rw-r--r-- | rootston/main.c | 13 | 
3 files changed, 21 insertions, 3 deletions
| 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 <FILE>]\n" +		"usage: %s [-C <FILE>] [-E <COMMAND>]\n"  		"\n"  		" -C <FILE>      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>   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 <assert.h>  #include <stdlib.h> +#include <unistd.h>  #include <wayland-server.h>  #include <wlr/backend.h>  #include <wlr/render.h> @@ -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; | 
