summaryrefslogtreecommitdiff
path: root/src/config/ConfigManager.cpp
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-05-16 09:38:42 +0200
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-05-16 09:38:42 +0200
commit26cd7d73e5b601836b1b061dee50b543d95eb76a (patch)
treefd2decc3849705b74ed0f9eeffc33f8d6fc25158 /src/config/ConfigManager.cpp
parent1d4d52af316f999f68199a83d21f7a87a63854aa (diff)
Added user-defined vars in config
Diffstat (limited to 'src/config/ConfigManager.cpp')
-rw-r--r--src/config/ConfigManager.cpp30
1 files changed, 29 insertions, 1 deletions
diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp
index 6cb51797..6f6a3bc2 100644
--- a/src/config/ConfigManager.cpp
+++ b/src/config/ConfigManager.cpp
@@ -101,7 +101,14 @@ void CConfigManager::init() {
void CConfigManager::configSetValueSafe(const std::string& COMMAND, const std::string& VALUE) {
if (configValues.find(COMMAND) == configValues.end()) {
- parseError = "Error setting value <" + VALUE + "> for field <" + COMMAND + ">: No such field.";
+ if (COMMAND[0] == '$') {
+ // register a dynamic var
+ Debug::log(LOG, "Registered dynamic var \"%s\" -> %s", COMMAND, VALUE);
+ configDynamicVars[COMMAND.substr(1)] = VALUE;
+ } else {
+ parseError = "Error setting value <" + VALUE + "> for field <" + COMMAND + ">: No such field.";
+ }
+
return;
}
@@ -456,6 +463,23 @@ std::string CConfigManager::parseKeyword(const std::string& COMMAND, const std::
return parseError;
}
+void CConfigManager::applyUserDefinedVars(std::string& line, const size_t equalsPlace) {
+ auto dollarPlace = line.find_first_of('$', equalsPlace);
+
+ while (dollarPlace != std::string::npos) {
+
+ const auto STRAFTERDOLLAR = line.substr(dollarPlace + 1);
+ for (auto&[var, value] : configDynamicVars) {
+ if (STRAFTERDOLLAR.find(var) == 0) {
+ line.replace(dollarPlace, var.length() + 1, value);
+ break;
+ }
+ }
+
+ dollarPlace = line.find_first_of('$', dollarPlace + 1);
+ }
+}
+
void CConfigManager::parseLine(std::string& line) {
// first check if its not a comment
const auto COMMENTSTART = line.find_first_of('#');
@@ -494,6 +518,9 @@ void CConfigManager::parseLine(std::string& line) {
// check if command
const auto EQUALSPLACE = line.find_first_of('=');
+ // apply vars
+ applyUserDefinedVars(line, EQUALSPLACE);
+
if (EQUALSPLACE == std::string::npos)
return;
@@ -516,6 +543,7 @@ void CConfigManager::loadConfigLoadVars() {
g_pKeybindManager->clearKeybinds();
g_pAnimationManager->removeAllBeziers();
m_mAdditionalReservedAreas.clear();
+ configDynamicVars.clear();
const char* const ENVHOME = getenv("HOME");
const std::string CONFIGPATH = ENVHOME + (ISDEBUG ? (std::string) "/.config/hypr/hyprlandd.conf" : (std::string) "/.config/hypr/hyprland.conf");