X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fconfig.c;h=572b4ab9f93075a73a22e9886fa80f94b24c5eea;hb=cd6f93be3fa607e98fe17d05c86b31dcfc6fdf1c;hp=20b077b702c4c8926d15d35690baafd724aaec26;hpb=626c65b0d81683b38b07a4106158a99781ce72e0;p=i3%2Fi3 diff --git a/src/config.c b/src/config.c index 20b077b7..572b4ab9 100644 --- a/src/config.c +++ b/src/config.c @@ -19,7 +19,7 @@ #include "all.h" -const char *current_configpath = NULL; +char *current_configpath = NULL; Config config; struct modes_head modes; @@ -170,60 +170,72 @@ void switch_mode(xcb_connection_t *conn, const char *new_mode) { } /* - * Get the path of the first configuration file found. Checks the home directory - * first, then the system directory first, always taking into account the XDG - * Base Directory Specification ($XDG_CONFIG_HOME, $XDG_CONFIG_DIRS) + * Get the path of the first configuration file found. If override_configpath + * is specified, that path is returned and saved for further calls. Otherwise, + * checks the home directory first, then the system directory first, always + * taking into account the XDG Base Directory Specification ($XDG_CONFIG_HOME, + * $XDG_CONFIG_DIRS) * */ -static char *get_config_path() { - char *xdg_config_home, *xdg_config_dirs, *config_path; +static char *get_config_path(const char *override_configpath) { + char *xdg_config_home, *xdg_config_dirs, *config_path; - /* 1: check the traditional path under the home directory */ - config_path = resolve_tilde("~/.i3/config"); - if (path_exists(config_path)) - return config_path; - - /* 2: check for $XDG_CONFIG_HOME/i3/config */ - if ((xdg_config_home = getenv("XDG_CONFIG_HOME")) == NULL) - xdg_config_home = "~/.config"; - - xdg_config_home = resolve_tilde(xdg_config_home); - if (asprintf(&config_path, "%s/i3/config", xdg_config_home) == -1) - die("asprintf() failed"); - free(xdg_config_home); + static const char *saved_configpath = NULL; - if (path_exists(config_path)) - return config_path; - free(config_path); + if (override_configpath != NULL) { + saved_configpath = override_configpath; + return sstrdup(saved_configpath); + } - /* 3: check the traditional path under /etc */ - config_path = SYSCONFDIR "/i3/config"; - if (path_exists(config_path)) - return sstrdup(config_path); - - /* 4: check for $XDG_CONFIG_DIRS/i3/config */ - if ((xdg_config_dirs = getenv("XDG_CONFIG_DIRS")) == NULL) - xdg_config_dirs = "/etc/xdg"; - - char *buf = sstrdup(xdg_config_dirs); - char *tok = strtok(buf, ":"); - while (tok != NULL) { - tok = resolve_tilde(tok); - if (asprintf(&config_path, "%s/i3/config", tok) == -1) - die("asprintf() failed"); - free(tok); - if (path_exists(config_path)) { - free(buf); - return config_path; - } - free(config_path); - tok = strtok(NULL, ":"); + if (saved_configpath != NULL) + return sstrdup(saved_configpath); + + /* 1: check the traditional path under the home directory */ + config_path = resolve_tilde("~/.i3/config"); + if (path_exists(config_path)) + return config_path; + + /* 2: check for $XDG_CONFIG_HOME/i3/config */ + if ((xdg_config_home = getenv("XDG_CONFIG_HOME")) == NULL) + xdg_config_home = "~/.config"; + + xdg_config_home = resolve_tilde(xdg_config_home); + if (asprintf(&config_path, "%s/i3/config", xdg_config_home) == -1) + die("asprintf() failed"); + free(xdg_config_home); + + if (path_exists(config_path)) + return config_path; + free(config_path); + + /* 3: check the traditional path under /etc */ + config_path = SYSCONFDIR "/i3/config"; + if (path_exists(config_path)) + return sstrdup(config_path); + + /* 4: check for $XDG_CONFIG_DIRS/i3/config */ + if ((xdg_config_dirs = getenv("XDG_CONFIG_DIRS")) == NULL) + xdg_config_dirs = "/etc/xdg"; + + char *buf = sstrdup(xdg_config_dirs); + char *tok = strtok(buf, ":"); + while (tok != NULL) { + tok = resolve_tilde(tok); + if (asprintf(&config_path, "%s/i3/config", tok) == -1) + die("asprintf() failed"); + free(tok); + if (path_exists(config_path)) { + free(buf); + return config_path; } - free(buf); + free(config_path); + tok = strtok(NULL, ":"); + } + free(buf); - die("Unable to find the configuration file (looked at " - "~/.i3/config, $XDG_CONFIG_HOME/i3/config, " - SYSCONFDIR "i3/config and $XDG_CONFIG_DIRS/i3/config)"); + die("Unable to find the configuration file (looked at " + "~/.i3/config, $XDG_CONFIG_HOME/i3/config, " + SYSCONFDIR "i3/config and $XDG_CONFIG_DIRS/i3/config)"); } /* @@ -233,25 +245,11 @@ static char *get_config_path() { * */ static void parse_configuration(const char *override_configpath) { - static const char *saved_configpath = NULL; - - if (override_configpath != NULL) { - saved_configpath = override_configpath; - current_configpath = override_configpath; - parse_file(override_configpath); - return; - } - else if (saved_configpath != NULL) { - current_configpath = saved_configpath; - parse_file(saved_configpath); - return; - } - - char *path = get_config_path(); + char *path = get_config_path(override_configpath); DLOG("Parsing configfile %s\n", path); + FREE(current_configpath); current_configpath = path; parse_file(path); - free(path); } /*