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>
|
2023-05-01 23:28:27 +02:00
|
|
|
#include <optional>
|
2023-10-29 17:59:50 +01:00
|
|
|
#include <functional>
|
2023-05-09 15:01:45 +02:00
|
|
|
#include <xf86drmMode.h>
|
2022-03-24 18:22:01 +01:00
|
|
|
#include "../Window.hpp"
|
2023-01-25 16:34:13 +01:00
|
|
|
#include "../helpers/WLClasses.hpp"
|
2023-08-11 17:37:52 +02:00
|
|
|
#include "../helpers/Monitor.hpp"
|
2023-09-12 17:46:22 +02:00
|
|
|
#include "../helpers/VarList.hpp"
|
2022-03-17 15:53:45 +01:00
|
|
|
|
2022-04-08 22:07:40 +02:00
|
|
|
#include "defaultConfig.hpp"
|
2022-11-26 18:56:43 +01:00
|
|
|
#include "ConfigDataValues.hpp"
|
2022-04-08 22:07:40 +02:00
|
|
|
|
2024-02-18 16:00:34 +01:00
|
|
|
#include <hyprlang.hpp>
|
|
|
|
|
2022-12-16 18:17:31 +01: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
|
|
|
|
2023-02-27 13:32:38 +01:00
|
|
|
#define HANDLE void*
|
|
|
|
|
2023-05-01 23:28:27 +02:00
|
|
|
struct SWorkspaceRule {
|
2023-12-11 23:58:40 +01:00
|
|
|
std::string monitor = "";
|
|
|
|
std::string workspaceString = "";
|
|
|
|
std::string workspaceName = "";
|
|
|
|
int workspaceId = -1;
|
|
|
|
bool isDefault = false;
|
|
|
|
bool isPersistent = false;
|
2024-02-21 12:07:39 +01:00
|
|
|
std::optional<CCssGapData> gapsIn;
|
|
|
|
std::optional<CCssGapData> gapsOut;
|
2023-12-11 23:58:40 +01:00
|
|
|
std::optional<int64_t> borderSize;
|
|
|
|
std::optional<int> border;
|
|
|
|
std::optional<int> rounding;
|
|
|
|
std::optional<int> decorate;
|
|
|
|
std::optional<int> shadow;
|
|
|
|
std::optional<std::string> onCreatedEmptyRunCmd;
|
|
|
|
std::map<std::string, std::string> layoutopts;
|
2023-05-01 23:28:27 +02:00
|
|
|
};
|
|
|
|
|
2022-04-27 17:46:07 +02:00
|
|
|
struct SMonitorAdditionalReservedArea {
|
2022-12-16 18:17:31 +01:00
|
|
|
int top = 0;
|
|
|
|
int bottom = 0;
|
|
|
|
int left = 0;
|
|
|
|
int right = 0;
|
2022-04-27 17:46:07 +02:00
|
|
|
};
|
|
|
|
|
2022-07-28 13:28:43 +02:00
|
|
|
struct SAnimationPropertyConfig {
|
2023-03-30 00:44:25 +02:00
|
|
|
bool overridden = true;
|
2022-07-28 13:28:43 +02:00
|
|
|
|
2022-12-16 18:17:31 +01:00
|
|
|
std::string internalBezier = "";
|
|
|
|
std::string internalStyle = "";
|
|
|
|
float internalSpeed = 0.f;
|
|
|
|
int internalEnabled = -1;
|
2022-07-28 13:28:43 +02:00
|
|
|
|
2022-12-16 18:17:31 +01:00
|
|
|
SAnimationPropertyConfig* pValues = nullptr;
|
2022-07-28 13:28:43 +02:00
|
|
|
SAnimationPropertyConfig* pParentAnimation = nullptr;
|
|
|
|
};
|
|
|
|
|
2023-10-29 17:59:50 +01:00
|
|
|
struct SPluginKeyword {
|
2024-02-18 16:00:34 +01:00
|
|
|
HANDLE handle = 0;
|
|
|
|
std::string name = "";
|
|
|
|
Hyprlang::PCONFIGHANDLERFUNC fn = nullptr;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct SPluginVariable {
|
|
|
|
HANDLE handle = 0;
|
|
|
|
std::string name = "";
|
2023-10-29 17:59:50 +01:00
|
|
|
};
|
|
|
|
|
2022-11-10 14:39:23 +01:00
|
|
|
struct SExecRequestedRule {
|
2022-12-16 18:17:31 +01:00
|
|
|
std::string szRule = "";
|
|
|
|
uint64_t iPid = 0;
|
2022-11-10 14:39:23 +01:00
|
|
|
};
|
|
|
|
|
2022-03-17 15:53:45 +01:00
|
|
|
class CConfigManager {
|
2022-12-16 18:17:31 +01:00
|
|
|
public:
|
2022-03-17 15:53:45 +01:00
|
|
|
CConfigManager();
|
|
|
|
|
2022-12-16 18:17:31 +01:00
|
|
|
void tick();
|
|
|
|
void init();
|
2022-03-17 15:53:45 +01:00
|
|
|
|
2023-09-06 16:14:18 +02:00
|
|
|
int getDeviceInt(const std::string&, const std::string&, const std::string& fallback = "");
|
|
|
|
float getDeviceFloat(const std::string&, const std::string&, const std::string& fallback = "");
|
2023-09-27 20:49:30 +02:00
|
|
|
Vector2D getDeviceVec(const std::string&, const std::string&, const std::string& fallback = "");
|
2023-09-06 16:14:18 +02:00
|
|
|
std::string getDeviceString(const std::string&, const std::string&, const std::string& fallback = "");
|
2022-12-16 18:17:31 +01:00
|
|
|
bool deviceConfigExists(const std::string&);
|
2024-02-18 16:00:34 +01:00
|
|
|
Hyprlang::CConfigValue* getConfigValueSafeDevice(const std::string& dev, const std::string& val, const std::string& fallback);
|
2022-12-16 18:17:31 +01:00
|
|
|
bool shouldBlurLS(const std::string&);
|
2022-06-30 21:26:00 +02:00
|
|
|
|
2024-02-18 16:00:34 +01:00
|
|
|
void* const* getConfigValuePtr(const std::string&);
|
|
|
|
Hyprlang::CConfigValue* getHyprlangConfigValuePtr(const std::string& name, const std::string& specialCat = "");
|
|
|
|
void onPluginLoadUnload(const std::string& name, bool load);
|
2023-07-07 19:19:35 +02:00
|
|
|
static std::string getConfigDir();
|
|
|
|
static std::string getMainConfigPath();
|
2022-04-23 14:16:02 +02:00
|
|
|
|
2022-12-16 18:17:31 +01:00
|
|
|
SMonitorRule getMonitorRuleFor(const std::string&, const std::string& displayName = "");
|
2023-05-01 23:28:27 +02:00
|
|
|
SWorkspaceRule getWorkspaceRuleFor(CWorkspace*);
|
2023-03-18 17:12:43 +01:00
|
|
|
std::string getDefaultWorkspaceFor(const std::string&);
|
2022-03-17 16:56:33 +01:00
|
|
|
|
2022-12-16 18:17:31 +01:00
|
|
|
CMonitor* getBoundMonitorForWS(const std::string&);
|
|
|
|
std::string getBoundMonitorStringForWS(const std::string&);
|
2023-05-08 15:37:59 +02:00
|
|
|
const std::deque<SWorkspaceRule>& getAllWorkspaceRules();
|
2022-09-12 21:05:52 +02:00
|
|
|
|
2024-02-18 01:13:38 +01:00
|
|
|
std::vector<SWindowRule> getMatchingRules(CWindow*, bool dynamic = true);
|
2023-01-25 16:34:13 +01:00
|
|
|
std::vector<SLayerRule> getMatchingRules(SLayerSurface*);
|
2022-03-24 18:22:01 +01:00
|
|
|
|
2022-04-27 17:46:07 +02:00
|
|
|
std::unordered_map<std::string, SMonitorAdditionalReservedArea> m_mAdditionalReservedAreas;
|
|
|
|
|
2023-01-25 16:16:28 +01:00
|
|
|
std::unordered_map<std::string, SAnimationPropertyConfig> getAnimationConfig();
|
|
|
|
|
2024-02-18 16:00:34 +01:00
|
|
|
void addPluginConfigVar(HANDLE handle, const std::string& name, const Hyprlang::CConfigValue& value);
|
|
|
|
void addPluginKeyword(HANDLE handle, const std::string& name, Hyprlang::PCONFIGHANDLERFUNC fun, Hyprlang::SHandlerOptions opts = {});
|
2023-10-29 17:59:50 +01:00
|
|
|
void removePluginConfig(HANDLE handle);
|
2023-02-27 13:32:38 +01:00
|
|
|
|
2022-04-12 20:02:57 +02:00
|
|
|
// no-op when done.
|
2022-12-16 18:17:31 +01:00
|
|
|
void dispatchExecOnce();
|
2022-04-12 20:02:57 +02:00
|
|
|
|
2022-12-16 18:17:31 +01:00
|
|
|
void performMonitorReload();
|
|
|
|
bool m_bWantsMonitorReload = false;
|
|
|
|
bool m_bForceReload = false;
|
|
|
|
bool m_bNoMonitorReload = false;
|
2023-04-03 23:52:09 +02:00
|
|
|
void ensureMonitorStatus();
|
2022-12-16 18:17:31 +01:00
|
|
|
void ensureVRR(CMonitor* pMonitor = nullptr);
|
2022-04-19 19:01:23 +02:00
|
|
|
|
2024-02-18 16:00:34 +01:00
|
|
|
std::string parseKeyword(const std::string&, const std::string&);
|
2022-04-21 16:56:27 +02:00
|
|
|
|
2022-12-16 18:17:31 +01:00
|
|
|
void addParseError(const std::string&);
|
2022-08-09 18:13:13 +02:00
|
|
|
|
2022-07-28 13:28:43 +02:00
|
|
|
SAnimationPropertyConfig* getAnimationPropertyConfig(const std::string&);
|
|
|
|
|
2022-12-16 18:17:31 +01:00
|
|
|
void addExecRule(const SExecRequestedRule&);
|
2022-11-10 14:39:23 +01:00
|
|
|
|
2023-05-01 16:10:53 +02:00
|
|
|
void handlePluginLoads();
|
|
|
|
|
2024-02-18 16:00:34 +01:00
|
|
|
// keywords
|
|
|
|
std::optional<std::string> handleRawExec(const std::string&, const std::string&);
|
|
|
|
std::optional<std::string> handleExecOnce(const std::string&, const std::string&);
|
|
|
|
std::optional<std::string> handleMonitor(const std::string&, const std::string&);
|
|
|
|
std::optional<std::string> handleBind(const std::string&, const std::string&);
|
|
|
|
std::optional<std::string> handleUnbind(const std::string&, const std::string&);
|
|
|
|
std::optional<std::string> handleWindowRule(const std::string&, const std::string&);
|
|
|
|
std::optional<std::string> handleLayerRule(const std::string&, const std::string&);
|
|
|
|
std::optional<std::string> handleWindowRuleV2(const std::string&, const std::string&);
|
|
|
|
std::optional<std::string> handleWorkspaceRules(const std::string&, const std::string&);
|
|
|
|
std::optional<std::string> handleBezier(const std::string&, const std::string&);
|
|
|
|
std::optional<std::string> handleAnimation(const std::string&, const std::string&);
|
|
|
|
std::optional<std::string> handleSource(const std::string&, const std::string&);
|
|
|
|
std::optional<std::string> handleSubmap(const std::string&, const std::string&);
|
|
|
|
std::optional<std::string> handleBlurLS(const std::string&, const std::string&);
|
|
|
|
std::optional<std::string> handleBindWS(const std::string&, const std::string&);
|
|
|
|
std::optional<std::string> handleEnv(const std::string&, const std::string&);
|
|
|
|
std::optional<std::string> handlePlugin(const std::string&, const std::string&);
|
|
|
|
|
|
|
|
std::string configCurrentPath;
|
2022-08-19 22:18:09 +02:00
|
|
|
|
2022-12-16 18:17:31 +01:00
|
|
|
private:
|
2024-02-18 16:00:34 +01:00
|
|
|
std::unique_ptr<Hyprlang::CConfig> m_pConfig;
|
2022-07-28 13:28:43 +02:00
|
|
|
|
2024-02-18 16:00:34 +01:00
|
|
|
std::deque<std::string> configPaths; // stores all the config paths
|
|
|
|
std::unordered_map<std::string, time_t> configModifyTimes; // stores modify times
|
2022-03-17 15:53:45 +01:00
|
|
|
|
2024-02-18 16:00:34 +01:00
|
|
|
std::unordered_map<std::string, SAnimationPropertyConfig> animationConfig; // stores all the animations with their set values
|
2022-03-17 15:53:45 +01:00
|
|
|
|
2024-02-18 16:00:34 +01:00
|
|
|
std::string m_szCurrentSubmap = ""; // For storing the current keybind submap
|
2022-09-12 21:05:52 +02:00
|
|
|
|
2024-02-18 16:00:34 +01:00
|
|
|
std::vector<SExecRequestedRule> execRequestedRules; // rules requested with exec, e.g. [workspace 2] kitty
|
2022-11-10 14:39:23 +01:00
|
|
|
|
2024-02-18 16:00:34 +01:00
|
|
|
std::vector<std::string> m_vDeclaredPlugins;
|
|
|
|
std::vector<SPluginKeyword> pluginKeywords;
|
|
|
|
std::vector<SPluginVariable> pluginVariables;
|
2022-03-17 15:53:45 +01:00
|
|
|
|
2024-02-18 16:00:34 +01:00
|
|
|
bool isFirstLaunch = true; // For exec-once
|
2022-03-17 16:56:33 +01:00
|
|
|
|
2024-02-18 16:00:34 +01:00
|
|
|
std::deque<SMonitorRule> m_dMonitorRules;
|
|
|
|
std::deque<SWorkspaceRule> m_dWorkspaceRules;
|
|
|
|
std::deque<SWindowRule> m_dWindowRules;
|
|
|
|
std::deque<SLayerRule> m_dLayerRules;
|
|
|
|
std::deque<std::string> m_dBlurLSNamespaces;
|
2022-04-12 20:02:57 +02:00
|
|
|
|
2024-02-18 16:00:34 +01:00
|
|
|
bool firstExecDispatched = false;
|
|
|
|
bool m_bManualCrashInitiated = false;
|
|
|
|
std::deque<std::string> firstExecRequests;
|
2023-03-05 15:54:26 +01:00
|
|
|
|
2024-02-18 16:00:34 +01:00
|
|
|
std::vector<std::pair<std::string, std::string>> m_vFailedPluginConfigValues; // for plugin values of unloaded plugins
|
2023-07-10 14:13:23 +02:00
|
|
|
|
2022-03-17 15:53:45 +01:00
|
|
|
// internal methods
|
2024-02-18 16:00:34 +01:00
|
|
|
void setAnimForChildren(SAnimationPropertyConfig* const);
|
|
|
|
void updateBlurredLS(const std::string&, const bool);
|
|
|
|
void setDefaultAnimationVars();
|
|
|
|
std::optional<std::string> resetHLConfig();
|
|
|
|
std::optional<std::string> verifyConfigExists();
|
|
|
|
void postConfigReload(const Hyprlang::CParseResult& result);
|
|
|
|
void reload();
|
2022-03-17 15:53:45 +01:00
|
|
|
};
|
|
|
|
|
2022-08-19 20:01:51 +02:00
|
|
|
inline std::unique_ptr<CConfigManager> g_pConfigManager;
|