diff options
| -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;  } | 
