X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fconfig.c;h=572b4ab9f93075a73a22e9886fa80f94b24c5eea;hb=5ae4620a2484a390dd63642ba66fbb4ca09cbd21;hp=e60fd9b059ce54f9799235015521d1e22f440bb0;hpb=a1dd74da5a6074da934fba53ecf70b8da23aae26;p=i3%2Fi3 diff --git a/src/config.c b/src/config.c index e60fd9b0..572b4ab9 100644 --- a/src/config.c +++ b/src/config.c @@ -1,5 +1,5 @@ /* - * vim:ts=8:expandtab + * vim:ts=4:sw=4:expandtab * * i3 - an improved dynamic tiling window manager * @@ -19,50 +19,10 @@ #include "all.h" +char *current_configpath = NULL; Config config; struct modes_head modes; - -/* - * This function resolves ~ in pathnames. - * It may resolve wildcards in the first part of the path, but if no match - * or multiple matches are found, it just returns a copy of path as given. - * - */ -char *resolve_tilde(const char *path) { - static glob_t globbuf; - char *head, *tail, *result; - - tail = strchr(path, '/'); - head = strndup(path, tail ? tail - path : strlen(path)); - - int res = glob(head, GLOB_TILDE, NULL, &globbuf); - free(head); - /* no match, or many wildcard matches are bad */ - if (res == GLOB_NOMATCH || globbuf.gl_pathc != 1) - result = sstrdup(path); - else if (res != 0) { - die("glob() failed"); - } else { - head = globbuf.gl_pathv[0]; - result = scalloc(strlen(head) + (tail ? strlen(tail) : 0) + 1); - strncpy(result, head, strlen(head)); - strncat(result, tail, strlen(tail)); - } - globfree(&globbuf); - - return result; -} - -/* - * Checks if the given path exists by calling stat(). - * - */ -bool path_exists(const char *path) { - struct stat buf; - return (stat(path, &buf) == 0); -} - /** * Ungrabs all keys, to be called before re-grabbing the keys because of a * mapping_notify event or a configuration file reload @@ -210,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; - - /* 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(config_path); - tok = strtok(NULL, ":"); +static char *get_config_path(const char *override_configpath) { + char *xdg_config_home, *xdg_config_dirs, *config_path; + + static const char *saved_configpath = NULL; + + if (override_configpath != NULL) { + saved_configpath = override_configpath; + return sstrdup(saved_configpath); + } + + 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)"); } /* @@ -273,15 +245,11 @@ static char *get_config_path() { * */ static void parse_configuration(const char *override_configpath) { - if (override_configpath != NULL) { - parse_file(override_configpath); - return; - } - - char *path = get_config_path(); - DLOG("Parsing configfile %s\n", path); - parse_file(path); - free(path); + char *path = get_config_path(override_configpath); + DLOG("Parsing configfile %s\n", path); + FREE(current_configpath); + current_configpath = path; + parse_file(path); } /* @@ -364,8 +332,9 @@ void load_configuration(xcb_connection_t *conn, const char *override_configpath, INIT_COLOR(config.bar.unfocused, "#333333", "#222222", "#888888"); INIT_COLOR(config.bar.urgent, "#2f343a", "#900000", "#ffffff"); - config.restart_state_path = "~/.i3/_restart.json"; config.default_border = BS_NORMAL; + /* Set default_orientation to NO_ORIENTATION for auto orientation. */ + config.default_orientation = NO_ORIENTATION; parse_configuration(override_configpath); @@ -374,7 +343,10 @@ void load_configuration(xcb_connection_t *conn, const char *override_configpath, grab_all_keys(conn, false); } - REQUIRED_OPTION(font); + if (config.font.id == 0) { + ELOG("You did not specify required configuration option \"font\"\n"); + config.font = load_font("fixed", true); + } #if 0 /* Set an empty name for every workspace which got no name */