From 0a889b39006f64002d3567a163f86b17b01f511b Mon Sep 17 00:00:00 2001 From: Sekhat Temporus Date: Wed, 16 Aug 2023 08:37:04 +0100 Subject: [PATCH 1/9] Add change group to support switching type of the current group --- src/Hy3Layout.cpp | 83 ++++++++++++++++++++++++++++++++++----------- src/Hy3Layout.hpp | 4 +++ src/Hy3Node.cpp | 30 +++++++++++++++- src/Hy3Node.hpp | 2 ++ src/dispatchers.cpp | 30 ++++++++++++++++ 5 files changed, 129 insertions(+), 20 deletions(-) diff --git a/src/Hy3Layout.cpp b/src/Hy3Layout.cpp index 5a7973d..134a86f 100644 --- a/src/Hy3Layout.cpp +++ b/src/Hy3Layout.cpp @@ -746,6 +746,23 @@ void Hy3Layout::makeOppositeGroupOnWorkspace(int workspace, GroupEphemeralityOpt this->makeOppositeGroupOn(node, ephemeral); } +void Hy3Layout::changeGroupOnWorkspace( + int workspace, + Hy3GroupLayout layout, + GroupEphemeralityOption ephemeral +) { + auto* node = this->getWorkspaceFocusedNode(workspace); + this->changeGroupOn(node, layout, ephemeral); +} + +void Hy3Layout::untabGroupOnWorkspace( + int workspace, + GroupEphemeralityOption ephemeral +) { + auto* node = this->getWorkspaceFocusedNode(workspace); + this->untabGroupOn(node, ephemeral); +} + void Hy3Layout::makeGroupOn( Hy3Node* node, Hy3GroupLayout layout, @@ -756,10 +773,7 @@ void Hy3Layout::makeGroupOn( if (node->parent != nullptr) { auto& group = node->parent->data.as_group; if (group.children.size() == 1) { - group.layout = layout; - group.ephemeral = ephemeral == GroupEphemeralityOption::ForceEphemeral ? true - : ephemeral == GroupEphemeralityOption::Ephemeral ? group.ephemeral - : false; + group.updateLayout(layout, ephemeral); node->parent->recalcSizePosRecursive(); return; } @@ -768,26 +782,57 @@ void Hy3Layout::makeGroupOn( node->intoGroup(layout, ephemeral); } -void Hy3Layout::makeOppositeGroupOn(Hy3Node* node, GroupEphemeralityOption ephemeral) { +void Hy3Layout::makeOppositeGroupOn( + Hy3Node* node, + GroupEphemeralityOption ephemeral +) { if (node == nullptr) return; if (node->parent == nullptr) { node->intoGroup(Hy3GroupLayout::SplitH, ephemeral); - } else { - auto& group = node->parent->data.as_group; - auto layout - = group.layout == Hy3GroupLayout::SplitH ? Hy3GroupLayout::SplitV : Hy3GroupLayout::SplitH; - - if (group.children.size() == 1) { - group.layout = layout; - group.ephemeral = ephemeral == GroupEphemeralityOption::ForceEphemeral ? true - : ephemeral == GroupEphemeralityOption::Ephemeral ? group.ephemeral - : false; - node->parent->recalcSizePosRecursive(); - } else { - node->intoGroup(layout, ephemeral); - } + return; } + + auto& group = node->parent->data.as_group; + auto layout + = group.layout == Hy3GroupLayout::SplitH ? Hy3GroupLayout::SplitV : Hy3GroupLayout::SplitH; + + if (group.children.size() == 1) { + group.updateLayout(layout, ephemeral); + node->parent->recalcSizePosRecursive(); + return; + } + + node->intoGroup(layout, ephemeral); +} + +void Hy3Layout::changeGroupOn( + Hy3Node* node, + Hy3GroupLayout layout, + GroupEphemeralityOption ephemeral +) { + if (node == nullptr) return; + + if (node->parent == nullptr) { + makeGroupOn(node, layout, ephemeral); + return; + } + + auto& group = node->parent->data.as_group; + group.updateLayout(layout, ephemeral); + node->parent->recalcSizePosRecursive(); +} + +void Hy3Layout::untabGroupOn(Hy3Node* node, GroupEphemeralityOption ephemeral) { + if (node == nullptr) return; + + if (node->parent == nullptr) return; + + auto& group = node->parent->data.as_group; + + if (group.layout != Hy3GroupLayout::Tabbed) return; + + changeGroupOn(node, group.previous_nontab_layout, ephemeral); } void Hy3Layout::shiftWindow(int workspace, ShiftDirection direction, bool once) { diff --git a/src/Hy3Layout.hpp b/src/Hy3Layout.hpp index ee91b23..ace2ffe 100644 --- a/src/Hy3Layout.hpp +++ b/src/Hy3Layout.hpp @@ -90,8 +90,12 @@ public: void makeGroupOnWorkspace(int workspace, Hy3GroupLayout, GroupEphemeralityOption); void makeOppositeGroupOnWorkspace(int workspace, GroupEphemeralityOption); + void changeGroupOnWorkspace(int workspace, Hy3GroupLayout, GroupEphemeralityOption); + void untabGroupOnWorkspace(int workspace, GroupEphemeralityOption); void makeGroupOn(Hy3Node*, Hy3GroupLayout, GroupEphemeralityOption); void makeOppositeGroupOn(Hy3Node*, GroupEphemeralityOption); + void changeGroupOn(Hy3Node*, Hy3GroupLayout, GroupEphemeralityOption); + void untabGroupOn(Hy3Node*, GroupEphemeralityOption); void shiftWindow(int workspace, ShiftDirection, bool once); void shiftFocus(int workspace, ShiftDirection, bool visible); void changeFocus(int workspace, FocusShift); diff --git a/src/Hy3Node.cpp b/src/Hy3Node.cpp index 9e68cc2..084d6a5 100644 --- a/src/Hy3Node.cpp +++ b/src/Hy3Node.cpp @@ -8,10 +8,15 @@ // Hy3GroupData // -Hy3GroupData::Hy3GroupData(Hy3GroupLayout layout): layout(layout) {} +Hy3GroupData::Hy3GroupData(Hy3GroupLayout layout): layout(layout) { + if (layout != Hy3GroupLayout::Tabbed) { + this->previous_nontab_layout = layout; + } +} Hy3GroupData::Hy3GroupData(Hy3GroupData&& from) { this->layout = from.layout; + this->previous_nontab_layout = from.previous_nontab_layout; this->children = std::move(from.children); this->group_focused = from.group_focused; this->expand_focused = from.expand_focused; @@ -52,6 +57,29 @@ void Hy3GroupData::collapseExpansions() { } } +void Hy3GroupData::updateLayout( + Hy3GroupLayout layout, + GroupEphemeralityOption ephemeral +) { + this->layout = layout; + + if (layout != Hy3GroupLayout::Tabbed) { + this->previous_nontab_layout = layout; + } + + switch (ephemeral) { + case GroupEphemeralityOption::ForceEphemeral: + this->ephemeral = true; + break; + case GroupEphemeralityOption::Standard: + this->ephemeral = false; + break; + case GroupEphemeralityOption::Ephemeral: + // this->ephemeral stays the same + break; + } +} + // Hy3NodeData // Hy3NodeData::Hy3NodeData(): Hy3NodeData((CWindow*) nullptr) {} diff --git a/src/Hy3Node.hpp b/src/Hy3Node.hpp index 29d84f0..6f38276 100644 --- a/src/Hy3Node.hpp +++ b/src/Hy3Node.hpp @@ -29,6 +29,7 @@ enum class ExpandFocusType { struct Hy3GroupData { Hy3GroupLayout layout = Hy3GroupLayout::SplitH; + Hy3GroupLayout previous_nontab_layout = Hy3GroupLayout::SplitH; std::list children; bool group_focused = true; Hy3Node* focused_child = nullptr; @@ -42,6 +43,7 @@ struct Hy3GroupData { bool hasChild(Hy3Node* child); void collapseExpansions(); + void updateLayout(Hy3GroupLayout layout, GroupEphemeralityOption ephemeral); private: Hy3GroupData(Hy3GroupData&&); diff --git a/src/dispatchers.cpp b/src/dispatchers.cpp index d6568e4..04b3c11 100644 --- a/src/dispatchers.cpp +++ b/src/dispatchers.cpp @@ -43,6 +43,35 @@ void dispatch_makegroup(std::string value) { } } +void dispatch_changegroup(std::string value) { + int workspace = workspace_for_action(); + if (workspace == -1) return; + + auto args = CVarList(value); + + GroupEphemeralityOption ephemeral = GroupEphemeralityOption::Standard; + if (args[1] == "ephemeral") { + ephemeral = GroupEphemeralityOption::Ephemeral; + } else if (args[1] == "force_ephemeral") { + ephemeral = GroupEphemeralityOption::ForceEphemeral; + } + + if (args[0] == "h") { + g_Hy3Layout->changeGroupOnWorkspace(workspace, Hy3GroupLayout::SplitH, ephemeral); + } else if (args[0] == "v") { + g_Hy3Layout->changeGroupOnWorkspace(workspace, Hy3GroupLayout::SplitV, ephemeral); + } else if (args[0] == "tab") { + g_Hy3Layout->changeGroupOnWorkspace(workspace, Hy3GroupLayout::Tabbed, ephemeral); + } else if (args[0] == "untab") { + g_Hy3Layout->untabGroupOnWorkspace(workspace, ephemeral); + } + // TODO + //else if (args[0] == "opposite") { + // g_Hy3Layout->makeOppositeGroupOnWorkspace(workspace, ephemeral); + //} +} + + std::optional parseShiftArg(std::string arg) { if (arg == "l" || arg == "left") return ShiftDirection::Left; else if (arg == "r" || arg == "right") return ShiftDirection::Right; @@ -188,6 +217,7 @@ void dispatch_debug(std::string arg) { void registerDispatchers() { HyprlandAPI::addDispatcher(PHANDLE, "hy3:makegroup", dispatch_makegroup); + HyprlandAPI::addDispatcher(PHANDLE, "hy3:changegroup", dispatch_changegroup); HyprlandAPI::addDispatcher(PHANDLE, "hy3:movefocus", dispatch_movefocus); HyprlandAPI::addDispatcher(PHANDLE, "hy3:movewindow", dispatch_movewindow); HyprlandAPI::addDispatcher(PHANDLE, "hy3:changefocus", dispatch_changefocus); From 2aca365d9bb8377550f664afbedc6d152716d802 Mon Sep 17 00:00:00 2001 From: Sekhat Temporus Date: Wed, 16 Aug 2023 08:39:58 +0100 Subject: [PATCH 2/9] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 757bba2..816b481 100644 --- a/README.md +++ b/README.md @@ -215,6 +215,10 @@ plugin { - `hy3:makegroup, , [ephemeral | force_ephemeral]` - make a vertical / horizontal split or tab group - `ephemeral` - the group will be removed once it contains only one node. does not affect existing groups. - `force_ephemeral` - same as ephemeral, but converts existing single windows groups. + - `hy3:changegroup, , [ephemeral | force_ephemeral]` - change the group the node belongs to, to a different layout + - `untab` will untab the group if it was previously tabbed + - `ephemeral` - the group will be removed once it contains only one node. does not affect existing groups. + - `force_ephemeral` - same as ephemeral, but converts existing single windows groups. - `hy3:movefocus, , [visible]` - move the focus left, up, down, or right - `visible` - only move between visible nodes, not hidden tabs - `hy3:movewindow, , [once]` - move a window left, up, down, or right From 8b12921939a6caae5a0adcac5be37268fd02dc40 Mon Sep 17 00:00:00 2001 From: Sekhat Temporus Date: Wed, 16 Aug 2023 13:28:51 +0100 Subject: [PATCH 3/9] update change group to match requested changes --- README.md | 4 +--- src/Hy3Layout.cpp | 58 ++++++++++++++++++++++----------------------- src/Hy3Layout.hpp | 8 +++---- src/Hy3Node.cpp | 15 ++++++------ src/Hy3Node.hpp | 3 ++- src/dispatchers.cpp | 15 ++++-------- 6 files changed, 48 insertions(+), 55 deletions(-) diff --git a/README.md b/README.md index 816b481..4516cf8 100644 --- a/README.md +++ b/README.md @@ -215,10 +215,8 @@ plugin { - `hy3:makegroup, , [ephemeral | force_ephemeral]` - make a vertical / horizontal split or tab group - `ephemeral` - the group will be removed once it contains only one node. does not affect existing groups. - `force_ephemeral` - same as ephemeral, but converts existing single windows groups. - - `hy3:changegroup, , [ephemeral | force_ephemeral]` - change the group the node belongs to, to a different layout + - `hy3:changegroup, - change the group the node belongs to, to a different layout - `untab` will untab the group if it was previously tabbed - - `ephemeral` - the group will be removed once it contains only one node. does not affect existing groups. - - `force_ephemeral` - same as ephemeral, but converts existing single windows groups. - `hy3:movefocus, , [visible]` - move the focus left, up, down, or right - `visible` - only move between visible nodes, not hidden tabs - `hy3:movewindow, , [once]` - move a window left, up, down, or right diff --git a/src/Hy3Layout.cpp b/src/Hy3Layout.cpp index 134a86f..8d4449f 100644 --- a/src/Hy3Layout.cpp +++ b/src/Hy3Layout.cpp @@ -748,19 +748,21 @@ void Hy3Layout::makeOppositeGroupOnWorkspace(int workspace, GroupEphemeralityOpt void Hy3Layout::changeGroupOnWorkspace( int workspace, - Hy3GroupLayout layout, - GroupEphemeralityOption ephemeral + Hy3GroupLayout layout ) { auto* node = this->getWorkspaceFocusedNode(workspace); - this->changeGroupOn(node, layout, ephemeral); + + if (node == nullptr) return; + + this->changeGroupOn(*node, layout); } -void Hy3Layout::untabGroupOnWorkspace( - int workspace, - GroupEphemeralityOption ephemeral -) { +void Hy3Layout::untabGroupOnWorkspace(int workspace) { auto* node = this->getWorkspaceFocusedNode(workspace); - this->untabGroupOn(node, ephemeral); + + if (node == nullptr) return; + + this->untabGroupOn(*node); } void Hy3Layout::makeGroupOn( @@ -773,7 +775,8 @@ void Hy3Layout::makeGroupOn( if (node->parent != nullptr) { auto& group = node->parent->data.as_group; if (group.children.size() == 1) { - group.updateLayout(layout, ephemeral); + group.setLayout(layout); + group.setEphemeral(ephemeral); node->parent->recalcSizePosRecursive(); return; } @@ -798,7 +801,8 @@ void Hy3Layout::makeOppositeGroupOn( = group.layout == Hy3GroupLayout::SplitH ? Hy3GroupLayout::SplitV : Hy3GroupLayout::SplitH; if (group.children.size() == 1) { - group.updateLayout(layout, ephemeral); + group.setLayout(layout); + group.setEphemeral(ephemeral); node->parent->recalcSizePosRecursive(); return; } @@ -807,32 +811,28 @@ void Hy3Layout::makeOppositeGroupOn( } void Hy3Layout::changeGroupOn( - Hy3Node* node, - Hy3GroupLayout layout, - GroupEphemeralityOption ephemeral + Hy3Node& node, + Hy3GroupLayout layout ) { - if (node == nullptr) return; - - if (node->parent == nullptr) { - makeGroupOn(node, layout, ephemeral); + if (node.parent == nullptr) { + makeGroupOn(&node, layout, GroupEphemeralityOption::Ephemeral); return; } - auto& group = node->parent->data.as_group; - group.updateLayout(layout, ephemeral); - node->parent->recalcSizePosRecursive(); + auto& group = node.parent->data.as_group; + group.setLayout(layout); + node.parent->recalcSizePosRecursive(); } -void Hy3Layout::untabGroupOn(Hy3Node* node, GroupEphemeralityOption ephemeral) { - if (node == nullptr) return; - - if (node->parent == nullptr) return; - - auto& group = node->parent->data.as_group; +void Hy3Layout::untabGroupOn(Hy3Node& node) { + if (node.parent == nullptr) return; + auto& group = node.parent->data.as_group; if (group.layout != Hy3GroupLayout::Tabbed) return; - changeGroupOn(node, group.previous_nontab_layout, ephemeral); + changeGroupOn(node, group.previous_nontab_layout); + + } void Hy3Layout::shiftWindow(int workspace, ShiftDirection direction, bool once) { @@ -842,7 +842,7 @@ void Hy3Layout::shiftWindow(int workspace, ShiftDirection direction, bool once) if (once && node->parent != nullptr && node->parent->data.as_group.children.size() == 1) { if (node->parent->parent == nullptr) { - node->parent->data.as_group.layout = Hy3GroupLayout::SplitH; + node->parent->data.as_group.setLayout(Hy3GroupLayout::SplitH); node->parent->recalcSizePosRecursive(); } else { auto* node2 = node->parent; @@ -1466,7 +1466,7 @@ Hy3Node* Hy3Layout::shiftOrGetFocus( if (group.layout != Hy3GroupLayout::Tabbed && group.children.size() == 2 && std::find(group.children.begin(), group.children.end(), &node) != group.children.end()) { - group.layout = shiftIsVertical(direction) ? Hy3GroupLayout::SplitV : Hy3GroupLayout::SplitH; + group.setLayout(shiftIsVertical(direction) ? Hy3GroupLayout::SplitV : Hy3GroupLayout::SplitH); } else { // wrap the root group in another group this->nodes.push_back({ diff --git a/src/Hy3Layout.hpp b/src/Hy3Layout.hpp index ace2ffe..8d7970e 100644 --- a/src/Hy3Layout.hpp +++ b/src/Hy3Layout.hpp @@ -90,12 +90,12 @@ public: void makeGroupOnWorkspace(int workspace, Hy3GroupLayout, GroupEphemeralityOption); void makeOppositeGroupOnWorkspace(int workspace, GroupEphemeralityOption); - void changeGroupOnWorkspace(int workspace, Hy3GroupLayout, GroupEphemeralityOption); - void untabGroupOnWorkspace(int workspace, GroupEphemeralityOption); + void changeGroupOnWorkspace(int workspace, Hy3GroupLayout); + void untabGroupOnWorkspace(int workspace); void makeGroupOn(Hy3Node*, Hy3GroupLayout, GroupEphemeralityOption); void makeOppositeGroupOn(Hy3Node*, GroupEphemeralityOption); - void changeGroupOn(Hy3Node*, Hy3GroupLayout, GroupEphemeralityOption); - void untabGroupOn(Hy3Node*, GroupEphemeralityOption); + void changeGroupOn(Hy3Node&, Hy3GroupLayout); + void untabGroupOn(Hy3Node&); void shiftWindow(int workspace, ShiftDirection, bool once); void shiftFocus(int workspace, ShiftDirection, bool visible); void changeFocus(int workspace, FocusShift); diff --git a/src/Hy3Node.cpp b/src/Hy3Node.cpp index 084d6a5..d6afc3a 100644 --- a/src/Hy3Node.cpp +++ b/src/Hy3Node.cpp @@ -57,25 +57,26 @@ void Hy3GroupData::collapseExpansions() { } } -void Hy3GroupData::updateLayout( - Hy3GroupLayout layout, - GroupEphemeralityOption ephemeral +void Hy3GroupData::setLayout( + Hy3GroupLayout layout ) { this->layout = layout; if (layout != Hy3GroupLayout::Tabbed) { this->previous_nontab_layout = layout; } +} +void Hy3GroupData::setEphemeral(GroupEphemeralityOption ephemeral) { switch (ephemeral) { - case GroupEphemeralityOption::ForceEphemeral: - this->ephemeral = true; - break; case GroupEphemeralityOption::Standard: this->ephemeral = false; break; + case GroupEphemeralityOption::ForceEphemeral: + this->ephemeral = true; + break; case GroupEphemeralityOption::Ephemeral: - // this->ephemeral stays the same + // no change break; } } diff --git a/src/Hy3Node.hpp b/src/Hy3Node.hpp index 6f38276..fbc0861 100644 --- a/src/Hy3Node.hpp +++ b/src/Hy3Node.hpp @@ -43,7 +43,8 @@ struct Hy3GroupData { bool hasChild(Hy3Node* child); void collapseExpansions(); - void updateLayout(Hy3GroupLayout layout, GroupEphemeralityOption ephemeral); + void setLayout(Hy3GroupLayout layout); + void setEphemeral(GroupEphemeralityOption ephemeral); private: Hy3GroupData(Hy3GroupData&&); diff --git a/src/dispatchers.cpp b/src/dispatchers.cpp index 04b3c11..e35a7ba 100644 --- a/src/dispatchers.cpp +++ b/src/dispatchers.cpp @@ -49,21 +49,14 @@ void dispatch_changegroup(std::string value) { auto args = CVarList(value); - GroupEphemeralityOption ephemeral = GroupEphemeralityOption::Standard; - if (args[1] == "ephemeral") { - ephemeral = GroupEphemeralityOption::Ephemeral; - } else if (args[1] == "force_ephemeral") { - ephemeral = GroupEphemeralityOption::ForceEphemeral; - } - if (args[0] == "h") { - g_Hy3Layout->changeGroupOnWorkspace(workspace, Hy3GroupLayout::SplitH, ephemeral); + g_Hy3Layout->changeGroupOnWorkspace(workspace, Hy3GroupLayout::SplitH); } else if (args[0] == "v") { - g_Hy3Layout->changeGroupOnWorkspace(workspace, Hy3GroupLayout::SplitV, ephemeral); + g_Hy3Layout->changeGroupOnWorkspace(workspace, Hy3GroupLayout::SplitV); } else if (args[0] == "tab") { - g_Hy3Layout->changeGroupOnWorkspace(workspace, Hy3GroupLayout::Tabbed, ephemeral); + g_Hy3Layout->changeGroupOnWorkspace(workspace, Hy3GroupLayout::Tabbed); } else if (args[0] == "untab") { - g_Hy3Layout->untabGroupOnWorkspace(workspace, ephemeral); + g_Hy3Layout->untabGroupOnWorkspace(workspace); } // TODO //else if (args[0] == "opposite") { From 2acac9b1e15d970ca833821d980c5fd2e0e9a85a Mon Sep 17 00:00:00 2001 From: Sekhat Temporus Date: Wed, 16 Aug 2023 13:38:41 +0100 Subject: [PATCH 4/9] Add changeephemerality dispatcher --- README.md | 1 + src/Hy3Layout.cpp | 13 +++++++++++++ src/Hy3Layout.hpp | 2 ++ src/dispatchers.cpp | 12 ++++++++++++ 4 files changed, 28 insertions(+) diff --git a/README.md b/README.md index 4516cf8..9d4556f 100644 --- a/README.md +++ b/README.md @@ -217,6 +217,7 @@ plugin { - `force_ephemeral` - same as ephemeral, but converts existing single windows groups. - `hy3:changegroup, - change the group the node belongs to, to a different layout - `untab` will untab the group if it was previously tabbed + - `hy3:changeephemerality, ` - change the ephemerality of the group the node belongs to - `hy3:movefocus, , [visible]` - move the focus left, up, down, or right - `visible` - only move between visible nodes, not hidden tabs - `hy3:movewindow, , [once]` - move a window left, up, down, or right diff --git a/src/Hy3Layout.cpp b/src/Hy3Layout.cpp index 8d4449f..2d01f5d 100644 --- a/src/Hy3Layout.cpp +++ b/src/Hy3Layout.cpp @@ -765,6 +765,14 @@ void Hy3Layout::untabGroupOnWorkspace(int workspace) { this->untabGroupOn(*node); } +void Hy3Layout::changeGroupEphemeralityOnWorkspace(int workspace, bool ephemeral) { + auto* node = this->getWorkspaceFocusedNode(workspace); + + if (node == nullptr) return; + + this->changeGroupEphemeralityOn(*node, ephemeral); +} + void Hy3Layout::makeGroupOn( Hy3Node* node, Hy3GroupLayout layout, @@ -831,8 +839,13 @@ void Hy3Layout::untabGroupOn(Hy3Node& node) { if (group.layout != Hy3GroupLayout::Tabbed) return; changeGroupOn(node, group.previous_nontab_layout); +} +void Hy3Layout::changeGroupEphemeralityOn(Hy3Node& node, bool ephemeral) { + if (node.parent == nullptr) return; + auto& group = node.parent->data.as_group; + group.setEphemeral(ephemeral ? GroupEphemeralityOption::ForceEphemeral : GroupEphemeralityOption::Standard); } void Hy3Layout::shiftWindow(int workspace, ShiftDirection direction, bool once) { diff --git a/src/Hy3Layout.hpp b/src/Hy3Layout.hpp index 8d7970e..ef5ed73 100644 --- a/src/Hy3Layout.hpp +++ b/src/Hy3Layout.hpp @@ -92,10 +92,12 @@ public: void makeOppositeGroupOnWorkspace(int workspace, GroupEphemeralityOption); void changeGroupOnWorkspace(int workspace, Hy3GroupLayout); void untabGroupOnWorkspace(int workspace); + void changeGroupEphemeralityOnWorkspace(int workspace, bool ephemeral); void makeGroupOn(Hy3Node*, Hy3GroupLayout, GroupEphemeralityOption); void makeOppositeGroupOn(Hy3Node*, GroupEphemeralityOption); void changeGroupOn(Hy3Node&, Hy3GroupLayout); void untabGroupOn(Hy3Node&); + void changeGroupEphemeralityOn(Hy3Node&, bool ephemeral); void shiftWindow(int workspace, ShiftDirection, bool once); void shiftFocus(int workspace, ShiftDirection, bool visible); void changeFocus(int workspace, FocusShift); diff --git a/src/dispatchers.cpp b/src/dispatchers.cpp index e35a7ba..ca29441 100644 --- a/src/dispatchers.cpp +++ b/src/dispatchers.cpp @@ -64,6 +64,17 @@ void dispatch_changegroup(std::string value) { //} } +void dispatch_changeephemerality(std::string value) { + int workspace = workspace_for_action(); + if (workspace == -1) return; + + auto args = CVarList(value); + + bool ephemeral = args[0] == "true"; + + g_Hy3Layout->changeGroupEphemeralityOnWorkspace(workspace, ephemeral); +} + std::optional parseShiftArg(std::string arg) { if (arg == "l" || arg == "left") return ShiftDirection::Left; @@ -211,6 +222,7 @@ void dispatch_debug(std::string arg) { void registerDispatchers() { HyprlandAPI::addDispatcher(PHANDLE, "hy3:makegroup", dispatch_makegroup); HyprlandAPI::addDispatcher(PHANDLE, "hy3:changegroup", dispatch_changegroup); + HyprlandAPI::addDispatcher(PHANDLE, "hy3:changeephemerality", dispatch_changeephemerality); HyprlandAPI::addDispatcher(PHANDLE, "hy3:movefocus", dispatch_movefocus); HyprlandAPI::addDispatcher(PHANDLE, "hy3:movewindow", dispatch_movewindow); HyprlandAPI::addDispatcher(PHANDLE, "hy3:changefocus", dispatch_changefocus); From 88267eee8550bb8f1a1a5399161cd4ea633a2978 Mon Sep 17 00:00:00 2001 From: Sekhat Temporus Date: Thu, 17 Aug 2023 07:46:14 +0100 Subject: [PATCH 5/9] Add opposite support to change group This will allow toggling between horizontal and veritcal layouts for non-tabbed layouts --- README.md | 3 ++- src/Hy3Layout.cpp | 18 ++++++++++++++++++ src/Hy3Layout.hpp | 2 ++ src/dispatchers.cpp | 6 ++---- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 9d4556f..54fa81a 100644 --- a/README.md +++ b/README.md @@ -215,8 +215,9 @@ plugin { - `hy3:makegroup, , [ephemeral | force_ephemeral]` - make a vertical / horizontal split or tab group - `ephemeral` - the group will be removed once it contains only one node. does not affect existing groups. - `force_ephemeral` - same as ephemeral, but converts existing single windows groups. - - `hy3:changegroup, - change the group the node belongs to, to a different layout + - `hy3:changegroup, - change the group the node belongs to, to a different layout - `untab` will untab the group if it was previously tabbed + - `opposite` will toggle between horizontal and vertical layouts if the group is not tabbed. - `hy3:changeephemerality, ` - change the ephemerality of the group the node belongs to - `hy3:movefocus, , [visible]` - move the focus left, up, down, or right - `visible` - only move between visible nodes, not hidden tabs diff --git a/src/Hy3Layout.cpp b/src/Hy3Layout.cpp index 2d01f5d..0b93b4c 100644 --- a/src/Hy3Layout.cpp +++ b/src/Hy3Layout.cpp @@ -765,6 +765,14 @@ void Hy3Layout::untabGroupOnWorkspace(int workspace) { this->untabGroupOn(*node); } +void Hy3Layout::changeGroupToOppositeOnWorkspace(int workspace) { + auto* node = this->getWorkspaceFocusedNode(workspace); + + if (node == nullptr) return; + + this->changeGroupToOppositeOn(*node); +} + void Hy3Layout::changeGroupEphemeralityOnWorkspace(int workspace, bool ephemeral) { auto* node = this->getWorkspaceFocusedNode(workspace); @@ -841,6 +849,16 @@ void Hy3Layout::untabGroupOn(Hy3Node& node) { changeGroupOn(node, group.previous_nontab_layout); } +void Hy3Layout::changeGroupToOppositeOn(Hy3Node& node) { + if (node.parent == nullptr) return; + + auto& group = node.parent->data.as_group; + + if (group.layout == Hy3GroupLayout::Tabbed) return; + group.setLayout(group.layout == Hy3GroupLayout::SplitH ? Hy3GroupLayout::SplitV : Hy3GroupLayout::SplitH); + node.parent->recalcSizePosRecursive(); +} + void Hy3Layout::changeGroupEphemeralityOn(Hy3Node& node, bool ephemeral) { if (node.parent == nullptr) return; diff --git a/src/Hy3Layout.hpp b/src/Hy3Layout.hpp index ef5ed73..e5148cc 100644 --- a/src/Hy3Layout.hpp +++ b/src/Hy3Layout.hpp @@ -92,11 +92,13 @@ public: void makeOppositeGroupOnWorkspace(int workspace, GroupEphemeralityOption); void changeGroupOnWorkspace(int workspace, Hy3GroupLayout); void untabGroupOnWorkspace(int workspace); + void changeGroupToOppositeOnWorkspace(int workspace); void changeGroupEphemeralityOnWorkspace(int workspace, bool ephemeral); void makeGroupOn(Hy3Node*, Hy3GroupLayout, GroupEphemeralityOption); void makeOppositeGroupOn(Hy3Node*, GroupEphemeralityOption); void changeGroupOn(Hy3Node&, Hy3GroupLayout); void untabGroupOn(Hy3Node&); + void changeGroupToOppositeOn(Hy3Node&); void changeGroupEphemeralityOn(Hy3Node&, bool ephemeral); void shiftWindow(int workspace, ShiftDirection, bool once); void shiftFocus(int workspace, ShiftDirection, bool visible); diff --git a/src/dispatchers.cpp b/src/dispatchers.cpp index ca29441..bec72aa 100644 --- a/src/dispatchers.cpp +++ b/src/dispatchers.cpp @@ -57,11 +57,9 @@ void dispatch_changegroup(std::string value) { g_Hy3Layout->changeGroupOnWorkspace(workspace, Hy3GroupLayout::Tabbed); } else if (args[0] == "untab") { g_Hy3Layout->untabGroupOnWorkspace(workspace); + } else if (args[0] == "opposite") { + g_Hy3Layout->changeGroupToOppositeOnWorkspace(workspace); } - // TODO - //else if (args[0] == "opposite") { - // g_Hy3Layout->makeOppositeGroupOnWorkspace(workspace, ephemeral); - //} } void dispatch_changeephemerality(std::string value) { From fc5da015ff7dcab4c41f33b82d05bf53fcbd244c Mon Sep 17 00:00:00 2001 From: Sekhat Temporus Date: Thu, 17 Aug 2023 13:07:34 +0100 Subject: [PATCH 6/9] run clang-format --- src/Hy3Layout.cpp | 29 +++++++++++++---------------- src/Hy3Node.cpp | 18 ++++++------------ src/dispatchers.cpp | 1 - 3 files changed, 19 insertions(+), 29 deletions(-) diff --git a/src/Hy3Layout.cpp b/src/Hy3Layout.cpp index 0b93b4c..fd5e6b9 100644 --- a/src/Hy3Layout.cpp +++ b/src/Hy3Layout.cpp @@ -746,10 +746,7 @@ void Hy3Layout::makeOppositeGroupOnWorkspace(int workspace, GroupEphemeralityOpt this->makeOppositeGroupOn(node, ephemeral); } -void Hy3Layout::changeGroupOnWorkspace( - int workspace, - Hy3GroupLayout layout -) { +void Hy3Layout::changeGroupOnWorkspace(int workspace, Hy3GroupLayout layout) { auto* node = this->getWorkspaceFocusedNode(workspace); if (node == nullptr) return; @@ -801,10 +798,7 @@ void Hy3Layout::makeGroupOn( node->intoGroup(layout, ephemeral); } -void Hy3Layout::makeOppositeGroupOn( - Hy3Node* node, - GroupEphemeralityOption ephemeral -) { +void Hy3Layout::makeOppositeGroupOn(Hy3Node* node, GroupEphemeralityOption ephemeral) { if (node == nullptr) return; if (node->parent == nullptr) { @@ -814,7 +808,7 @@ void Hy3Layout::makeOppositeGroupOn( auto& group = node->parent->data.as_group; auto layout - = group.layout == Hy3GroupLayout::SplitH ? Hy3GroupLayout::SplitV : Hy3GroupLayout::SplitH; + = group.layout == Hy3GroupLayout::SplitH ? Hy3GroupLayout::SplitV : Hy3GroupLayout::SplitH; if (group.children.size() == 1) { group.setLayout(layout); @@ -826,10 +820,7 @@ void Hy3Layout::makeOppositeGroupOn( node->intoGroup(layout, ephemeral); } -void Hy3Layout::changeGroupOn( - Hy3Node& node, - Hy3GroupLayout layout -) { +void Hy3Layout::changeGroupOn(Hy3Node& node, Hy3GroupLayout layout) { if (node.parent == nullptr) { makeGroupOn(&node, layout, GroupEphemeralityOption::Ephemeral); return; @@ -855,7 +846,9 @@ void Hy3Layout::changeGroupToOppositeOn(Hy3Node& node) { auto& group = node.parent->data.as_group; if (group.layout == Hy3GroupLayout::Tabbed) return; - group.setLayout(group.layout == Hy3GroupLayout::SplitH ? Hy3GroupLayout::SplitV : Hy3GroupLayout::SplitH); + group.setLayout( + group.layout == Hy3GroupLayout::SplitH ? Hy3GroupLayout::SplitV : Hy3GroupLayout::SplitH + ); node.parent->recalcSizePosRecursive(); } @@ -863,7 +856,9 @@ void Hy3Layout::changeGroupEphemeralityOn(Hy3Node& node, bool ephemeral) { if (node.parent == nullptr) return; auto& group = node.parent->data.as_group; - group.setEphemeral(ephemeral ? GroupEphemeralityOption::ForceEphemeral : GroupEphemeralityOption::Standard); + group.setEphemeral( + ephemeral ? GroupEphemeralityOption::ForceEphemeral : GroupEphemeralityOption::Standard + ); } void Hy3Layout::shiftWindow(int workspace, ShiftDirection direction, bool once) { @@ -1497,7 +1492,9 @@ Hy3Node* Hy3Layout::shiftOrGetFocus( if (group.layout != Hy3GroupLayout::Tabbed && group.children.size() == 2 && std::find(group.children.begin(), group.children.end(), &node) != group.children.end()) { - group.setLayout(shiftIsVertical(direction) ? Hy3GroupLayout::SplitV : Hy3GroupLayout::SplitH); + group.setLayout( + shiftIsVertical(direction) ? Hy3GroupLayout::SplitV : Hy3GroupLayout::SplitH + ); } else { // wrap the root group in another group this->nodes.push_back({ diff --git a/src/Hy3Node.cpp b/src/Hy3Node.cpp index d6afc3a..8ff9fa4 100644 --- a/src/Hy3Node.cpp +++ b/src/Hy3Node.cpp @@ -57,9 +57,7 @@ void Hy3GroupData::collapseExpansions() { } } -void Hy3GroupData::setLayout( - Hy3GroupLayout layout -) { +void Hy3GroupData::setLayout(Hy3GroupLayout layout) { this->layout = layout; if (layout != Hy3GroupLayout::Tabbed) { @@ -69,15 +67,11 @@ void Hy3GroupData::setLayout( void Hy3GroupData::setEphemeral(GroupEphemeralityOption ephemeral) { switch (ephemeral) { - case GroupEphemeralityOption::Standard: - this->ephemeral = false; - break; - case GroupEphemeralityOption::ForceEphemeral: - this->ephemeral = true; - break; - case GroupEphemeralityOption::Ephemeral: - // no change - break; + case GroupEphemeralityOption::Standard: this->ephemeral = false; break; + case GroupEphemeralityOption::ForceEphemeral: this->ephemeral = true; break; + case GroupEphemeralityOption::Ephemeral: + // no change + break; } } diff --git a/src/dispatchers.cpp b/src/dispatchers.cpp index bec72aa..3250ee0 100644 --- a/src/dispatchers.cpp +++ b/src/dispatchers.cpp @@ -73,7 +73,6 @@ void dispatch_changeephemerality(std::string value) { g_Hy3Layout->changeGroupEphemeralityOnWorkspace(workspace, ephemeral); } - std::optional parseShiftArg(std::string arg) { if (arg == "l" || arg == "left") return ShiftDirection::Left; else if (arg == "r" || arg == "right") return ShiftDirection::Right; From 5cc6f08046fde976074f2cac9e518e835a58d0c2 Mon Sep 17 00:00:00 2001 From: Sekhat Temporus Date: Thu, 17 Aug 2023 13:18:34 +0100 Subject: [PATCH 7/9] Fix missing closing ` in README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 54fa81a..6103942 100644 --- a/README.md +++ b/README.md @@ -215,7 +215,7 @@ plugin { - `hy3:makegroup, , [ephemeral | force_ephemeral]` - make a vertical / horizontal split or tab group - `ephemeral` - the group will be removed once it contains only one node. does not affect existing groups. - `force_ephemeral` - same as ephemeral, but converts existing single windows groups. - - `hy3:changegroup, - change the group the node belongs to, to a different layout + - `hy3:changegroup, ` - change the group the node belongs to, to a different layout - `untab` will untab the group if it was previously tabbed - `opposite` will toggle between horizontal and vertical layouts if the group is not tabbed. - `hy3:changeephemerality, ` - change the ephemerality of the group the node belongs to From a2dd898ebabaef0dc5f939ada28342b9c0f794ee Mon Sep 17 00:00:00 2001 From: Sekhat Temporus Date: Fri, 18 Aug 2023 08:07:38 +0100 Subject: [PATCH 8/9] Rename ephemeral dispatcher to `setephemeral` --- README.md | 2 +- src/dispatchers.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6103942..8ceec53 100644 --- a/README.md +++ b/README.md @@ -218,7 +218,7 @@ plugin { - `hy3:changegroup, ` - change the group the node belongs to, to a different layout - `untab` will untab the group if it was previously tabbed - `opposite` will toggle between horizontal and vertical layouts if the group is not tabbed. - - `hy3:changeephemerality, ` - change the ephemerality of the group the node belongs to + - `hy3:setephemeral, ` - change the ephemerality of the group the node belongs to - `hy3:movefocus, , [visible]` - move the focus left, up, down, or right - `visible` - only move between visible nodes, not hidden tabs - `hy3:movewindow, , [once]` - move a window left, up, down, or right diff --git a/src/dispatchers.cpp b/src/dispatchers.cpp index 3250ee0..f2ae3d4 100644 --- a/src/dispatchers.cpp +++ b/src/dispatchers.cpp @@ -62,7 +62,7 @@ void dispatch_changegroup(std::string value) { } } -void dispatch_changeephemerality(std::string value) { +void dispatch_setephemeral(std::string value) { int workspace = workspace_for_action(); if (workspace == -1) return; @@ -219,7 +219,7 @@ void dispatch_debug(std::string arg) { void registerDispatchers() { HyprlandAPI::addDispatcher(PHANDLE, "hy3:makegroup", dispatch_makegroup); HyprlandAPI::addDispatcher(PHANDLE, "hy3:changegroup", dispatch_changegroup); - HyprlandAPI::addDispatcher(PHANDLE, "hy3:changeephemerality", dispatch_changeephemerality); + HyprlandAPI::addDispatcher(PHANDLE, "hy3:setephemeral", dispatch_setephemeral); HyprlandAPI::addDispatcher(PHANDLE, "hy3:movefocus", dispatch_movefocus); HyprlandAPI::addDispatcher(PHANDLE, "hy3:movewindow", dispatch_movewindow); HyprlandAPI::addDispatcher(PHANDLE, "hy3:changefocus", dispatch_changefocus); From ebe524ca64259c58a9745d62e2379bceaf6f263c Mon Sep 17 00:00:00 2001 From: Sekhat Temporus Date: Fri, 18 Aug 2023 08:08:30 +0100 Subject: [PATCH 9/9] Tidy grouping of code --- src/Hy3Layout.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/Hy3Layout.cpp b/src/Hy3Layout.cpp index fd5e6b9..83f8e48 100644 --- a/src/Hy3Layout.cpp +++ b/src/Hy3Layout.cpp @@ -748,7 +748,6 @@ void Hy3Layout::makeOppositeGroupOnWorkspace(int workspace, GroupEphemeralityOpt void Hy3Layout::changeGroupOnWorkspace(int workspace, Hy3GroupLayout layout) { auto* node = this->getWorkspaceFocusedNode(workspace); - if (node == nullptr) return; this->changeGroupOn(*node, layout); @@ -756,7 +755,6 @@ void Hy3Layout::changeGroupOnWorkspace(int workspace, Hy3GroupLayout layout) { void Hy3Layout::untabGroupOnWorkspace(int workspace) { auto* node = this->getWorkspaceFocusedNode(workspace); - if (node == nullptr) return; this->untabGroupOn(*node); @@ -764,7 +762,6 @@ void Hy3Layout::untabGroupOnWorkspace(int workspace) { void Hy3Layout::changeGroupToOppositeOnWorkspace(int workspace) { auto* node = this->getWorkspaceFocusedNode(workspace); - if (node == nullptr) return; this->changeGroupToOppositeOn(*node); @@ -772,7 +769,6 @@ void Hy3Layout::changeGroupToOppositeOnWorkspace(int workspace) { void Hy3Layout::changeGroupEphemeralityOnWorkspace(int workspace, bool ephemeral) { auto* node = this->getWorkspaceFocusedNode(workspace); - if (node == nullptr) return; this->changeGroupEphemeralityOn(*node, ephemeral);