mirror of
				https://github.com/rad4day/Waybar.git
				synced 2025-10-31 07:52:42 +01:00 
			
		
		
		
	Merge pull request #995 from OskarCarl/master
Add recursive config includes
This commit is contained in:
		| @@ -38,7 +38,8 @@ class Client { | ||||
|   const std::string        getValidPath(const std::vector<std::string> &paths) const; | ||||
|   void                     handleOutput(struct waybar_output &output); | ||||
|   bool                     isValidOutput(const Json::Value &config, struct waybar_output &output); | ||||
|   auto                     setupConfig(const std::string &config_file) -> void; | ||||
|   auto                     setupConfig(const std::string &config_file, int depth) -> void; | ||||
|   auto                     mergeConfig(Json::Value &a_config_, Json::Value &b_config_) -> void; | ||||
|   auto                     setupCss(const std::string &css_file) -> void; | ||||
|   struct waybar_output &   getOutput(void *); | ||||
|   std::vector<Json::Value> getOutputConfigs(struct waybar_output &output); | ||||
|   | ||||
| @@ -85,6 +85,10 @@ Also a minimal example configuration can be found on the at the bottom of this m | ||||
| 	Option to disable the use of gtk-layer-shell for popups. | ||||
| 	Only functional if compiled with gtk-layer-shell support. | ||||
|  | ||||
| *include* ++ | ||||
| 	typeof: array ++ | ||||
| 	Paths to additional configuration files. In case of duplicate options, the including file's value takes precedence. Make sure to avoid circular imports. | ||||
|  | ||||
| # MODULE FORMAT | ||||
|  | ||||
| You can use PangoMarkupFormat (See https://developer.gnome.org/pango/stable/PangoMarkupFormat.html#PangoMarkupFormat). | ||||
|   | ||||
| @@ -234,14 +234,34 @@ std::tuple<const std::string, const std::string> waybar::Client::getConfigs( | ||||
|   return {config_file, css_file}; | ||||
| } | ||||
|  | ||||
| auto waybar::Client::setupConfig(const std::string &config_file) -> void { | ||||
| auto waybar::Client::setupConfig(const std::string &config_file, int depth) -> void { | ||||
|   if (depth > 100) { | ||||
|     throw std::runtime_error("Aborting due to likely recursive include in config files"); | ||||
|   } | ||||
|   std::ifstream file(config_file); | ||||
|   if (!file.is_open()) { | ||||
|     throw std::runtime_error("Can't open config file"); | ||||
|   } | ||||
|   std::string      str((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>()); | ||||
|   util::JsonParser parser; | ||||
|   config_ = parser.parse(str); | ||||
|   Json::Value      tmp_config_ = parser.parse(str); | ||||
|   if (tmp_config_["include"].isArray()) { | ||||
|     for (const auto &include : tmp_config_["include"]) { | ||||
|       spdlog::info("Including resource file: {}", include.asString()); | ||||
|       setupConfig(getValidPath({include.asString()}), ++depth); | ||||
|     } | ||||
|   } | ||||
|   mergeConfig(config_, tmp_config_); | ||||
| } | ||||
|  | ||||
| auto waybar::Client::mergeConfig(Json::Value &a_config_, Json::Value &b_config_) -> void { | ||||
|   for (const auto &key : b_config_.getMemberNames()) { | ||||
|     if (a_config_[key].type() == Json::objectValue && b_config_[key].type() == Json::objectValue) { | ||||
|       mergeConfig(a_config_[key], b_config_[key]); | ||||
|     } else { | ||||
|       a_config_[key] = b_config_[key]; | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| auto waybar::Client::setupCss(const std::string &css_file) -> void { | ||||
| @@ -320,7 +340,7 @@ int waybar::Client::main(int argc, char *argv[]) { | ||||
|   } | ||||
|   wl_display = gdk_wayland_display_get_wl_display(gdk_display->gobj()); | ||||
|   auto [config_file, css_file] = getConfigs(config, style); | ||||
|   setupConfig(config_file); | ||||
|   setupConfig(config_file, 0); | ||||
|   setupCss(css_file); | ||||
|   bindInterfaces(); | ||||
|   gtk_app->hold(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Alex
					Alex