Diff
1diff --git a/README.md b/README.md
2index 4516cf8c7392ab5fe70a7513dfeba87b7150a1e9..9d4556fc280b5bb6463173066ba81562800e4832 100644
3--- a/README.md
4+++ b/README.md
5@@ -217,6 +217,7 @@ plugin {
6 - `force_ephemeral` - same as ephemeral, but converts existing single windows groups.
7 - `hy3:changegroup, <h | v | tab | untab> - change the group the node belongs to, to a different layout
8 - `untab` will untab the group if it was previously tabbed
9+ - `hy3:changeephemerality, <true | false>` - change the ephemerality of the group the node belongs to
10 - `hy3:movefocus, <l | u | d | r | left | down | up | right>, [visible]` - move the focus left, up, down, or right
11 - `visible` - only move between visible nodes, not hidden tabs
12 - `hy3:movewindow, <l | u | d | r | left | down | up | right>, [once]` - move a window left, up, down, or right
13diff --git a/src/Hy3Layout.cpp b/src/Hy3Layout.cpp
14index 8d4449fb72ab15b12bf4ad4779ee601e9654a70e..2d01f5d285f7af79213b3a894bd4c1e93102a2b7 100644
15--- a/src/Hy3Layout.cpp
16+++ b/src/Hy3Layout.cpp
17@@ -765,6 +765,14 @@ void Hy3Layout::untabGroupOnWorkspace(int workspace) {
18 this->untabGroupOn(*node);
19 }
20
21+void Hy3Layout::changeGroupEphemeralityOnWorkspace(int workspace, bool ephemeral) {
22+ auto* node = this->getWorkspaceFocusedNode(workspace);
23+
24+ if (node == nullptr) return;
25+
26+ this->changeGroupEphemeralityOn(*node, ephemeral);
27+}
28+
29 void Hy3Layout::makeGroupOn(
30 Hy3Node* node,
31 Hy3GroupLayout layout,
32@@ -831,8 +839,13 @@ void Hy3Layout::untabGroupOn(Hy3Node& node) {
33 if (group.layout != Hy3GroupLayout::Tabbed) return;
34
35 changeGroupOn(node, group.previous_nontab_layout);
36+}
37
38+void Hy3Layout::changeGroupEphemeralityOn(Hy3Node& node, bool ephemeral) {
39+ if (node.parent == nullptr) return;
40
41+ auto& group = node.parent->data.as_group;
42+ group.setEphemeral(ephemeral ? GroupEphemeralityOption::ForceEphemeral : GroupEphemeralityOption::Standard);
43 }
44
45 void Hy3Layout::shiftWindow(int workspace, ShiftDirection direction, bool once) {
46diff --git a/src/Hy3Layout.hpp b/src/Hy3Layout.hpp
47index 8d7970ea436f620aefffe6942decf8df6d289564..ef5ed73a531fc7524788d6a4cf7736744f07510c 100644
48--- a/src/Hy3Layout.hpp
49+++ b/src/Hy3Layout.hpp
50@@ -92,10 +92,12 @@ public:
51 void makeOppositeGroupOnWorkspace(int workspace, GroupEphemeralityOption);
52 void changeGroupOnWorkspace(int workspace, Hy3GroupLayout);
53 void untabGroupOnWorkspace(int workspace);
54+ void changeGroupEphemeralityOnWorkspace(int workspace, bool ephemeral);
55 void makeGroupOn(Hy3Node*, Hy3GroupLayout, GroupEphemeralityOption);
56 void makeOppositeGroupOn(Hy3Node*, GroupEphemeralityOption);
57 void changeGroupOn(Hy3Node&, Hy3GroupLayout);
58 void untabGroupOn(Hy3Node&);
59+ void changeGroupEphemeralityOn(Hy3Node&, bool ephemeral);
60 void shiftWindow(int workspace, ShiftDirection, bool once);
61 void shiftFocus(int workspace, ShiftDirection, bool visible);
62 void changeFocus(int workspace, FocusShift);
63diff --git a/src/dispatchers.cpp b/src/dispatchers.cpp
64index e35a7ba7d5aa7933b02d268945a68352b1756242..ca29441e25e46be80d312436c41d1ce47ade2f06 100644
65--- a/src/dispatchers.cpp
66+++ b/src/dispatchers.cpp
67@@ -64,6 +64,17 @@ void dispatch_changegroup(std::string value) {
68 //}
69 }
70
71+void dispatch_changeephemerality(std::string value) {
72+ int workspace = workspace_for_action();
73+ if (workspace == -1) return;
74+
75+ auto args = CVarList(value);
76+
77+ bool ephemeral = args[0] == "true";
78+
79+ g_Hy3Layout->changeGroupEphemeralityOnWorkspace(workspace, ephemeral);
80+}
81+
82
83 std::optional<ShiftDirection> parseShiftArg(std::string arg) {
84 if (arg == "l" || arg == "left") return ShiftDirection::Left;
85@@ -211,6 +222,7 @@ void dispatch_debug(std::string arg) {
86 void registerDispatchers() {
87 HyprlandAPI::addDispatcher(PHANDLE, "hy3:makegroup", dispatch_makegroup);
88 HyprlandAPI::addDispatcher(PHANDLE, "hy3:changegroup", dispatch_changegroup);
89+ HyprlandAPI::addDispatcher(PHANDLE, "hy3:changeephemerality", dispatch_changeephemerality);
90 HyprlandAPI::addDispatcher(PHANDLE, "hy3:movefocus", dispatch_movefocus);
91 HyprlandAPI::addDispatcher(PHANDLE, "hy3:movewindow", dispatch_movewindow);
92 HyprlandAPI::addDispatcher(PHANDLE, "hy3:changefocus", dispatch_changefocus);