Diff
1diff --git a/README.md b/README.md
2index 8ceec53439e4fcbed6548b461a379a7c83e5c0ce..74004ad365e9c1e86e2ea4d47c8a57512cde91be 100644
3--- a/README.md
4+++ b/README.md
5@@ -215,8 +215,9 @@ plugin {
6 - `hy3:makegroup, <h | v | opposite | tab>, [ephemeral | force_ephemeral]` - make a vertical / horizontal split or tab group
7 - `ephemeral` - the group will be removed once it contains only one node. does not affect existing groups.
8 - `force_ephemeral` - same as ephemeral, but converts existing single windows groups.
9- - `hy3:changegroup, <h | v | tab | untab | opposite>` - change the group the node belongs to, to a different layout
10+ - `hy3:changegroup, <h | v | tab | untab | toggletab | opposite>` - change the group the node belongs to, to a different layout
11 - `untab` will untab the group if it was previously tabbed
12+ - `toggletab` will untab if group is tabbed, and tab if group is untabbed
13 - `opposite` will toggle between horizontal and vertical layouts if the group is not tabbed.
14 - `hy3:setephemeral, <true | false>` - change the ephemerality of the group the node belongs to
15 - `hy3:movefocus, <l | u | d | r | left | down | up | right>, [visible]` - move the focus left, up, down, or right
16diff --git a/src/Hy3Layout.cpp b/src/Hy3Layout.cpp
17index 76231c54d995009418171e4fc6f124a8b1a710a5..7564abecd64b1d3fef404a34f18a8151ea539573 100644
18--- a/src/Hy3Layout.cpp
19+++ b/src/Hy3Layout.cpp
20@@ -762,6 +762,13 @@ void Hy3Layout::untabGroupOnWorkspace(int workspace) {
21 this->untabGroupOn(*node);
22 }
23
24+void Hy3Layout::toggleTabGroupOnWorkspace(int workspace) {
25+ auto* node = this->getWorkspaceFocusedNode(workspace);
26+ if (node == nullptr) return;
27+
28+ this->toggleTabGroupOn(*node);
29+}
30+
31 void Hy3Layout::changeGroupToOppositeOnWorkspace(int workspace) {
32 auto* node = this->getWorkspaceFocusedNode(workspace);
33 if (node == nullptr) return;
34@@ -838,6 +845,14 @@ void Hy3Layout::untabGroupOn(Hy3Node& node) {
35 changeGroupOn(node, group.previous_nontab_layout);
36 }
37
38+void Hy3Layout::toggleTabGroupOn(Hy3Node& node) {
39+ if (node.parent == nullptr) return;
40+
41+ auto& group = node.parent->data.as_group;
42+ if (group.layout != Hy3GroupLayout::Tabbed) changeGroupOn(node, Hy3GroupLayout::Tabbed);
43+ else changeGroupOn(node, group.previous_nontab_layout);
44+}
45+
46 void Hy3Layout::changeGroupToOppositeOn(Hy3Node& node) {
47 if (node.parent == nullptr) return;
48
49diff --git a/src/Hy3Layout.hpp b/src/Hy3Layout.hpp
50index e5148cc4ab1e53dcc416d2994bbe143aee5400b6..d6728e2920940844a8f8663a9e8dac6f015710f7 100644
51--- a/src/Hy3Layout.hpp
52+++ b/src/Hy3Layout.hpp
53@@ -92,12 +92,14 @@ public:
54 void makeOppositeGroupOnWorkspace(int workspace, GroupEphemeralityOption);
55 void changeGroupOnWorkspace(int workspace, Hy3GroupLayout);
56 void untabGroupOnWorkspace(int workspace);
57+ void toggleTabGroupOnWorkspace(int workspace);
58 void changeGroupToOppositeOnWorkspace(int workspace);
59 void changeGroupEphemeralityOnWorkspace(int workspace, bool ephemeral);
60 void makeGroupOn(Hy3Node*, Hy3GroupLayout, GroupEphemeralityOption);
61 void makeOppositeGroupOn(Hy3Node*, GroupEphemeralityOption);
62 void changeGroupOn(Hy3Node&, Hy3GroupLayout);
63 void untabGroupOn(Hy3Node&);
64+ void toggleTabGroupOn(Hy3Node&);
65 void changeGroupToOppositeOn(Hy3Node&);
66 void changeGroupEphemeralityOn(Hy3Node&, bool ephemeral);
67 void shiftWindow(int workspace, ShiftDirection, bool once);
68diff --git a/src/dispatchers.cpp b/src/dispatchers.cpp
69index f2ae3d4a09eb15d77e8aaac02ac80c555d9a3430..f56b2fb2c5cc9b4ffc8fc20e3f3e19dad28a266f 100644
70--- a/src/dispatchers.cpp
71+++ b/src/dispatchers.cpp
72@@ -57,6 +57,8 @@ void dispatch_changegroup(std::string value) {
73 g_Hy3Layout->changeGroupOnWorkspace(workspace, Hy3GroupLayout::Tabbed);
74 } else if (args[0] == "untab") {
75 g_Hy3Layout->untabGroupOnWorkspace(workspace);
76+ } else if (args[0] == "toggletab") {
77+ g_Hy3Layout->toggleTabGroupOnWorkspace(workspace);
78 } else if (args[0] == "opposite") {
79 g_Hy3Layout->changeGroupToOppositeOnWorkspace(workspace);
80 }