Add command line parsing

Closes #6
This commit is contained in:
Drew DeVault 2015-08-20 08:37:09 -04:00
parent 927ef0a5ec
commit 579fe70ed9
5 changed files with 86 additions and 6 deletions

1
.gitignore vendored
View file

@ -9,3 +9,4 @@ bin/
test/ test/
build/ build/
.lvimrc .lvimrc
config-debug

View file

@ -46,7 +46,7 @@ struct sway_config {
int gaps_outer; int gaps_outer;
}; };
bool load_config(void); bool load_config(const char *file);
bool read_config(FILE *file, bool is_active); bool read_config(FILE *file, bool is_active);
char *do_var_replacement(struct sway_config *config, char *str); char *do_var_replacement(struct sway_config *config, char *str);

View file

@ -414,7 +414,7 @@ static bool cmd_reload(struct sway_config *config, int argc, char **argv) {
if (!checkarg(argc, "reload", EXPECTED_EQUAL_TO, 0)) { if (!checkarg(argc, "reload", EXPECTED_EQUAL_TO, 0)) {
return false; return false;
} }
if (!load_config()) { if (!load_config(NULL)) { // TODO: Use config given from -c
return false; return false;
} }
arrange_windows(&root_container, -1, -1); arrange_windows(&root_container, -1, -1);

View file

@ -144,10 +144,15 @@ _continue:
return test; return test;
} }
bool load_config(void) { bool load_config(const char *file) {
sway_log(L_INFO, "Loading config"); 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) { if (path == NULL) {
sway_log(L_ERROR, "Unable to find a config file!"); sway_log(L_ERROR, "Unable to find a config file!");

View file

@ -4,6 +4,7 @@
#include <wlc/wlc.h> #include <wlc/wlc.h>
#include <sys/wait.h> #include <sys/wait.h>
#include <signal.h> #include <signal.h>
#include <getopt.h>
#include "layout.h" #include "layout.h"
#include "config.h" #include "config.h"
#include "log.h" #include "log.h"
@ -12,23 +13,96 @@
static void sigchld_handle(int signal); static void sigchld_handle(int signal);
int main(int argc, char **argv) { 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 handling */
signal(SIGCHLD, sigchld_handle); signal(SIGCHLD, sigchld_handle);
setenv("WLC_DIM", "0", 0); 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 */ /* Changing code earlier than this point requires detailed review */
if (!wlc_init(&interface, argc, argv)) { if (!wlc_init(&interface, argc, argv)) {
return 1; 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(); init_layout();
if (!load_config()) { if (!load_config(config_path)) {
sway_log(L_ERROR, "Error(s) loading config!"); sway_log(L_ERROR, "Error(s) loading config!");
} }
if (config_path) {
free(config_path);
}
wlc_run(); wlc_run();
if (devnull) {
fclose(devnull);
}
return 0; return 0;
} }