Add startup command option to rootston
Allows specifying a command to run at startup.
This commit is contained in:
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…
Reference in New Issue