Add startup command option to rootston

Allows specifying a command to run at startup.
master
D.B 7 years ago
parent c7f39d0eb8
commit 8c759d7abe

@ -42,6 +42,7 @@ struct roots_config {
struct wl_list devices; struct wl_list devices;
struct wl_list bindings; struct wl_list bindings;
char *config_path; char *config_path;
char *startup_cmd;
}; };
struct roots_config *parse_args(int argc, char *argv[]); struct roots_config *parse_args(int argc, char *argv[]);

@ -16,12 +16,13 @@
static void usage(const char *name, int ret) { static void usage(const char *name, int ret) {
fprintf(stderr, fprintf(stderr,
"usage: %s [-C <FILE>]\n" "usage: %s [-C <FILE>] [-E <COMMAND>]\n"
"\n" "\n"
" -C <FILE> Path to the configuration file\n" " -C <FILE> Path to the configuration file\n"
" (default: rootston.ini).\n" " (default: rootston.ini).\n"
" See `rootston.ini.example` for config\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); exit(ret);
} }
@ -273,11 +274,14 @@ struct roots_config *parse_args(int argc, char *argv[]) {
wl_list_init(&config->bindings); wl_list_init(&config->bindings);
int c; int c;
while ((c = getopt(argc, argv, "C:h")) != -1) { while ((c = getopt(argc, argv, "C:E:h")) != -1) {
switch (c) { switch (c) {
case 'C': case 'C':
config->config_path = strdup(optarg); config->config_path = strdup(optarg);
break; break;
case 'E':
config->startup_cmd = strdup(optarg);
break;
case 'h': case 'h':
case '?': case '?':
usage(argv[0], c != 'h'); usage(argv[0], c != 'h');

@ -1,6 +1,7 @@
#define _POSIX_C_SOURCE 200112L #define _POSIX_C_SOURCE 200112L
#include <assert.h> #include <assert.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h>
#include <wayland-server.h> #include <wayland-server.h>
#include <wlr/backend.h> #include <wlr/backend.h>
#include <wlr/render.h> #include <wlr/render.h>
@ -42,6 +43,18 @@ int main(int argc, char **argv) {
} }
setenv("WAYLAND_DISPLAY", socket, true); 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); wl_display_run(server.wl_display);
wlr_backend_destroy(server.backend); wlr_backend_destroy(server.backend);
return 0; return 0;

Loading…
Cancel
Save