diff --git a/src/Compositor.cpp b/src/Compositor.cpp index bd9c73a0..5c1092ec 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -1257,13 +1257,8 @@ void CCompositor::sanityCheckWorkspaces() { auto it = m_vWorkspaces.begin(); while (it != m_vWorkspaces.end()) { - const auto WORKSPACERULES = g_pConfigManager->getWorkspaceRulesFor(*it); - bool isPersistent = false; - for (auto& wsRule : WORKSPACERULES) { - if (wsRule.isPersistent) - isPersistent = true; - } - if (isPersistent) { + const auto WORKSPACERULE = g_pConfigManager->getWorkspaceRuleFor(*it); + if (WORKSPACERULE.isPersistent) { ++it; continue; } @@ -1291,10 +1286,8 @@ void CCompositor::sanityCheckWorkspaces() { continue; } if (!WORKSPACE->m_bOnCreatedEmptyExecuted) { - for (auto& wsRule : WORKSPACERULES) { - if (auto cmd = wsRule.onCreatedEmptyRunCmd) - g_pKeybindManager->spawn(*cmd); - } + if (auto cmd = WORKSPACERULE.onCreatedEmptyRunCmd) + g_pKeybindManager->spawn(*cmd); WORKSPACE->m_bOnCreatedEmptyExecuted = true; } diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index edbfa2b3..a622e6d0 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -965,13 +965,43 @@ 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 } -std::vector CConfigManager::getWorkspaceRulesFor(PHLWORKSPACE pWorkspace) { - std::vector results; +SWorkspaceRule CConfigManager::getWorkspaceRuleFor(PHLWORKSPACE pWorkspace) { + SWorkspaceRule mergedRule{}; for (auto& rule : m_dWorkspaceRules) { - if (pWorkspace->matchesStaticSelector(rule.workspaceString)) - results.push_back(rule); + if (!pWorkspace->matchesStaticSelector(rule.workspaceString)) + continue; + + if (rule.isDefault) + mergedRule.isDefault = true; + if (rule.isPersistent) + mergedRule.isPersistent = true; + if (rule.gapsIn.has_value()) + mergedRule.gapsIn = rule.gapsIn; + if (rule.gapsOut.has_value()) + mergedRule.gapsOut = rule.gapsOut; + if (rule.borderSize.has_value()) + mergedRule.borderSize = rule.borderSize; + if (rule.border.has_value()) + mergedRule.border = rule.border; + if (rule.rounding.has_value()) + mergedRule.rounding = rule.rounding; + if (rule.decorate.has_value()) + mergedRule.decorate = rule.decorate; + if (rule.shadow.has_value()) + mergedRule.shadow = rule.shadow; + if (rule.onCreatedEmptyRunCmd.has_value()) + mergedRule.onCreatedEmptyRunCmd = rule.onCreatedEmptyRunCmd; + if (rule.defaultName.has_value()) + mergedRule.defaultName = rule.defaultName; + + if (!rule.layoutopts.empty()) { + for (const auto& layoutopt : rule.layoutopts) { + mergedRule.layoutopts[layoutopt.first] = layoutopt.second; + } + } } - return results; + + return mergedRule; } std::vector CConfigManager::getMatchingRules(CWindow* pWindow, bool dynamic, bool shadowExec) { diff --git a/src/config/ConfigManager.hpp b/src/config/ConfigManager.hpp index 2ef94ca7..63b0ae2d 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&); - std::vector getWorkspaceRulesFor(PHLWORKSPACE workspace); + SWorkspaceRule getWorkspaceRuleFor(PHLWORKSPACE workspace); std::string getDefaultWorkspaceFor(const std::string&); CMonitor* getBoundMonitorForWS(const std::string&); diff --git a/src/desktop/Window.cpp b/src/desktop/Window.cpp index ed550655..75f1f4a9 100644 --- a/src/desktop/Window.cpp +++ b/src/desktop/Window.cpp @@ -1088,33 +1088,20 @@ float CWindow::rounding() { } void CWindow::updateSpecialRenderData() { - const auto PWORKSPACE = m_pWorkspace; - const auto WORKSPACERULES = PWORKSPACE ? g_pConfigManager->getWorkspaceRulesFor(PWORKSPACE) : std::vector{}; - bool border = true; + const auto PWORKSPACE = m_pWorkspace; + const auto WORKSPACERULE = PWORKSPACE ? g_pConfigManager->getWorkspaceRuleFor(PWORKSPACE) : SWorkspaceRule{}; + bool border = true; static auto PNOBORDERONFLOATING = CConfigValue("general:no_border_on_floating"); if (m_bIsFloating && *PNOBORDERONFLOATING == 1) border = false; - 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(); - } + 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); } int CWindow::getRealBorderSize() { diff --git a/src/desktop/Workspace.cpp b/src/desktop/Workspace.cpp index 1df18c3b..cb27242f 100644 --- a/src/desktop/Workspace.cpp +++ b/src/desktop/Workspace.cpp @@ -28,11 +28,9 @@ void CWorkspace::init(PHLWORKSPACE self) { m_vRenderOffset.registerVar(); m_fAlpha.registerVar(); - const auto RULESFORTHIS = g_pConfigManager->getWorkspaceRulesFor(self); - for (auto& rule : RULESFORTHIS) { - if (rule.defaultName.has_value()) - m_szName = rule.defaultName.value(); - } + const auto RULEFORTHIS = g_pConfigManager->getWorkspaceRuleFor(self); + if (RULEFORTHIS.defaultName.has_value()) + m_szName = RULEFORTHIS.defaultName.value(); m_pFocusedWindowHook = g_pHookSystem->hookDynamic("closeWindow", [this](void* self, SCallbackInfo& info, std::any param) { const auto PWINDOW = std::any_cast(param); diff --git a/src/layout/DwindleLayout.cpp b/src/layout/DwindleLayout.cpp index 67390010..ea078349 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 WORKSPACERULES = g_pConfigManager->getWorkspaceRulesFor(g_pCompositor->getWorkspaceByID(pNode->workspaceID)); + const auto WORKSPACERULE = g_pConfigManager->getWorkspaceRuleFor(g_pCompositor->getWorkspaceByID(pNode->workspaceID)); if (!g_pCompositor->windowExists(PWINDOW)) { Debug::log(ERR, "Node {} holding invalid {}!!", pNode, PWINDOW); @@ -147,16 +147,9 @@ void CHyprDwindleLayout::applyNodeDataToWindow(SDwindleNodeData* pNode, bool for auto* const PGAPSIN = (CCssGapData*)(PGAPSINDATA.ptr())->getData(); auto* const PGAPSOUT = (CCssGapData*)(PGAPSOUTDATA.ptr())->getData(); - 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; + auto gapsIn = WORKSPACERULE.gapsIn.value_or(*PGAPSIN); + auto gapsOut = WORKSPACERULE.gapsOut.value_or(*PGAPSOUT); + CBox nodeBox = pNode->box; nodeBox.round(); PWINDOW->m_vSize = nodeBox.size(); @@ -167,17 +160,10 @@ void CHyprDwindleLayout::applyNodeDataToWindow(SDwindleNodeData* pNode, bool for if (*PNOGAPSWHENONLY && !PWINDOW->onSpecialWorkspace() && (NODESONWORKSPACE == 1 || (PWINDOW->m_bIsFullscreen && PWINDOW->m_pWorkspace->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 ea906943..b6780b2b 100644 --- a/src/layout/MasterLayout.cpp +++ b/src/layout/MasterLayout.cpp @@ -44,14 +44,12 @@ SMasterWorkspaceData* CHyprMasterLayout::getMasterWorkspaceData(const int& ws) { const auto PWORKSPACEDATA = &m_lMasterWorkspacesData.emplace_back(); PWORKSPACEDATA->workspaceID = ws; static auto PORIENTATION = CConfigValue("master:orientation"); - const auto WORKSPACERULES = g_pConfigManager->getWorkspaceRulesFor(g_pCompositor->getWorkspaceByID(ws)); + const auto layoutoptsForWs = g_pConfigManager->getWorkspaceRuleFor(g_pCompositor->getWorkspaceByID(ws)).layoutopts; std::string orientationForWs = *PORIENTATION; - for (auto& wsRule : WORKSPACERULES) { - if (wsRule.layoutopts.contains("orientation")) - orientationForWs = wsRule.layoutopts.at("orientation"); - } + if (layoutoptsForWs.contains("orientation")) + orientationForWs = layoutoptsForWs.at("orientation"); if (orientationForWs == "top") PWORKSPACEDATA->orientation = ORIENTATION_TOP; @@ -334,13 +332,11 @@ void CHyprMasterLayout::calculateWorkspace(PHLWORKSPACE pWorkspace) { return; // dynamic workspace rules - const auto WORKSPACERULES = g_pConfigManager->getWorkspaceRulesFor(pWorkspace); + const auto WORKSPACERULE = g_pConfigManager->getWorkspaceRuleFor(pWorkspace); std::string orientationForWs; - for (auto& wsRule : WORKSPACERULES) { - if (wsRule.layoutopts.contains("orientation")) - orientationForWs = wsRule.layoutopts.at("orientation"); - } + if (WORKSPACERULE.layoutopts.contains("orientation")) + orientationForWs = WORKSPACERULE.layoutopts.at("orientation"); if (orientationForWs == "top") PWORKSPACEDATA->orientation = ORIENTATION_TOP; @@ -643,7 +639,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 WORKSPACERULES = g_pConfigManager->getWorkspaceRulesFor(PWINDOW->m_pWorkspace); + const auto WORKSPACERULE = g_pConfigManager->getWorkspaceRuleFor(PWINDOW->m_pWorkspace); if (PWINDOW->m_bIsFullscreen && !pNode->ignoreFullscreenChecks) return; @@ -657,14 +653,8 @@ void CHyprMasterLayout::applyNodeDataToWindow(SMasterNodeData* pNode) { auto* PGAPSIN = (CCssGapData*)(PGAPSINDATA.ptr())->getData(); auto* PGAPSOUT = (CCssGapData*)(PGAPSOUTDATA.ptr())->getData(); - 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(); - } + auto gapsIn = WORKSPACERULE.gapsIn.value_or(*PGAPSIN); + auto gapsOut = WORKSPACERULE.gapsOut.value_or(*PGAPSOUT); if (!g_pCompositor->windowValidMapped(PWINDOW)) { Debug::log(ERR, "Node {} holding invalid {}!!", pNode, PWINDOW); @@ -677,17 +667,10 @@ void CHyprMasterLayout::applyNodeDataToWindow(SMasterNodeData* pNode) { if (*PNOGAPSWHENONLY && !PWINDOW->onSpecialWorkspace() && (getNodesOnWorkspace(PWINDOW->workspaceID()) == 1 || (PWINDOW->m_bIsFullscreen && PWINDOW->m_pWorkspace->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();