summaryrefslogtreecommitdiff
path: root/src/config/ConfigManager.cpp
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-03-24 18:22:01 +0100
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-03-24 18:22:01 +0100
commitccbc0e4a2e4b1bcd9966b59edfbb0aaf6c27a52d (patch)
treeb4e80c8112416a408576d47ad7a7da2cfc4f66c9 /src/config/ConfigManager.cpp
parent8cec07c39d17472a93c383683ca5c49f0119be77 (diff)
Added window rules
Diffstat (limited to 'src/config/ConfigManager.cpp')
-rw-r--r--src/config/ConfigManager.cpp57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp
index 2a481ed2..b29edacc 100644
--- a/src/config/ConfigManager.cpp
+++ b/src/config/ConfigManager.cpp
@@ -163,6 +163,30 @@ void CConfigManager::handleBind(const std::string& command, const std::string& v
g_pKeybindManager->addKeybind(SKeybind{KEY, MOD, HANDLER, COMMAND});
}
+void CConfigManager::handleWindowRule(const std::string& command, const std::string& value) {
+ const auto RULE = value.substr(0, value.find_first_of(","));
+ const auto VALUE = value.substr(value.find_first_of(",") + 1);
+
+ // check rule and value
+ if (RULE == "" || VALUE == "") {
+ return;
+ }
+
+ // verify we support a rule
+ if (RULE != "float"
+ && RULE != "tile"
+ && RULE.find("move") != 0
+ && RULE.find("size") != 0
+ && RULE.find("monitor") != 0) {
+ Debug::log(ERR, "Invalid rule found: %s", RULE.c_str());
+ parseError = "Invalid rule found: " + RULE;
+ return;
+ }
+
+ m_dWindowRules.push_back({RULE, VALUE});
+
+}
+
void CConfigManager::handleDefaultWorkspace(const std::string& command, const std::string& value) {
const auto DISPLAY = value.substr(0, value.find_first_of(','));
@@ -230,6 +254,9 @@ void CConfigManager::parseLine(std::string& line) {
} else if (COMMAND == "workspace") {
handleDefaultWorkspace(COMMAND, VALUE);
return;
+ } else if (COMMAND == "windowrule") {
+ handleWindowRule(COMMAND, VALUE);
+ return;
}
configSetValueSafe(currentCategory + (currentCategory == "" ? "" : ":") + COMMAND, VALUE);
@@ -241,6 +268,7 @@ void CConfigManager::loadConfigLoadVars() {
currentCategory = ""; // reset the category
m_dMonitorRules.clear();
+ m_dWindowRules.clear();
g_pKeybindManager->clearKeybinds();
const char* const ENVHOME = getenv("HOME");
@@ -357,4 +385,33 @@ SMonitorRule CConfigManager::getMonitorRuleFor(std::string name) {
Debug::log(WARN, "No rules configured. Using the default hardcoded one.");
return SMonitorRule{.name = "", .resolution = Vector2D(1280, 720), .offset = Vector2D(0, 0), .mfact = 0.5f, .scale = 1};
+}
+
+std::vector<SWindowRule> CConfigManager::getMatchingRules(CWindow* pWindow) {
+ if (!g_pCompositor->windowValidMapped(pWindow))
+ return std::vector<SWindowRule>();
+
+ std::vector<SWindowRule> returns;
+
+ std::string title = g_pXWaylandManager->getTitle(pWindow);
+ std::string appidclass = g_pXWaylandManager->getAppIDClass(pWindow);
+
+ for (auto& rule : m_dWindowRules) {
+ // check if we have a matching rule
+ try {
+ std::regex classCheck(rule.szValue);
+
+ if (!std::regex_search(title, classCheck) && !std::regex_search(appidclass, classCheck))
+ continue;
+ } catch (...) {
+ Debug::log(ERR, "Regex error at %s", rule.szValue.c_str());
+ }
+
+ // applies. Read the rule and behave accordingly
+ Debug::log(LOG, "Window rule %s -> %s matched %x [%s]", rule.szRule.c_str(), rule.szValue.c_str(), pWindow, pWindow->m_szTitle.c_str());
+
+ returns.push_back(rule);
+ }
+
+ return returns;
} \ No newline at end of file