Hyprland/src/config/ConfigManager.hpp

228 lines
8.3 KiB
C++
Raw Normal View History

2022-03-17 15:53:45 +01:00
#pragma once
2022-04-23 14:16:02 +02:00
#define CONFIG_MANAGER_H
2022-03-17 15:53:45 +01:00
#include <map>
#include "../debug/Log.hpp"
#include <unordered_map>
#include "../defines.hpp"
#include <vector>
2022-03-17 16:56:33 +01:00
#include <deque>
2022-03-24 18:22:01 +01:00
#include <algorithm>
#include <regex>
#include "../Window.hpp"
2022-03-17 15:53:45 +01:00
#include "defaultConfig.hpp"
2022-11-26 18:56:43 +01:00
#include "ConfigDataValues.hpp"
2022-05-06 14:30:35 +02:00
#define STRVAL_EMPTY "[[EMPTY]]"
2022-07-28 13:28:43 +02:00
#define INITANIMCFG(name) animationConfig[name] = {}
2022-07-28 13:34:52 +02:00
#define CREATEANIMCFG(name, parent) animationConfig[name] = {false, "", "", 0.f, -1, &animationConfig["global"], &animationConfig[parent]}
2022-07-28 13:28:43 +02:00
2022-03-17 15:53:45 +01:00
struct SConfigValue {
2022-09-30 18:03:06 +02:00
int64_t intValue = -INT64_MAX;
float floatValue = -__FLT_MAX__;
2022-03-17 15:53:45 +01:00
std::string strValue = "";
2022-09-30 18:03:06 +02:00
Vector2D vecValue = Vector2D(-__FLT_MAX__, -__FLT_MAX__);
2022-11-26 18:56:43 +01:00
std::shared_ptr<ICustomConfigValueData> data;
2022-06-30 21:38:06 +02:00
bool set = false; // used for device configs
2022-03-17 15:53:45 +01:00
};
2022-03-17 16:56:33 +01:00
struct SMonitorRule {
std::string name = "";
Vector2D resolution = Vector2D(1280,720);
Vector2D offset = Vector2D(0,0);
float scale = 1;
2022-03-19 21:46:29 +01:00
float refreshRate = 60;
std::string defaultWorkspace = "";
2022-04-17 10:19:46 +02:00
bool disabled = false;
wl_output_transform transform = WL_OUTPUT_TRANSFORM_NORMAL;
2022-09-13 15:25:42 +02:00
std::string mirrorOf = "";
2022-10-27 14:26:47 +02:00
bool enable10bit = false;
2022-03-17 16:56:33 +01:00
};
2022-04-27 17:46:07 +02:00
struct SMonitorAdditionalReservedArea {
int top = 0;
int bottom = 0;
int left = 0;
int right = 0;
};
2022-07-28 13:28:43 +02:00
struct SAnimationPropertyConfig {
bool overriden = true;
std::string internalBezier = "";
std::string internalStyle = "";
float internalSpeed = 0.f;
int internalEnabled = -1;
SAnimationPropertyConfig* pValues = nullptr;
SAnimationPropertyConfig* pParentAnimation = nullptr;
};
2022-11-10 14:39:23 +01:00
struct SExecRequestedRule {
std::string szRule = "";
uint64_t iPid = 0;
};
class CVarList {
public:
2022-11-10 14:39:23 +01:00
CVarList(const std::string& in, long unsigned int lastArgNo = 0, const char separator = ',') {
std::string curitem = "";
std::string argZ = in;
auto nextItem = [&]() {
2022-11-10 14:39:23 +01:00
auto idx = lastArgNo != 0 && m_vArgs.size() >= lastArgNo - 1 ? std::string::npos : argZ.find_first_of(separator);
if (idx != std::string::npos) {
curitem = argZ.substr(0, idx);
argZ = argZ.substr(idx + 1);
} else {
curitem = argZ;
argZ = STRVAL_EMPTY;
}
};
nextItem();
while (curitem != STRVAL_EMPTY) {
m_vArgs.push_back(removeBeginEndSpacesTabs(curitem));
nextItem();
}
};
~CVarList() = default;
2022-12-11 18:15:02 +01:00
size_t size() const {
return m_vArgs.size();
}
std::string operator[](const long unsigned int& idx) const {
if (idx >= m_vArgs.size())
return "";
return m_vArgs[idx];
}
2022-11-10 14:39:23 +01:00
// for range-based loops
std::vector<std::string>::iterator begin() { return m_vArgs.begin(); }
std::vector<std::string>::const_iterator begin() const { return m_vArgs.begin(); }
std::vector<std::string>::iterator end() { return m_vArgs.end(); }
std::vector<std::string>::const_iterator end() const { return m_vArgs.end(); }
private:
std::vector<std::string> m_vArgs;
};
2022-03-17 15:53:45 +01:00
class CConfigManager {
public:
CConfigManager();
void tick();
2022-03-17 17:08:54 +01:00
void init();
2022-03-17 15:53:45 +01:00
2022-06-30 21:26:00 +02:00
int getInt(const std::string&);
float getFloat(const std::string&);
std::string getString(const std::string&);
void setFloat(std::string, float);
void setInt(std::string, int);
void setString(std::string, std::string);
2022-03-17 15:53:45 +01:00
2022-06-30 21:26:00 +02:00
int getDeviceInt(const std::string&, const std::string&);
float getDeviceFloat(const std::string&, const std::string&);
std::string getDeviceString(const std::string&, const std::string&);
bool deviceConfigExists(const std::string&);
2022-07-06 22:12:03 +02:00
bool shouldBlurLS(const std::string&);
2022-06-30 21:26:00 +02:00
2022-04-23 14:16:02 +02:00
SConfigValue* getConfigValuePtr(std::string);
2022-08-11 21:16:38 +02:00
SConfigValue* getConfigValuePtrSafe(std::string);
2022-04-23 14:16:02 +02:00
2022-10-05 11:22:33 +02:00
SMonitorRule getMonitorRuleFor(std::string, std::string displayName = "");
2022-03-17 16:56:33 +01:00
2022-09-12 21:05:52 +02:00
CMonitor* getBoundMonitorForWS(std::string);
2022-12-09 18:17:02 +01:00
std::string getBoundMonitorStringForWS(std::string);
2022-09-12 21:05:52 +02:00
2022-03-24 18:22:01 +01:00
std::vector<SWindowRule> getMatchingRules(CWindow*);
2022-04-27 17:46:07 +02:00
std::unordered_map<std::string, SMonitorAdditionalReservedArea> m_mAdditionalReservedAreas;
2022-04-12 20:02:57 +02:00
// no-op when done.
void dispatchExecOnce();
2022-04-19 19:01:23 +02:00
void performMonitorReload();
bool m_bWantsMonitorReload = false;
2022-05-08 15:28:45 +02:00
bool m_bForceReload = false;
2022-08-14 23:26:18 +02:00
bool m_bNoMonitorReload = false;
2022-08-03 21:19:12 +02:00
void ensureDPMS();
void ensureVRR(CMonitor* pMonitor = nullptr);
2022-04-19 19:01:23 +02:00
2022-04-21 16:56:27 +02:00
std::string parseKeyword(const std::string&, const std::string&, bool dynamic = false);
void addParseError(const std::string&);
2022-07-28 13:28:43 +02:00
SAnimationPropertyConfig* getAnimationPropertyConfig(const std::string&);
2022-11-10 14:39:23 +01:00
void addExecRule(SExecRequestedRule);
2022-08-19 22:18:09 +02:00
std::string configCurrentPath;
2022-03-17 15:53:45 +01:00
private:
2022-05-16 10:09:20 +02:00
std::deque<std::string> configPaths; // stores all the config paths
std::unordered_map<std::string, time_t> configModifyTimes; // stores modify times
2022-05-16 09:38:42 +02:00
std::unordered_map<std::string, std::string> configDynamicVars; // stores dynamic vars declared by the user
2022-03-17 15:53:45 +01:00
std::unordered_map<std::string, SConfigValue> configValues;
2022-06-30 21:26:00 +02:00
std::unordered_map<std::string, std::unordered_map<std::string, SConfigValue>> deviceConfigs; // stores device configs
2022-05-16 10:09:20 +02:00
2022-07-28 13:28:43 +02:00
std::unordered_map<std::string, SAnimationPropertyConfig> animationConfig; // stores all the animations with their set values
2022-03-17 15:53:45 +01:00
std::string currentCategory = ""; // For storing the category of the current item
std::string parseError = ""; // For storing a parse error to display later
2022-06-22 20:23:20 +02:00
std::string m_szCurrentSubmap = ""; // For storing the current keybind submap
2022-09-12 21:05:52 +02:00
std::vector<std::pair<std::string, std::string>> boundWorkspaces;
2022-11-10 14:39:23 +01:00
std::vector<SExecRequestedRule> execRequestedRules; // rules requested with exec, e.g. [workspace 2] kitty
2022-03-17 15:53:45 +01:00
bool isFirstLaunch = true; // For exec-once
2022-03-17 16:56:33 +01:00
std::deque<SMonitorRule> m_dMonitorRules;
2022-03-24 18:22:01 +01:00
std::deque<SWindowRule> m_dWindowRules;
2022-07-06 22:12:03 +02:00
std::deque<std::string> m_dBlurLSNamespaces;
2022-03-17 16:56:33 +01:00
2022-04-12 20:02:57 +02:00
bool firstExecDispatched = false;
std::deque<std::string> firstExecRequests;
2022-03-17 15:53:45 +01:00
// internal methods
void setDefaultVars();
2022-07-28 13:28:43 +02:00
void setDefaultAnimationVars();
2022-06-30 21:26:00 +02:00
void setDeviceDefaultVars(const std::string&);
2022-07-28 13:28:43 +02:00
void setAnimForChildren(SAnimationPropertyConfig *const);
2022-05-16 09:38:42 +02:00
void applyUserDefinedVars(std::string&, const size_t);
2022-03-17 15:53:45 +01:00
void loadConfigLoadVars();
2022-06-30 21:26:00 +02:00
SConfigValue getConfigValueSafe(const std::string&);
SConfigValue getConfigValueSafeDevice(const std::string&, const std::string&);
2022-03-17 15:53:45 +01:00
void parseLine(std::string&);
void configSetValueSafe(const std::string&, const std::string&);
2022-06-30 21:26:00 +02:00
void handleDeviceConfig(const std::string&, const std::string&);
2022-03-17 15:53:45 +01:00
void handleRawExec(const std::string&, const std::string&);
2022-03-17 16:56:33 +01:00
void handleMonitor(const std::string&, const std::string&);
2022-07-20 22:33:43 +02:00
void handleBind(const std::string&, const std::string&);
2022-04-21 17:06:43 +02:00
void handleUnbind(const std::string&, const std::string&);
2022-03-24 18:22:01 +01:00
void handleWindowRule(const std::string&, const std::string&);
2022-09-06 11:57:11 +02:00
void handleWindowRuleV2(const std::string&, const std::string&);
2022-03-20 16:01:47 +01:00
void handleDefaultWorkspace(const std::string&, const std::string&);
2022-04-23 21:47:16 +02:00
void handleBezier(const std::string&, const std::string&);
2022-05-14 15:56:01 +02:00
void handleAnimation(const std::string&, const std::string&);
2022-05-16 10:09:20 +02:00
void handleSource(const std::string&, const std::string&);
2022-06-22 20:23:20 +02:00
void handleSubmap(const std::string&, const std::string&);
2022-07-06 22:12:03 +02:00
void handleBlurLS(const std::string&, const std::string&);
2022-09-12 21:05:52 +02:00
void handleBindWS(const std::string&, const std::string&);
2022-03-17 15:53:45 +01:00
};
2022-08-19 20:01:51 +02:00
inline std::unique_ptr<CConfigManager> g_pConfigManager;