ee8c49357f5a8052e3b57ffdb15225287d1d844a

Author
outfoxxed <outfoxxed@outfoxxed.me>
Committer
outfoxxed <outfoxxed@outfoxxed.me>
Date

Message

Add hy3:killactive dispatcher for killing the focused node

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"};