diff options
Diffstat (limited to 'sway/main.c')
-rw-r--r-- | sway/main.c | 96 |
1 files changed, 93 insertions, 3 deletions
diff --git a/sway/main.c b/sway/main.c index 2db4604c..f37f086d 100644 --- a/sway/main.c +++ b/sway/main.c @@ -4,31 +4,121 @@ #include <wlc/wlc.h> #include <sys/wait.h> #include <signal.h> +#include <getopt.h> #include "layout.h" #include "config.h" #include "log.h" #include "handlers.h" +#include "ipc.h" +#include "sway.h" + +static bool terminate_request = false; + +void sway_terminate(void) { + terminate_request = true; + wlc_terminate(); +} static void sigchld_handle(int signal); int main(int argc, char **argv) { + static int verbose = 0, debug = 0, validate = 0; + + static struct option long_options[] = { + {"config", required_argument, NULL, 'c'}, + {"validate", no_argument, &validate, 1}, + {"debug", no_argument, &debug, 1}, + {"version", no_argument, NULL, 'v'}, + {"verbose", no_argument, &verbose, 1}, + {"get-socketpath", no_argument, NULL, 'p'}, + }; + /* Signal handling */ signal(SIGCHLD, sigchld_handle); setenv("WLC_DIM", "0", 0); + + FILE *devnull = fopen("/dev/null", "w"); + if (devnull) { + // NOTE: Does not work, see wlc issue #54 + wlc_set_log_file(devnull); + } + /* Changing code earlier than this point requires detailed review */ if (!wlc_init(&interface, argc, argv)) { return 1; } - init_log(L_DEBUG); // TODO: Control this with command line arg + char *config_path = NULL; + + int c; + while (1) { + int option_index = 0; + c = getopt_long(argc, argv, "CdvVpc:", long_options, &option_index); + if (c == -1) { + break; + } + switch (c) { + case 0: // Flag + break; + case 'c': // config + config_path = strdup(optarg); + break; + case 'C': // validate + validate = 1; + break; + case 'd': // debug + debug = 1; + break; + case 'v': // version + // todo + exit(0); + break; + case 'V': // verbose + verbose = 1; + break; + case 'p': // --get-socketpath + // TODO + break; + } + } + + if (debug) { + init_log(L_DEBUG); + wlc_set_log_file(stderr); + fclose(devnull); + devnull = NULL; + } else if (verbose || validate) { + init_log(L_INFO); + } else { + init_log(L_ERROR); + } + + if (validate) { + bool valid = load_config(config_path); + return valid ? 0 : 1; + } + init_layout(); - if (!load_config()) { + if (!load_config(config_path)) { sway_log(L_ERROR, "Error(s) loading config!"); } + if (config_path) { + free(config_path); + } + + ipc_init(); + + if (!terminate_request) { + wlc_run(); + } + + if (devnull) { + fclose(devnull); + } - wlc_run(); + ipc_terminate(); return 0; } |