start handling monitors

This commit is contained in:
vaxerski 2022-03-17 16:56:33 +01:00
parent cf51ab71a2
commit d6c2553af2
9 changed files with 175 additions and 7 deletions

View file

@ -66,6 +66,52 @@ void CConfigManager::handleRawExec(const std::string& command, const std::string
}
}
void CConfigManager::handleMonitor(const std::string& command, const std::string& args) {
// get the monitor config
SMonitorRule newrule;
std::string curitem = "";
std::string argZ = args;
auto nextItem = [&]() {
auto idx = argZ.find_first_of(',');
if (idx != std::string::npos) {
curitem = argZ.substr(0, idx);
argZ = argZ.substr(idx + 1);
} else {
argZ = "";
curitem = argZ;
}
};
nextItem();
newrule.name = curitem;
nextItem();
newrule.resolution.x = stoi(curitem.substr(0, curitem.find_first_of('x')));
newrule.resolution.y = stoi(curitem.substr(curitem.find_first_of('x') + 1));
nextItem();
newrule.offset.x = stoi(curitem.substr(0, curitem.find_first_of('x')));
newrule.offset.y = stoi(curitem.substr(curitem.find_first_of('x') + 1));
nextItem();
newrule.mfact = stof(curitem);
nextItem();
newrule.scale = stof(curitem);
m_dMonitorRules.push_back(newrule);
}
void CConfigManager::parseLine(std::string& line) {
// first check if its not a comment
const auto COMMENTSTART = line.find_first_of('#');
@ -111,6 +157,9 @@ void CConfigManager::parseLine(std::string& line) {
handleRawExec(COMMAND, VALUE);
return;
}
} else if (COMMAND == "monitor") {
handleMonitor(COMMAND, VALUE);
return;
}
configSetValueSafe(currentCategory + (currentCategory == "" ? "" : ":") + COMMAND, VALUE);
@ -121,6 +170,8 @@ void CConfigManager::loadConfigLoadVars() {
parseError = ""; // reset the error
currentCategory = ""; // reset the category
m_dMonitorRules.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");
@ -199,3 +250,29 @@ float CConfigManager::getFloat(std::string v) {
std::string CConfigManager::getString(std::string v) {
return getConfigValueSafe(v).strValue;
}
SMonitorRule CConfigManager::getMonitorRuleFor(std::string name) {
SMonitorRule* found = nullptr;
for (auto& r : m_dMonitorRules) {
if (r.name == name) {
found = &r;
break;
}
}
if (found)
return *found;
for (auto& r : m_dMonitorRules) {
if (r.name == "") {
found = &r;
break;
}
}
if (found)
return *found;
return SMonitorRule{.name = "", .resolution = Vector2D(1280, 720), .offset = Vector2D(0, 0), .mfact = 0.5f, .scale = 1};
}

View file

@ -5,6 +5,7 @@
#include <unordered_map>
#include "../defines.hpp"
#include <vector>
#include <deque>
struct SConfigValue {
int64_t intValue = -1;
@ -12,6 +13,14 @@ struct SConfigValue {
std::string strValue = "";
};
struct SMonitorRule {
std::string name = "";
Vector2D resolution = Vector2D(1280,720);
Vector2D offset = Vector2D(0,0);
float mfact = 0.5;
float scale = 1;
};
class CConfigManager {
public:
CConfigManager();
@ -22,6 +31,8 @@ public:
float getFloat(std::string);
std::string getString(std::string);
SMonitorRule getMonitorRuleFor(std::string);
private:
std::unordered_map<std::string, SConfigValue> configValues;
time_t lastModifyTime = 0; // for reloading the config if changed
@ -32,12 +43,15 @@ private:
bool isFirstLaunch = true; // For exec-once
std::deque<SMonitorRule> m_dMonitorRules;
// internal methods
void loadConfigLoadVars();
SConfigValue getConfigValueSafe(std::string);
void parseLine(std::string&);
void configSetValueSafe(const std::string&, const std::string&);
void handleRawExec(const std::string&, const std::string&);
void handleMonitor(const std::string&, const std::string&);
};
inline std::unique_ptr<CConfigManager> g_pConfigManager;