summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorthejch <66577496+thejch@users.noreply.github.com>2024-04-05 08:54:30 -0700
committerGitHub <noreply@github.com>2024-04-05 16:54:30 +0100
commit1e8f57c7340850ff08e4a4919e06d830be28b7b9 (patch)
treef4abda938c24531e7234efd4375ae6e31ae435a5 /src
parent942172d2dc9194b95d637283ec3338c06c9c6597 (diff)
workspacerules: fix workspace rule loops (#5433)
Diffstat (limited to 'src')
-rw-r--r--src/Compositor.cpp15
-rw-r--r--src/config/ConfigManager.cpp40
-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.cpp26
-rw-r--r--src/layout/MasterLayout.cpp39
7 files changed, 68 insertions, 91 deletions
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<SWorkspaceRule> CConfigManager::getWorkspaceRulesFor(PHLWORKSPACE pWorkspace) {
- std::vector<SWorkspaceRule> 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<SWindowRule> 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<SWorkspaceRule> 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<SWorkspaceRule>{};
- bool border = true;
+ const auto PWORKSPACE = m_pWorkspace;
+ const auto WORKSPACERULE = PWORKSPACE ? g_pConfigManager->getWorkspaceRuleFor(PWORKSPACE) : 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 = 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<CWindow*>(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<std::string>("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();