aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2015-08-20 08:37:09 -0400
committerDrew DeVault <sir@cmpwn.com>2015-08-20 08:37:24 -0400
commit579fe70ed92ce65d5a761ebdbb6c458b5f919687 (patch)
treea56ab8990f003d4408f1ef71d35c425a3545aec2
parent927ef0a5ecbd5fae71e862cdd9b6c83fa1c481d8 (diff)
Add command line parsing
Closes #6
-rw-r--r--.gitignore1
-rw-r--r--include/config.h2
-rw-r--r--sway/commands.c2
-rw-r--r--sway/config.c9
-rw-r--r--sway/main.c78
5 files changed, 86 insertions, 6 deletions
diff --git a/.gitignore b/.gitignore
index b7b3266c..cf23d168 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 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;
}