diff options
author | Drew DeVault <sir@cmpwn.com> | 2015-08-20 08:37:09 -0400 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2015-08-20 08:37:24 -0400 |
commit | 579fe70ed92ce65d5a761ebdbb6c458b5f919687 (patch) | |
tree | a56ab8990f003d4408f1ef71d35c425a3545aec2 | |
parent | 927ef0a5ecbd5fae71e862cdd9b6c83fa1c481d8 (diff) |
Add command line parsing
Closes #6
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | include/config.h | 2 | ||||
-rw-r--r-- | sway/commands.c | 2 | ||||
-rw-r--r-- | sway/config.c | 9 | ||||
-rw-r--r-- | sway/main.c | 78 |
5 files changed, 86 insertions, 6 deletions
@@ -9,3 +9,4 @@ bin/ test/ build/ .lvimrc +config-debug diff --git a/include/config.h b/include/config.h index c47eb683..c23c3509 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 a3f74747..803d9a21 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 94bc2abb..9f65e8a2 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 2db4604c..4a7e13c1 100644 --- a/sway/main.c +++ b/sway/main.c @@ -4,6 +4,7 @@ #include <wlc/wlc.h> #include <sys/wait.h> #include <signal.h> +#include <getopt.h> #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; } |