From 614393c09c31c980cd6df98017d6cd31523c8479 Mon Sep 17 00:00:00 2001 From: Luminarys Date: Sat, 15 Aug 2015 19:51:23 -0500 Subject: [PATCH 1/3] Added in config file loading from multiple sources --- sway/config.c | 86 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 77 insertions(+), 9 deletions(-) diff --git a/sway/config.c b/sway/config.c index d96d23fc..eb08641a 100644 --- a/sway/config.c +++ b/sway/config.c @@ -1,6 +1,7 @@ #include #include #include +#include #include "readline.h" #include "stringop.h" #include "list.h" @@ -10,21 +11,88 @@ struct sway_config *config; -bool load_config() { - sway_log(L_INFO, "Loading config"); - // TODO: Allow use of more config file locations - const char *name = "/.sway/config"; +static bool exists(const char *path) { + return access(path, R_OK) != -1; +} + +static char* get_config_path() { + char *name = "/.sway/config"; const char *home = getenv("HOME"); + + sway_log(L_DEBUG, "Trying to find config in ~/.sway/config"); + // Check home dir char *temp = malloc(strlen(home) + strlen(name) + 1); strcpy(temp, home); strcat(temp, name); - FILE *f = fopen(temp, "r"); + if (exists(temp)) { + return temp; + } + + // Check XDG_CONFIG_HOME with fallback to ~/.config/ + sway_log(L_DEBUG, "Trying to find config in XDG_CONFIG_HOME/sway/config"); + char *xdg_config_home = getenv("XDG_CONFIG_HOME"); + if (xdg_config_home == NULL) { + sway_log(L_DEBUG, "Falling back to ~/.config/sway/config"); + name = "/.config/sway/config"; + temp = malloc(strlen(home) + strlen(name) + 1); + strcpy(temp, home); + strcat(temp, name); + } else { + name = "/sway/config"; + temp = malloc(strlen(xdg_config_home) + strlen(name) + 1); + strcpy(temp, home); + strcat(temp, name); + } + if (exists(temp)) { + return temp; + } + + // Check /etc/ + sway_log(L_DEBUG, "Trying to find config in /etc/sway/config"); + strcpy(temp, "/etc/sway/config"); + if (exists(temp)) { + return temp; + } + + // Check XDG_CONFIG_DIRS + sway_log(L_DEBUG, "Trying to find config in XDG_CONFIG_DIRS"); + char *xdg_config_dirs = getenv("XDG_CONFIG_DIRS"); + if (xdg_config_dirs != NULL) { + list_t *paths = split_string(xdg_config_dirs, ":"); + name = "/sway/config"; + int i; + for (i = 0; i < paths->length; i++ ) { + temp = malloc(strlen(paths->items[i]) + strlen(name) + 1); + strcpy(temp, paths->items[i]); + strcat(temp, name); + if (exists(temp)) { + free_flat_list(paths); + return temp; + } + } + free_flat_list(paths); + } + + return NULL; +} + +bool load_config() { + sway_log(L_INFO, "Loading config"); + + char *path = get_config_path(); + + if (path == NULL) { + sway_log(L_ERROR, "Unable to find a config file!"); + return false; + } + + FILE *f = fopen(path, "r"); if (!f) { - fprintf(stderr, "Unable to open %s for reading", temp); - free(temp); + fprintf(stderr, "Unable to open %s for reading", path); + free(path); return false; } - free(temp); + free(path); bool config_load_success; if (config) { @@ -95,7 +163,7 @@ bool read_config(FILE *file, bool is_active) { sway_log(L_DEBUG, "Config load failed for line %s", line); success = false; temp_config->failed = true; - } + } list_free(args); _continue: From 24231bef0efb557d90e09398e3b3c0d5828db917 Mon Sep 17 00:00:00 2001 From: Luminarys Date: Sat, 15 Aug 2015 20:03:33 -0500 Subject: [PATCH 2/3] Added in additional checks for i3 config paths --- sway/config.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/sway/config.c b/sway/config.c index eb08641a..4f576bb9 100644 --- a/sway/config.c +++ b/sway/config.c @@ -19,8 +19,8 @@ static char* get_config_path() { char *name = "/.sway/config"; const char *home = getenv("HOME"); - sway_log(L_DEBUG, "Trying to find config in ~/.sway/config"); // Check home dir + sway_log(L_DEBUG, "Trying to find config in ~/.sway/config"); char *temp = malloc(strlen(home) + strlen(name) + 1); strcpy(temp, home); strcat(temp, name); @@ -73,6 +73,58 @@ static char* get_config_path() { free_flat_list(paths); } + //Now fall back to i3 paths and try the same thing + name = "/.i3/config"; + sway_log(L_DEBUG, "Trying to find config in ~/.i3/config"); + char *temp = malloc(strlen(home) + strlen(name) + 1); + strcpy(temp, home); + strcat(temp, name); + if (exists(temp)) { + return temp; + } + + sway_log(L_DEBUG, "Trying to find config in XDG_CONFIG_HOME/i3/config"); + char *xdg_config_home = getenv("XDG_CONFIG_HOME"); + if (xdg_config_home == NULL) { + sway_log(L_DEBUG, "Falling back to ~/.config/i3/config"); + name = "/.config/i3/config"; + temp = malloc(strlen(home) + strlen(name) + 1); + strcpy(temp, home); + strcat(temp, name); + } else { + name = "/i3/config"; + temp = malloc(strlen(xdg_config_home) + strlen(name) + 1); + strcpy(temp, home); + strcat(temp, name); + } + if (exists(temp)) { + return temp; + } + + sway_log(L_DEBUG, "Trying to find config in /etc/i3/config"); + strcpy(temp, "/etc/i3/config"); + if (exists(temp)) { + return temp; + } + + sway_log(L_DEBUG, "Trying to find config in XDG_CONFIG_DIRS"); + char *xdg_config_dirs = getenv("XDG_CONFIG_DIRS"); + if (xdg_config_dirs != NULL) { + list_t *paths = split_string(xdg_config_dirs, ":"); + name = "/i3/config"; + int i; + for (i = 0; i < paths->length; i++ ) { + temp = malloc(strlen(paths->items[i]) + strlen(name) + 1); + strcpy(temp, paths->items[i]); + strcat(temp, name); + if (exists(temp)) { + free_flat_list(paths); + return temp; + } + } + free_flat_list(paths); + } + return NULL; } From 64a971882a7b3925ed69399c7ea1dc8177f8e295 Mon Sep 17 00:00:00 2001 From: Luminarys Date: Sat, 15 Aug 2015 20:13:18 -0500 Subject: [PATCH 3/3] Minor fix to config loading --- sway/config.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/sway/config.c b/sway/config.c index 4f576bb9..17a75fbf 100644 --- a/sway/config.c +++ b/sway/config.c @@ -76,7 +76,7 @@ static char* get_config_path() { //Now fall back to i3 paths and try the same thing name = "/.i3/config"; sway_log(L_DEBUG, "Trying to find config in ~/.i3/config"); - char *temp = malloc(strlen(home) + strlen(name) + 1); + temp = malloc(strlen(home) + strlen(name) + 1); strcpy(temp, home); strcat(temp, name); if (exists(temp)) { @@ -84,7 +84,6 @@ static char* get_config_path() { } sway_log(L_DEBUG, "Trying to find config in XDG_CONFIG_HOME/i3/config"); - char *xdg_config_home = getenv("XDG_CONFIG_HOME"); if (xdg_config_home == NULL) { sway_log(L_DEBUG, "Falling back to ~/.config/i3/config"); name = "/.config/i3/config"; @@ -108,7 +107,6 @@ static char* get_config_path() { } sway_log(L_DEBUG, "Trying to find config in XDG_CONFIG_DIRS"); - char *xdg_config_dirs = getenv("XDG_CONFIG_DIRS"); if (xdg_config_dirs != NULL) { list_t *paths = split_string(xdg_config_dirs, ":"); name = "/i3/config";