mirror of
				https://github.com/rad4day/Waybar.git
				synced 2025-10-30 23:42:42 +01:00 
			
		
		
		
	Add support for reading the config path from env
This commit adds support to reading the config base path from the environment variable `WAYBAR_CONFIG_DIR`. If it is set, but no configuration is found there, it falls back to the previous mechanism of using the default paths, without erroring.
This commit is contained in:
		| @@ -14,6 +14,7 @@ namespace waybar { | ||||
| class Config { | ||||
|  public: | ||||
|   static const std::vector<std::string> CONFIG_DIRS; | ||||
|   static const char *CONFIG_PATH_ENV; | ||||
|  | ||||
|   /* Try to find any of provided names in the supported set of config directories */ | ||||
|   static std::optional<std::string> findConfigPath( | ||||
|   | ||||
| @@ -4,11 +4,14 @@ | ||||
| #include <unistd.h> | ||||
| #include <wordexp.h> | ||||
|  | ||||
| #include <filesystem> | ||||
| #include <fstream> | ||||
| #include <stdexcept> | ||||
|  | ||||
| #include "util/json.hpp" | ||||
|  | ||||
| namespace fs = std::filesystem; | ||||
|  | ||||
| namespace waybar { | ||||
|  | ||||
| const std::vector<std::string> Config::CONFIG_DIRS = { | ||||
| @@ -16,12 +19,25 @@ const std::vector<std::string> Config::CONFIG_DIRS = { | ||||
|     "/etc/xdg/waybar/",         SYSCONFDIR "/xdg/waybar/", "./resources/", | ||||
| }; | ||||
|  | ||||
| std::optional<std::string> tryExpandPath(const std::string &path) { | ||||
| const char *Config::CONFIG_PATH_ENV = "WAYBAR_CONFIG_DIR"; | ||||
|  | ||||
| std::optional<std::string> tryExpandPath(const std::string base, const std::string filename) { | ||||
|   fs::path path; | ||||
|  | ||||
|   if (filename != "") { | ||||
|     path = fs::path(base) / fs::path(filename); | ||||
|   } else { | ||||
|     path = fs::path(base); | ||||
|   } | ||||
|  | ||||
|   spdlog::debug("Try expanding: {}", path); | ||||
|  | ||||
|   wordexp_t p; | ||||
|   if (wordexp(path.c_str(), &p, 0) == 0) { | ||||
|     if (access(*p.we_wordv, F_OK) == 0) { | ||||
|       std::string result = *p.we_wordv; | ||||
|       wordfree(&p); | ||||
|       spdlog::debug("Found config file: {}", path); | ||||
|       return result; | ||||
|     } | ||||
|     wordfree(&p); | ||||
| @@ -31,10 +47,17 @@ std::optional<std::string> tryExpandPath(const std::string &path) { | ||||
|  | ||||
| std::optional<std::string> Config::findConfigPath(const std::vector<std::string> &names, | ||||
|                                                   const std::vector<std::string> &dirs) { | ||||
|   std::vector<std::string> paths; | ||||
|   if (const char *dir = std::getenv(Config::CONFIG_PATH_ENV)) { | ||||
|     for (const auto &name : names) { | ||||
|       if (auto res = tryExpandPath(dir, name); res) { | ||||
|         return res; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   for (const auto &dir : dirs) { | ||||
|     for (const auto &name : names) { | ||||
|       if (auto res = tryExpandPath(dir + name); res) { | ||||
|       if (auto res = tryExpandPath(dir, name); res) { | ||||
|         return res; | ||||
|       } | ||||
|     } | ||||
| @@ -68,11 +91,11 @@ void Config::resolveConfigIncludes(Json::Value &config, int depth) { | ||||
|   if (includes.isArray()) { | ||||
|     for (const auto &include : includes) { | ||||
|       spdlog::info("Including resource file: {}", include.asString()); | ||||
|       setupConfig(config, tryExpandPath(include.asString()).value_or(""), ++depth); | ||||
|       setupConfig(config, tryExpandPath(include.asString(), "").value_or(""), ++depth); | ||||
|     } | ||||
|   } else if (includes.isString()) { | ||||
|     spdlog::info("Including resource file: {}", includes.asString()); | ||||
|     setupConfig(config, tryExpandPath(includes.asString()).value_or(""), ++depth); | ||||
|     setupConfig(config, tryExpandPath(includes.asString(), "").value_or(""), ++depth); | ||||
|   } | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Blallo
					Blallo