aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorD.B <thejan.2009@gmail.com>2017-10-20 17:49:04 +0200
committerD.B <thejan.2009@gmail.com>2017-10-20 17:49:04 +0200
commit8c759d7abe4ea732fddb2f258d318b32591d1e73 (patch)
tree6a83c698c818b4be1a6b9ee351cc44bdd98eded2
parentc7f39d0eb8c75e450f6f8e6198029990d8994f75 (diff)
Add startup command option to rootston
Allows specifying a command to run at startup.
-rw-r--r--include/rootston/config.h1
-rw-r--r--rootston/config.c10
-rw-r--r--rootston/main.c13
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;