From 579fe70ed92ce65d5a761ebdbb6c458b5f919687 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Thu, 20 Aug 2015 08:37:09 -0400 Subject: [PATCH] Add command line parsing Closes #6 --- .gitignore | 1 + include/config.h | 2 +- sway/commands.c | 2 +- sway/config.c | 9 ++++-- sway/main.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++-- 5 files changed, 86 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index b7b3266c5..cf23d168d 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ bin/ test/ build/ .lvimrc +config-debug diff --git a/include/config.h b/include/config.h index c47eb6831..c23c35096 100644 --- a/include/config.h +++ b/include/config.h @@ -46,7 +46,7 @@ struct sway_config { int gaps_outer; }; -bool load_config(void); +bool load_config(const char *file); bool read_config(FILE *file, bool is_active); char *do_var_replacement(struct sway_config *config, char *str); diff --git a/sway/commands.c b/sway/commands.c index a3f74747b..803d9a214 100644 --- a/sway/commands.c +++ b/sway/commands.c @@ -414,7 +414,7 @@ static bool cmd_reload(struct sway_config *config, int argc, char **argv) { if (!checkarg(argc, "reload", EXPECTED_EQUAL_TO, 0)) { return false; } - if (!load_config()) { + if (!load_config(NULL)) { // TODO: Use config given from -c return false; } arrange_windows(&root_container, -1, -1); diff --git a/sway/config.c b/sway/config.c index 94bc2abb5..9f65e8a26 100644 --- a/sway/config.c +++ b/sway/config.c @@ -144,10 +144,15 @@ _continue: return test; } -bool load_config(void) { +bool load_config(const char *file) { sway_log(L_INFO, "Loading config"); - char *path = get_config_path(); + char *path; + if (file != NULL) { + path = strdup(file); + } else { + path = get_config_path(); + } if (path == NULL) { sway_log(L_ERROR, "Unable to find a config file!"); diff --git a/sway/main.c b/sway/main.c index 2db4604cc..4a7e13c13 100644 --- a/sway/main.c +++ b/sway/main.c @@ -4,6 +4,7 @@ #include #include #include +#include #include "layout.h" #include "config.h" #include "log.h" @@ -12,23 +13,96 @@ 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); + } wlc_run(); + if (devnull) { + fclose(devnull); + } return 0; }