mirror of
https://github.com/hyprwm/Hyprland
synced 2024-12-23 08:49:49 +01:00
Added source=
This commit is contained in:
parent
26cd7d73e5
commit
e991550abe
2 changed files with 92 additions and 16 deletions
|
@ -12,6 +12,9 @@
|
||||||
|
|
||||||
CConfigManager::CConfigManager() {
|
CConfigManager::CConfigManager() {
|
||||||
setDefaultVars();
|
setDefaultVars();
|
||||||
|
static const char* const ENVHOME = getenv("HOME");
|
||||||
|
const std::string CONFIGPATH = ENVHOME + (ISDEBUG ? (std::string) "/.config/hypr/hyprlandd.conf" : (std::string) "/.config/hypr/hyprland.conf");
|
||||||
|
configPaths.emplace_back(CONFIGPATH);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CConfigManager::setDefaultVars() {
|
void CConfigManager::setDefaultVars() {
|
||||||
|
@ -94,7 +97,7 @@ void CConfigManager::init() {
|
||||||
Debug::log(WARN, "Error at statting config, error %i", errno);
|
Debug::log(WARN, "Error at statting config, error %i", errno);
|
||||||
}
|
}
|
||||||
|
|
||||||
lastModifyTime = fileStat.st_mtime;
|
configModifyTimes[CONFIGPATH] = fileStat.st_mtime;
|
||||||
|
|
||||||
isFirstLaunch = false;
|
isFirstLaunch = false;
|
||||||
}
|
}
|
||||||
|
@ -103,7 +106,7 @@ void CConfigManager::configSetValueSafe(const std::string& COMMAND, const std::s
|
||||||
if (configValues.find(COMMAND) == configValues.end()) {
|
if (configValues.find(COMMAND) == configValues.end()) {
|
||||||
if (COMMAND[0] == '$') {
|
if (COMMAND[0] == '$') {
|
||||||
// register a dynamic var
|
// register a dynamic var
|
||||||
Debug::log(LOG, "Registered dynamic var \"%s\" -> %s", COMMAND, VALUE);
|
Debug::log(LOG, "Registered dynamic var \"%s\" -> %s", COMMAND.c_str(), VALUE.c_str());
|
||||||
configDynamicVars[COMMAND.substr(1)] = VALUE;
|
configDynamicVars[COMMAND.substr(1)] = VALUE;
|
||||||
} else {
|
} else {
|
||||||
parseError = "Error setting value <" + VALUE + "> for field <" + COMMAND + ">: No such field.";
|
parseError = "Error setting value <" + VALUE + "> for field <" + COMMAND + ">: No such field.";
|
||||||
|
@ -429,6 +432,60 @@ void CConfigManager::handleDefaultWorkspace(const std::string& command, const st
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CConfigManager::handleSource(const std::string& command, const std::string& rawpath) {
|
||||||
|
static const char* const ENVHOME = getenv("HOME");
|
||||||
|
|
||||||
|
auto value = rawpath;
|
||||||
|
|
||||||
|
if (value[0] == '~') {
|
||||||
|
value.replace(0, 1, std::string(ENVHOME));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!std::filesystem::exists(value)) {
|
||||||
|
Debug::log(ERR, "source= file doesnt exist");
|
||||||
|
parseError = "source file " + value + " doesn't exist!";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
configPaths.push_back(value);
|
||||||
|
|
||||||
|
struct stat fileStat;
|
||||||
|
int err = stat(value.c_str(), &fileStat);
|
||||||
|
if (err != 0) {
|
||||||
|
Debug::log(WARN, "Error at ticking config at %s, error %i: %s", value.c_str(), err, strerror(err));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
configModifyTimes[value] = fileStat.st_mtime;
|
||||||
|
|
||||||
|
std::ifstream ifs;
|
||||||
|
ifs.open(value);
|
||||||
|
std::string line = "";
|
||||||
|
int linenum = 1;
|
||||||
|
if (ifs.is_open()) {
|
||||||
|
while (std::getline(ifs, line)) {
|
||||||
|
// Read line by line.
|
||||||
|
try {
|
||||||
|
configCurrentPath = value;
|
||||||
|
parseLine(line);
|
||||||
|
} catch (...) {
|
||||||
|
Debug::log(ERR, "Error reading line from config. Line:");
|
||||||
|
Debug::log(NONE, "%s", line.c_str());
|
||||||
|
|
||||||
|
parseError += "Config error at line " + std::to_string(linenum) + " (" + configCurrentPath + "): Line parsing error.";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parseError != "" && parseError.find("Config error at line") != 0) {
|
||||||
|
parseError = "Config error at line " + std::to_string(linenum) + " (" + configCurrentPath + "): " + parseError;
|
||||||
|
}
|
||||||
|
|
||||||
|
++linenum;
|
||||||
|
}
|
||||||
|
|
||||||
|
ifs.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
std::string CConfigManager::parseKeyword(const std::string& COMMAND, const std::string& VALUE, bool dynamic) {
|
std::string CConfigManager::parseKeyword(const std::string& COMMAND, const std::string& VALUE, bool dynamic) {
|
||||||
if (dynamic)
|
if (dynamic)
|
||||||
parseError = "";
|
parseError = "";
|
||||||
|
@ -451,6 +508,7 @@ std::string CConfigManager::parseKeyword(const std::string& COMMAND, const std::
|
||||||
else if (COMMAND == "windowrule") handleWindowRule(COMMAND, VALUE);
|
else if (COMMAND == "windowrule") handleWindowRule(COMMAND, VALUE);
|
||||||
else if (COMMAND == "bezier") handleBezier(COMMAND, VALUE);
|
else if (COMMAND == "bezier") handleBezier(COMMAND, VALUE);
|
||||||
else if (COMMAND == "animation") handleAnimation(COMMAND, VALUE);
|
else if (COMMAND == "animation") handleAnimation(COMMAND, VALUE);
|
||||||
|
else if (COMMAND == "source") handleSource(COMMAND, VALUE);
|
||||||
else
|
else
|
||||||
configSetValueSafe(currentCategory + (currentCategory == "" ? "" : ":") + COMMAND, VALUE);
|
configSetValueSafe(currentCategory + (currentCategory == "" ? "" : ":") + COMMAND, VALUE);
|
||||||
|
|
||||||
|
@ -545,9 +603,14 @@ void CConfigManager::loadConfigLoadVars() {
|
||||||
m_mAdditionalReservedAreas.clear();
|
m_mAdditionalReservedAreas.clear();
|
||||||
configDynamicVars.clear();
|
configDynamicVars.clear();
|
||||||
|
|
||||||
const char* const ENVHOME = getenv("HOME");
|
// paths
|
||||||
|
configPaths.clear();
|
||||||
|
|
||||||
|
static const char* const ENVHOME = getenv("HOME");
|
||||||
const std::string CONFIGPATH = ENVHOME + (ISDEBUG ? (std::string) "/.config/hypr/hyprlandd.conf" : (std::string) "/.config/hypr/hyprland.conf");
|
const std::string CONFIGPATH = ENVHOME + (ISDEBUG ? (std::string) "/.config/hypr/hyprlandd.conf" : (std::string) "/.config/hypr/hyprland.conf");
|
||||||
|
|
||||||
|
configPaths.push_back(CONFIGPATH);
|
||||||
|
|
||||||
std::ifstream ifs;
|
std::ifstream ifs;
|
||||||
ifs.open(CONFIGPATH);
|
ifs.open(CONFIGPATH);
|
||||||
|
|
||||||
|
@ -578,16 +641,17 @@ void CConfigManager::loadConfigLoadVars() {
|
||||||
while (std::getline(ifs, line)) {
|
while (std::getline(ifs, line)) {
|
||||||
// Read line by line.
|
// Read line by line.
|
||||||
try {
|
try {
|
||||||
|
configCurrentPath = "~/.config/hypr/hyprland.conf";
|
||||||
parseLine(line);
|
parseLine(line);
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
Debug::log(ERR, "Error reading line from config. Line:");
|
Debug::log(ERR, "Error reading line from config. Line:");
|
||||||
Debug::log(NONE, "%s", line.c_str());
|
Debug::log(NONE, "%s", line.c_str());
|
||||||
|
|
||||||
parseError += "Config error at line " + std::to_string(linenum) + ": Line parsing error.";
|
parseError += "Config error at line " + std::to_string(linenum) + " (" + configCurrentPath + "): Line parsing error.";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parseError != "" && parseError.find("Config error at line") != 0) {
|
if (parseError != "" && parseError.find("Config error at line") != 0) {
|
||||||
parseError = "Config error at line " + std::to_string(linenum) + ": " + parseError;
|
parseError = "Config error at line " + std::to_string(linenum) + " (" + configCurrentPath + "): " + parseError;
|
||||||
}
|
}
|
||||||
|
|
||||||
++linenum;
|
++linenum;
|
||||||
|
@ -630,7 +694,7 @@ void CConfigManager::loadConfigLoadVars() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void CConfigManager::tick() {
|
void CConfigManager::tick() {
|
||||||
const char* const ENVHOME = getenv("HOME");
|
static const char* const ENVHOME = getenv("HOME");
|
||||||
|
|
||||||
const std::string CONFIGPATH = ENVHOME + (ISDEBUG ? (std::string) "/.config/hypr/hyprlandd.conf" : (std::string) "/.config/hypr/hyprland.conf");
|
const std::string CONFIGPATH = ENVHOME + (ISDEBUG ? (std::string) "/.config/hypr/hyprlandd.conf" : (std::string) "/.config/hypr/hyprland.conf");
|
||||||
|
|
||||||
|
@ -639,16 +703,24 @@ void CConfigManager::tick() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool parse = false;
|
||||||
|
|
||||||
|
for (auto& cf : configPaths) {
|
||||||
struct stat fileStat;
|
struct stat fileStat;
|
||||||
int err = stat(CONFIGPATH.c_str(), &fileStat);
|
int err = stat(cf.c_str(), &fileStat);
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
Debug::log(WARN, "Error at ticking config at %s, error %i: %s", CONFIGPATH.c_str(), err, strerror(err));
|
Debug::log(WARN, "Error at ticking config at %s, error %i: %s", cf.c_str(), err, strerror(err));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if we need to reload cfg
|
// check if we need to reload cfg
|
||||||
if (fileStat.st_mtime != lastModifyTime || m_bForceReload) {
|
if (fileStat.st_mtime != configModifyTimes[cf] || m_bForceReload) {
|
||||||
lastModifyTime = fileStat.st_mtime;
|
parse = true;
|
||||||
|
configModifyTimes[cf] = fileStat.st_mtime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parse) {
|
||||||
m_bForceReload = false;
|
m_bForceReload = false;
|
||||||
|
|
||||||
loadConfigLoadVars();
|
loadConfigLoadVars();
|
||||||
|
|
|
@ -76,9 +76,12 @@ public:
|
||||||
std::string parseKeyword(const std::string&, const std::string&, bool dynamic = false);
|
std::string parseKeyword(const std::string&, const std::string&, bool dynamic = false);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
std::deque<std::string> configPaths; // stores all the config paths
|
||||||
|
std::unordered_map<std::string, time_t> configModifyTimes; // stores modify times
|
||||||
std::unordered_map<std::string, std::string> configDynamicVars; // stores dynamic vars declared by the user
|
std::unordered_map<std::string, std::string> configDynamicVars; // stores dynamic vars declared by the user
|
||||||
std::unordered_map<std::string, SConfigValue> configValues;
|
std::unordered_map<std::string, SConfigValue> configValues;
|
||||||
time_t lastModifyTime = 0; // for reloading the config if changed
|
|
||||||
|
std::string configCurrentPath;
|
||||||
|
|
||||||
std::string currentCategory = ""; // For storing the category of the current item
|
std::string currentCategory = ""; // For storing the category of the current item
|
||||||
|
|
||||||
|
@ -108,6 +111,7 @@ private:
|
||||||
void handleDefaultWorkspace(const std::string&, const std::string&);
|
void handleDefaultWorkspace(const std::string&, const std::string&);
|
||||||
void handleBezier(const std::string&, const std::string&);
|
void handleBezier(const std::string&, const std::string&);
|
||||||
void handleAnimation(const std::string&, const std::string&);
|
void handleAnimation(const std::string&, const std::string&);
|
||||||
|
void handleSource(const std::string&, const std::string&);
|
||||||
};
|
};
|
||||||
|
|
||||||
inline std::unique_ptr<CConfigManager> g_pConfigManager;
|
inline std::unique_ptr<CConfigManager> g_pConfigManager;
|
Loading…
Reference in a new issue