aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorthejch <[email protected]>2024-03-30 17:49:53 -0700
committerGitHub <[email protected]>2024-03-31 00:49:53 +0000
commit5e8c25d498ed5cb7852ae74a876b0c138a62d59d (patch)
tree904e8d5f5c9fa10e540b02d229f0f3a83f3dfc0a
parent1aed45f61d2dd48943a63cabf7bd77c19a59cf62 (diff)
downloadHyprland-5e8c25d498ed5cb7852ae74a876b0c138a62d59d.tar.gz
Hyprland-5e8c25d498ed5cb7852ae74a876b0c138a62d59d.zip
core: match all workspace rules instead of the first one only (#5340)
-rw-r--r--src/Compositor.cpp15
-rw-r--r--src/config/ConfigManager.cpp12
-rw-r--r--src/config/ConfigManager.hpp2
-rw-r--r--src/desktop/Window.cpp29
-rw-r--r--src/desktop/Workspace.cpp8
-rw-r--r--src/layout/DwindleLayout.cpp25
-rw-r--r--src/layout/MasterLayout.cpp38
7 files changed, 91 insertions, 38 deletions
diff --git a/src/Compositor.cpp b/src/Compositor.cpp
index 30e769e3..3ac9a73f 100644
--- a/src/Compositor.cpp
+++ b/src/Compositor.cpp
@@ -1260,8 +1260,13 @@ void CCompositor::sanityCheckWorkspaces() {
auto it = m_vWorkspaces.begin();
while (it != m_vWorkspaces.end()) {
- const auto WORKSPACERULE = g_pConfigManager->getWorkspaceRuleFor(it->get());
- if (WORKSPACERULE.isPersistent) {
+ const auto WORKSPACERULES = g_pConfigManager->getWorkspaceRulesFor(it->get());
+ bool isPersistent = false;
+ for (auto& wsRule : WORKSPACERULES) {
+ if (wsRule.isPersistent)
+ isPersistent = true;
+ }
+ if (isPersistent) {
++it;
continue;
}
@@ -1288,8 +1293,10 @@ void CCompositor::sanityCheckWorkspaces() {
continue;
}
if (!WORKSPACE->m_bOnCreatedEmptyExecuted) {
- if (auto cmd = WORKSPACERULE.onCreatedEmptyRunCmd)
- g_pKeybindManager->spawn(*cmd);
+ for (auto& wsRule : WORKSPACERULES) {
+ if (auto cmd = wsRule.onCreatedEmptyRunCmd)
+ g_pKeybindManager->spawn(*cmd);
+ }
WORKSPACE->m_bOnCreatedEmptyExecuted = true;
}
diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp
index 1229e80b..df2006ae 100644
--- a/src/config/ConfigManager.cpp
+++ b/src/config/ConfigManager.cpp
@@ -956,11 +956,13 @@ SMonitorRule CConfigManager::getMonitorRuleFor(const CMonitor& PMONITOR) {
return SMonitorRule{.name = "", .resolution = Vector2D(0, 0), .offset = Vector2D(-INT32_MAX, -INT32_MAX), .scale = -1}; // 0, 0 is preferred and -1, -1 is auto
}
-SWorkspaceRule CConfigManager::getWorkspaceRuleFor(CWorkspace* pWorkspace) {
- const auto IT = std::find_if(m_dWorkspaceRules.begin(), m_dWorkspaceRules.end(), [&](const auto& other) { return pWorkspace->matchesStaticSelector(other.workspaceString); });
- if (IT == m_dWorkspaceRules.end())
- return SWorkspaceRule{};
- return *IT;
+std::vector<SWorkspaceRule> CConfigManager::getWorkspaceRulesFor(CWorkspace* pWorkspace) {
+ std::vector<SWorkspaceRule> results;
+ for (auto& rule : m_dWorkspaceRules) {
+ if (pWorkspace->matchesStaticSelector(rule.workspaceString))
+ results.push_back(rule);
+ }
+ return results;
}
std::vector<SWindowRule> CConfigManager::getMatchingRules(CWindow* pWindow, bool dynamic, bool shadowExec) {
diff --git a/src/config/ConfigManager.hpp b/src/config/ConfigManager.hpp
index 9fd1e097..5406d853 100644
--- a/src/config/ConfigManager.hpp
+++ b/src/config/ConfigManager.hpp
@@ -105,7 +105,7 @@ class CConfigManager {
static std::string getMainConfigPath();
SMonitorRule getMonitorRuleFor(const CMonitor&);
- SWorkspaceRule getWorkspaceRuleFor(CWorkspace*);
+ std::vector<SWorkspaceRule> getWorkspaceRulesFor(CWorkspace*);
std::string getDefaultWorkspaceFor(const std::string&);
CMonitor* getBoundMonitorForWS(const std::string&);
diff --git a/src/desktop/Window.cpp b/src/desktop/Window.cpp
index 81c77455..1336456a 100644
--- a/src/desktop/Window.cpp
+++ b/src/desktop/Window.cpp
@@ -1088,20 +1088,33 @@ float CWindow::rounding() {
}
void CWindow::updateSpecialRenderData() {
- const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(m_iWorkspaceID);
- const auto WORKSPACERULE = PWORKSPACE ? g_pConfigManager->getWorkspaceRuleFor(PWORKSPACE) : SWorkspaceRule{};
- bool border = true;
+ const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(m_iWorkspaceID);
+ const auto WORKSPACERULES = PWORKSPACE ? g_pConfigManager->getWorkspaceRulesFor(PWORKSPACE) : std::vector<SWorkspaceRule>{};
+ bool border = true;
static auto PNOBORDERONFLOATING = CConfigValue<Hyprlang::INT>("general:no_border_on_floating");
if (m_bIsFloating && *PNOBORDERONFLOATING == 1)
border = false;
- m_sSpecialRenderData.border = WORKSPACERULE.border.value_or(border);
- m_sSpecialRenderData.borderSize = WORKSPACERULE.borderSize.value_or(-1);
- m_sSpecialRenderData.decorate = WORKSPACERULE.decorate.value_or(true);
- m_sSpecialRenderData.rounding = WORKSPACERULE.rounding.value_or(true);
- m_sSpecialRenderData.shadow = WORKSPACERULE.shadow.value_or(true);
+ m_sSpecialRenderData.border = border;
+ m_sSpecialRenderData.borderSize = -1;
+ m_sSpecialRenderData.decorate = true;
+ m_sSpecialRenderData.rounding = true;
+ m_sSpecialRenderData.shadow = true;
+
+ for (auto& wsRule : WORKSPACERULES) {
+ if (wsRule.border.has_value())
+ m_sSpecialRenderData.border = wsRule.border.value();
+ if (wsRule.borderSize.has_value())
+ m_sSpecialRenderData.borderSize = wsRule.borderSize.value();
+ if (wsRule.decorate.has_value())
+ m_sSpecialRenderData.decorate = wsRule.decorate.value();
+ if (wsRule.rounding.has_value())
+ m_sSpecialRenderData.rounding = wsRule.rounding.value();
+ if (wsRule.shadow.has_value())
+ m_sSpecialRenderData.shadow = wsRule.shadow.value();
+ }
}
int CWindow::getRealBorderSize() {
diff --git a/src/desktop/Workspace.cpp b/src/desktop/Workspace.cpp
index 440afc56..05843b59 100644
--- a/src/desktop/Workspace.cpp
+++ b/src/desktop/Workspace.cpp
@@ -24,9 +24,11 @@ CWorkspace::CWorkspace(int id, int monitorID, std::string name, bool special) {
m_vRenderOffset.registerVar();
m_fAlpha.registerVar();
- const auto RULEFORTHIS = g_pConfigManager->getWorkspaceRuleFor(this);
- if (RULEFORTHIS.defaultName.has_value())
- m_szName = RULEFORTHIS.defaultName.value();
+ const auto RULESFORTHIS = g_pConfigManager->getWorkspaceRulesFor(this);
+ for (auto& rule : RULESFORTHIS) {
+ if (rule.defaultName.has_value())
+ m_szName = rule.defaultName.value();
+ }
g_pEventManager->postEvent({"createworkspace", m_szName});
g_pEventManager->postEvent({"createworkspacev2", std::format("{},{}", m_iID, m_szName)});
diff --git a/src/layout/DwindleLayout.cpp b/src/layout/DwindleLayout.cpp
index fe8847ed..93f60e3f 100644
--- a/src/layout/DwindleLayout.cpp
+++ b/src/layout/DwindleLayout.cpp
@@ -128,7 +128,7 @@ void CHyprDwindleLayout::applyNodeDataToWindow(SDwindleNodeData* pNode, bool for
const auto PWINDOW = pNode->pWindow;
// get specific gaps and rules for this workspace,
// if user specified them in config
- const auto WORKSPACERULE = g_pConfigManager->getWorkspaceRuleFor(g_pCompositor->getWorkspaceByID(pNode->workspaceID));
+ const auto WORKSPACERULES = g_pConfigManager->getWorkspaceRulesFor(g_pCompositor->getWorkspaceByID(pNode->workspaceID));
if (!g_pCompositor->windowExists(PWINDOW)) {
Debug::log(ERR, "Node {} holding invalid {}!!", pNode, PWINDOW);
@@ -147,10 +147,16 @@ void CHyprDwindleLayout::applyNodeDataToWindow(SDwindleNodeData* pNode, bool for
auto* const PGAPSIN = (CCssGapData*)(PGAPSINDATA.ptr())->getData();
auto* const PGAPSOUT = (CCssGapData*)(PGAPSOUTDATA.ptr())->getData();
- auto gapsIn = WORKSPACERULE.gapsIn.value_or(*PGAPSIN);
- auto gapsOut = WORKSPACERULE.gapsOut.value_or(*PGAPSOUT);
+ auto gapsIn = *PGAPSIN;
+ auto gapsOut = *PGAPSOUT;
+ for (auto& wsRule : WORKSPACERULES) {
+ if (wsRule.gapsIn.has_value())
+ gapsIn = wsRule.gapsIn.value();
+ if (wsRule.gapsOut.has_value())
+ gapsOut = wsRule.gapsOut.value();
+ }
- CBox nodeBox = pNode->box;
+ CBox nodeBox = pNode->box;
nodeBox.round();
PWINDOW->m_vSize = nodeBox.size();
@@ -161,10 +167,17 @@ void CHyprDwindleLayout::applyNodeDataToWindow(SDwindleNodeData* pNode, bool for
if (*PNOGAPSWHENONLY && !g_pCompositor->isWorkspaceSpecial(PWINDOW->m_iWorkspaceID) &&
(NODESONWORKSPACE == 1 || (PWINDOW->m_bIsFullscreen && g_pCompositor->getWorkspaceByID(PWINDOW->m_iWorkspaceID)->m_efFullscreenMode == FULLSCREEN_MAXIMIZED))) {
- PWINDOW->m_sSpecialRenderData.border = WORKSPACERULE.border.value_or(*PNOGAPSWHENONLY == 2);
- PWINDOW->m_sSpecialRenderData.decorate = WORKSPACERULE.decorate.value_or(true);
PWINDOW->m_sSpecialRenderData.rounding = false;
PWINDOW->m_sSpecialRenderData.shadow = false;
+ PWINDOW->m_sSpecialRenderData.border = (*PNOGAPSWHENONLY == 2);
+ PWINDOW->m_sSpecialRenderData.decorate = true;
+
+ for (auto& wsRule : WORKSPACERULES) {
+ if (wsRule.border.has_value())
+ PWINDOW->m_sSpecialRenderData.border = wsRule.border.value();
+ if (wsRule.decorate.has_value())
+ PWINDOW->m_sSpecialRenderData.decorate = wsRule.decorate.value();
+ }
PWINDOW->updateWindowDecos();
diff --git a/src/layout/MasterLayout.cpp b/src/layout/MasterLayout.cpp
index ea54b0e2..9c49197e 100644
--- a/src/layout/MasterLayout.cpp
+++ b/src/layout/MasterLayout.cpp
@@ -41,14 +41,17 @@ SMasterWorkspaceData* CHyprMasterLayout::getMasterWorkspaceData(const int& ws) {
}
//create on the fly if it doesn't exist yet
- const auto PWORKSPACEDATA = &m_lMasterWorkspacesData.emplace_back();
- PWORKSPACEDATA->workspaceID = ws;
- static auto PORIENTATION = CConfigValue<std::string>("master:orientation");
- const auto layoutoptsForWs = g_pConfigManager->getWorkspaceRuleFor(g_pCompositor->getWorkspaceByID(ws)).layoutopts;
+ const auto PWORKSPACEDATA = &m_lMasterWorkspacesData.emplace_back();
+ PWORKSPACEDATA->workspaceID = ws;
+ static auto PORIENTATION = CConfigValue<std::string>("master:orientation");
+ const auto WORKSPACERULES = g_pConfigManager->getWorkspaceRulesFor(g_pCompositor->getWorkspaceByID(ws));
+
std::string orientationForWs = *PORIENTATION;
- if (layoutoptsForWs.contains("orientation"))
- orientationForWs = layoutoptsForWs.at("orientation");
+ for (auto& wsRule : WORKSPACERULES) {
+ if (wsRule.layoutopts.contains("orientation"))
+ orientationForWs = wsRule.layoutopts.at("orientation");
+ }
if (orientationForWs == "top") {
PWORKSPACEDATA->orientation = ORIENTATION_TOP;
@@ -626,7 +629,7 @@ void CHyprMasterLayout::applyNodeDataToWindow(SMasterNodeData* pNode) {
const auto PWINDOW = pNode->pWindow;
// get specific gaps and rules for this workspace,
// if user specified them in config
- const auto WORKSPACERULE = g_pConfigManager->getWorkspaceRuleFor(g_pCompositor->getWorkspaceByID(PWINDOW->m_iWorkspaceID));
+ const auto WORKSPACERULES = g_pConfigManager->getWorkspaceRulesFor(g_pCompositor->getWorkspaceByID(PWINDOW->m_iWorkspaceID));
if (PWINDOW->m_bIsFullscreen && !pNode->ignoreFullscreenChecks)
return;
@@ -640,8 +643,14 @@ void CHyprMasterLayout::applyNodeDataToWindow(SMasterNodeData* pNode) {
auto* PGAPSIN = (CCssGapData*)(PGAPSINDATA.ptr())->getData();
auto* PGAPSOUT = (CCssGapData*)(PGAPSOUTDATA.ptr())->getData();
- auto gapsIn = WORKSPACERULE.gapsIn.value_or(*PGAPSIN);
- auto gapsOut = WORKSPACERULE.gapsOut.value_or(*PGAPSOUT);
+ auto gapsIn = *PGAPSIN;
+ auto gapsOut = *PGAPSOUT;
+ for (auto& wsRule : WORKSPACERULES) {
+ if (wsRule.gapsIn.has_value())
+ gapsIn = wsRule.gapsIn.value();
+ if (wsRule.gapsOut.has_value())
+ gapsOut = wsRule.gapsOut.value();
+ }
if (!g_pCompositor->windowValidMapped(PWINDOW)) {
Debug::log(ERR, "Node {} holding invalid {}!!", pNode, PWINDOW);
@@ -655,10 +664,17 @@ void CHyprMasterLayout::applyNodeDataToWindow(SMasterNodeData* pNode) {
(getNodesOnWorkspace(PWINDOW->m_iWorkspaceID) == 1 ||
(PWINDOW->m_bIsFullscreen && g_pCompositor->getWorkspaceByID(PWINDOW->m_iWorkspaceID)->m_efFullscreenMode == FULLSCREEN_MAXIMIZED))) {
- PWINDOW->m_sSpecialRenderData.border = WORKSPACERULE.border.value_or(*PNOGAPSWHENONLY == 2);
- PWINDOW->m_sSpecialRenderData.decorate = WORKSPACERULE.decorate.value_or(true);
PWINDOW->m_sSpecialRenderData.rounding = false;
PWINDOW->m_sSpecialRenderData.shadow = false;
+ PWINDOW->m_sSpecialRenderData.border = (*PNOGAPSWHENONLY == 2);
+ PWINDOW->m_sSpecialRenderData.decorate = true;
+
+ for (auto& wsRule : WORKSPACERULES) {
+ if (wsRule.border.has_value())
+ PWINDOW->m_sSpecialRenderData.border = wsRule.border.value();
+ if (wsRule.decorate.has_value())
+ PWINDOW->m_sSpecialRenderData.decorate = wsRule.decorate.value();
+ }
PWINDOW->updateWindowDecos();