From f8453add50f68292b2d331c13fb8a00169b75d60 Mon Sep 17 00:00:00 2001 From: Rehan Date: Sat, 19 Aug 2023 10:44:52 -0400 Subject: [PATCH] Adds ability to toggle tabbing --- README.md | 3 ++- src/Hy3Layout.cpp | 15 +++++++++++++++ src/Hy3Layout.hpp | 2 ++ src/dispatchers.cpp | 2 ++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8ceec53..74004ad 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 + - `toggletab` will untab if group is tabbed, and tab if group is untabbed - `opposite` will toggle between horizontal and vertical layouts if the group is not tabbed. - `hy3:setephemeral, ` - change the ephemerality of the group the node belongs to - `hy3:movefocus, , [visible]` - move the focus left, up, down, or right diff --git a/src/Hy3Layout.cpp b/src/Hy3Layout.cpp index 76231c5..7564abe 100644 --- a/src/Hy3Layout.cpp +++ b/src/Hy3Layout.cpp @@ -762,6 +762,13 @@ void Hy3Layout::untabGroupOnWorkspace(int workspace) { this->untabGroupOn(*node); } +void Hy3Layout::toggleTabGroupOnWorkspace(int workspace) { + auto* node = this->getWorkspaceFocusedNode(workspace); + if (node == nullptr) return; + + this->toggleTabGroupOn(*node); +} + void Hy3Layout::changeGroupToOppositeOnWorkspace(int workspace) { auto* node = this->getWorkspaceFocusedNode(workspace); if (node == nullptr) return; @@ -838,6 +845,14 @@ void Hy3Layout::untabGroupOn(Hy3Node& node) { changeGroupOn(node, group.previous_nontab_layout); } +void Hy3Layout::toggleTabGroupOn(Hy3Node& node) { + if (node.parent == nullptr) return; + + auto& group = node.parent->data.as_group; + if (group.layout != Hy3GroupLayout::Tabbed) changeGroupOn(node, Hy3GroupLayout::Tabbed); + else changeGroupOn(node, group.previous_nontab_layout); +} + void Hy3Layout::changeGroupToOppositeOn(Hy3Node& node) { if (node.parent == nullptr) return; diff --git a/src/Hy3Layout.hpp b/src/Hy3Layout.hpp index e5148cc..d6728e2 100644 --- a/src/Hy3Layout.hpp +++ b/src/Hy3Layout.hpp @@ -92,12 +92,14 @@ public: void makeOppositeGroupOnWorkspace(int workspace, GroupEphemeralityOption); void changeGroupOnWorkspace(int workspace, Hy3GroupLayout); void untabGroupOnWorkspace(int workspace); + void toggleTabGroupOnWorkspace(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 toggleTabGroupOn(Hy3Node&); void changeGroupToOppositeOn(Hy3Node&); void changeGroupEphemeralityOn(Hy3Node&, bool ephemeral); void shiftWindow(int workspace, ShiftDirection, bool once); diff --git a/src/dispatchers.cpp b/src/dispatchers.cpp index f2ae3d4..f56b2fb 100644 --- a/src/dispatchers.cpp +++ b/src/dispatchers.cpp @@ -57,6 +57,8 @@ 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] == "toggletab") { + g_Hy3Layout->toggleTabGroupOnWorkspace(workspace); } else if (args[0] == "opposite") { g_Hy3Layout->changeGroupToOppositeOnWorkspace(workspace); }