Add node_collapse_policy setting

The original behavior was to always collapse (`node_collapse_policy = 0`)
This commit is contained in:
outfoxxed 2023-07-31 21:28:21 -07:00
parent f08c7ff2e4
commit 87f664f1ea
No known key found for this signature in database
GPG key ID: 4C88A185FB89301E
3 changed files with 24 additions and 1 deletions

View file

@ -44,6 +44,13 @@ plugin {
# disable gaps when only one window is onscreen # disable gaps when only one window is onscreen
no_gaps_when_only = <bool> no_gaps_when_only = <bool>
# 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 = <int>
# offset from group split direction when only one window is in a group # offset from group split direction when only one window is in a group
group_inset = <int> group_inset = <int>

View file

@ -193,6 +193,9 @@ void Hy3Layout::onWindowCreatedTiling(CWindow* window) {
} }
void Hy3Layout::onWindowRemovedTiling(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); auto* node = this->getNodeFromWindow(window);
Debug::log(LOG, "remove tiling %p (window %p)", node, window); Debug::log(LOG, "remove tiling %p (window %p)", node, window);
@ -217,8 +220,16 @@ void Hy3Layout::onWindowRemovedTiling(CWindow* window) {
if (parent != nullptr) { if (parent != nullptr) {
parent->recalcSizePosRecursive(); 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 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; auto* target_parent = parent;
while (target_parent != nullptr && Hy3Node::swallowGroups(target_parent)) { while (target_parent != nullptr && Hy3Node::swallowGroups(target_parent)) {

View file

@ -19,6 +19,11 @@ APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
"plugin:hy3:no_gaps_when_only", "plugin:hy3:no_gaps_when_only",
SConfigValue {.intValue = 0} 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:group_inset", SConfigValue {.intValue = 10});
HyprlandAPI::addConfigValue(PHANDLE, "plugin:hy3:tabs:height", SConfigValue {.intValue = 15}); HyprlandAPI::addConfigValue(PHANDLE, "plugin:hy3:tabs:height", SConfigValue {.intValue = 15});
HyprlandAPI::addConfigValue(PHANDLE, "plugin:hy3:tabs:padding", SConfigValue {.intValue = 5}); HyprlandAPI::addConfigValue(PHANDLE, "plugin:hy3:tabs:padding", SConfigValue {.intValue = 5});