Diff
1diff --git a/README.md b/README.md
2index e50bc79d6286dd317ec864fa33a367b055c4181a..dd112195f50684e39aa8fc7f6328ec001e690ca7 100644
3--- a/README.md
4+++ b/README.md
5@@ -95,6 +95,7 @@ plugin {
6 - `visible` - only move between visible nodes, not hidden tabs
7 - `hy3:movewindow, <l | u | d | r | left | down | up | right>, [once]` - move a window left, up, down, or right
8 - `once` - only move directly to the neighboring group, without moving into any of its subgroups
9+ - `hy3:killactive` - close all windows in the focused node
10 - `hy3:changefocus, <top | bottom | raise | lower | tab | tabnode>`
11 - `top` - focus all nodes in the workspace
12 - `bottom` - focus the single root selection window
13diff --git a/src/Hy3Layout.cpp b/src/Hy3Layout.cpp
14index 2e89ffe3289d3128076a0498cf5231d4218c33ee..b86912c4df5b966c0e86710dbea852b5e3e4a1d6 100644
15--- a/src/Hy3Layout.cpp
16+++ b/src/Hy3Layout.cpp
17@@ -302,6 +302,17 @@ std::string Hy3Node::getTitle() {
18 return "";
19 }
20
21+void Hy3Node::appendAllWindows(std::vector<CWindow*>& list) {
22+ switch (this->data.type) {
23+ case Hy3NodeData::Window: list.push_back(this->data.as_window); break;
24+ case Hy3NodeData::Group:
25+ for (auto* child: this->data.as_group.children) {
26+ child->appendAllWindows(list);
27+ }
28+ break;
29+ }
30+}
31+
32 void markGroupFocusedRecursive(Hy3GroupData& group) {
33 group.group_focused = true;
34 for (auto& child: group.children) {
35@@ -1855,6 +1866,19 @@ hastab:
36 tab_node->recalcSizePosRecursive();
37 }
38
39+void Hy3Layout::killFocusedNode(int workspace) {
40+ auto* node = this->getWorkspaceFocusedNode(workspace);
41+ if (node == nullptr) return;
42+
43+ std::vector<CWindow*> windows;
44+ node->appendAllWindows(windows);
45+
46+ for (auto* window: windows) {
47+ window->setHidden(false);
48+ g_pCompositor->closeWindow(window);
49+ }
50+}
51+
52 bool Hy3Layout::shouldRenderSelected(CWindow* window) {
53 if (window == nullptr) return false;
54 auto* root = this->getWorkspaceRootGroup(window->m_iWorkspaceID);
55diff --git a/src/Hy3Layout.hpp b/src/Hy3Layout.hpp
56index 39f6b6ff5a28021153a4aef3ce9795ed0dae06ac..ac01478830b5fd552a3ce6dd78163e255b5784e7 100644
57--- a/src/Hy3Layout.hpp
58+++ b/src/Hy3Layout.hpp
59@@ -113,6 +113,7 @@ struct Hy3Node {
60 bool isIndirectlyFocused();
61 Hy3Node* findNodeForTabGroup(Hy3TabGroup&);
62 std::string getTitle();
63+ void appendAllWindows(std::vector<CWindow*>&);
64
65 bool operator==(const Hy3Node&) const;
66
67@@ -159,6 +160,7 @@ public:
68 void shiftFocus(int, ShiftDirection, bool);
69 void changeFocus(int, FocusShift);
70 void focusTab(int, TabFocus, TabFocusMousePriority, bool);
71+ void killFocusedNode(int);
72
73 bool shouldRenderSelected(CWindow*);
74
75diff --git a/src/main.cpp b/src/main.cpp
76index efc00403e8e932910c33b9eaa7aad13dea0a4e01..1aa5bbd97e68db0e0b1bf766b8d83535b60b8933 100644
77--- a/src/main.cpp
78+++ b/src/main.cpp
79@@ -126,6 +126,13 @@ void dispatch_focustab(std::string value) {
80 g_Hy3Layout->focusTab(workspace, focus, mouse, wrap_scroll);
81 }
82
83+void dispatch_killactive(std::string value) {
84+ int workspace = workspace_for_action();
85+ if (workspace == -1) return;
86+
87+ g_Hy3Layout->killFocusedNode(workspace);
88+}
89+
90 void dispatch_debug(std::string arg) {
91 int workspace = workspace_for_action();
92 if (workspace == -1) return;
93@@ -204,6 +211,7 @@ APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
94 HyprlandAPI::addDispatcher(PHANDLE, "hy3:movewindow", dispatch_movewindow);
95 HyprlandAPI::addDispatcher(PHANDLE, "hy3:changefocus", dispatch_changefocus);
96 HyprlandAPI::addDispatcher(PHANDLE, "hy3:focustab", dispatch_focustab);
97+ HyprlandAPI::addDispatcher(PHANDLE, "hy3:killactive", dispatch_killactive);
98 HyprlandAPI::addDispatcher(PHANDLE, "hy3:debugnodes", dispatch_debug);
99
100 return {"hy3", "i3 like layout for hyprland", "outfoxxed", "0.1"};