From 87f664f1ead0718716b9b1a5dc290630b6df1556 Mon Sep 17 00:00:00 2001 From: outfoxxed Date: Mon, 31 Jul 2023 21:28:21 -0700 Subject: [PATCH] Add `node_collapse_policy` setting The original behavior was to always collapse (`node_collapse_policy = 0`) --- README.md | 7 +++++++ src/Hy3Layout.cpp | 13 ++++++++++++- src/main.cpp | 5 +++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8b000e8..8982679 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,13 @@ plugin { # disable gaps when only one window is onscreen no_gaps_when_only = + # policy controlling what happens when a node is removed from a group, + # leaving only a group + # 0 = remove the nested group + # 1 = keep the nested group + # 2 = keep the nested group only if its parent is a tab group (default) + node_collapse_policy = + # offset from group split direction when only one window is in a group group_inset = diff --git a/src/Hy3Layout.cpp b/src/Hy3Layout.cpp index e00394e..097b11e 100644 --- a/src/Hy3Layout.cpp +++ b/src/Hy3Layout.cpp @@ -193,6 +193,9 @@ void Hy3Layout::onWindowCreatedTiling(CWindow* window) { } void Hy3Layout::onWindowRemovedTiling(CWindow* window) { + static const auto* node_collapse_policy + = &HyprlandAPI::getConfigValue(PHANDLE, "plugin:hy3:node_collapse_policy")->intValue; + auto* node = this->getNodeFromWindow(window); Debug::log(LOG, "remove tiling %p (window %p)", node, window); @@ -217,8 +220,16 @@ void Hy3Layout::onWindowRemovedTiling(CWindow* window) { if (parent != nullptr) { parent->recalcSizePosRecursive(); + // returns if a given node is a group that can be collapsed given the current config + auto node_is_collapsible = [](Hy3Node* node) { + if (node->data.type != Hy3NodeType::Group) return false; + if (*node_collapse_policy == 0) return true; + else if (*node_collapse_policy == 1) return false; + return node->parent->data.as_group.layout != Hy3GroupLayout::Tabbed; + }; + if (group.children.size() == 1 - && (group.ephemeral || group.children.front()->data.type == Hy3NodeType::Group)) + && (group.ephemeral || node_is_collapsible(group.children.front()))) { auto* target_parent = parent; while (target_parent != nullptr && Hy3Node::swallowGroups(target_parent)) { diff --git a/src/main.cpp b/src/main.cpp index 85e91e5..3bacbc7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -19,6 +19,11 @@ APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) { "plugin:hy3:no_gaps_when_only", SConfigValue {.intValue = 0} ); + HyprlandAPI::addConfigValue( + PHANDLE, + "plugin:hy3:node_collapse_policy", + SConfigValue {.intValue = 2} + ); HyprlandAPI::addConfigValue(PHANDLE, "plugin:hy3:group_inset", SConfigValue {.intValue = 10}); HyprlandAPI::addConfigValue(PHANDLE, "plugin:hy3:tabs:height", SConfigValue {.intValue = 15}); HyprlandAPI::addConfigValue(PHANDLE, "plugin:hy3:tabs:padding", SConfigValue {.intValue = 5});