]> git.sur5r.net Git - i3/i3/commitdiff
Correct XDG paths precedence for config files 3324/head
authorOrestis Floros <orestisf1993@gmail.com>
Tue, 10 Jul 2018 02:04:34 +0000 (05:04 +0300)
committerOrestis Floros <orestisf1993@gmail.com>
Tue, 10 Jul 2018 02:04:34 +0000 (05:04 +0300)
Fixes #3323

include/libi3.h
libi3/get_config_path.c
man/i3.man
src/config.c

index b7a1e2aa21ae6b285516f81191a1ab63da37f0a5..ebddee96a49b22008753f66431e92bb3eac0e2a5 100644 (file)
@@ -506,11 +506,11 @@ int logical_px(const int logical);
 char *resolve_tilde(const char *path);
 
 /**
- * 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)
+ * 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, always taking
+ * into account the XDG Base Directory Specification ($XDG_CONFIG_HOME,
+ * $XDG_CONFIG_DIRS).
  *
  */
 char *get_config_path(const char *override_configpath, bool use_system_paths);
index efece5cde792f44949423897983445a033865dd1..4909e116ba8f9e9e13a2b3ab8be7e0ba9121c5c5 100644 (file)
@@ -21,11 +21,11 @@ static bool path_exists(const char *path) {
 }
 
 /*
- * 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)
+ * 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, always taking
+ * into account the XDG Base Directory Specification ($XDG_CONFIG_HOME,
+ * $XDG_CONFIG_DIRS).
  *
  */
 char *get_config_path(const char *override_configpath, bool use_system_paths) {
@@ -38,40 +38,41 @@ char *get_config_path(const char *override_configpath, bool use_system_paths) {
         return sstrdup(saved_configpath);
     }
 
-    if (saved_configpath != 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;
-    free(config_path);
-
-    /* 2: check for $XDG_CONFIG_HOME/i3/config */
-    if ((xdg_config_home = getenv("XDG_CONFIG_HOME")) == NULL)
+    /* 1: 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);
     sasprintf(&config_path, "%s/i3/config", xdg_config_home);
     free(xdg_config_home);
 
-    if (path_exists(config_path))
+    if (path_exists(config_path)) {
         return config_path;
+    }
+    free(config_path);
+
+    /* 2: check the traditional path under the home directory */
+    config_path = resolve_tilde("~/.i3/config");
+    if (path_exists(config_path)) {
+        return config_path;
+    }
     free(config_path);
 
     /* The below paths are considered system-level, and can be skipped if the
      * caller only wants user-level configs. */
-    if (!use_system_paths)
+    if (!use_system_paths) {
         return NULL;
+    }
 
-    /* 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)
+    /* 3: check for $XDG_CONFIG_DIRS/i3/config */
+    if ((xdg_config_dirs = getenv("XDG_CONFIG_DIRS")) == NULL) {
         xdg_config_dirs = SYSCONFDIR "/xdg";
+    }
 
     char *buf = sstrdup(xdg_config_dirs);
     char *tok = strtok(buf, ":");
@@ -88,5 +89,11 @@ char *get_config_path(const char *override_configpath, bool use_system_paths) {
     }
     free(buf);
 
+    /* 4: check the traditional path under /etc */
+    config_path = SYSCONFDIR "/i3/config";
+    if (path_exists(config_path)) {
+        return sstrdup(config_path);
+    }
+
     return NULL;
 }
index 1f595ce827d1e2bc8d7b95e94f3c7b0b95639fa9..640b5ac81a36e95703f8a627711cde624e9137a7 100644 (file)
@@ -170,10 +170,10 @@ Exits i3.
 
 When starting, i3 looks for configuration files in the following order:
 
-1. ~/.i3/config
-2. ~/.config/i3/config (or $XDG_CONFIG_HOME/i3/config if set)
-3. /etc/i3/config
-4. /etc/xdg/i3/config (or $XDG_CONFIG_DIRS/i3/config if set)
+1. ~/.config/i3/config (or $XDG_CONFIG_HOME/i3/config if set)
+2. ~/.i3/config
+3. /etc/xdg/i3/config (or $XDG_CONFIG_DIRS/i3/config if set)
+4. /etc/i3/config
 
 You can specify a custom path using the -c option.
 
index de149ce7d84adb828d2ec453410afb834afe1e53..ab19bae314ef2404dbc41bbd4c020341e7cc610b 100644 (file)
@@ -49,7 +49,8 @@ bool parse_configuration(const char *override_configpath, bool use_nagbar) {
     char *path = get_config_path(override_configpath, true);
     if (path == NULL) {
         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)");
+            "$XDG_CONFIG_HOME/i3/config, ~/.i3/config, $XDG_CONFIG_DIRS/i3/config "
+            "and " SYSCONFDIR "/i3/config)");
     }
 
     LOG("Parsing configfile %s\n", path);