f08c7ff2e45ea6a5668532b86521f78d683cb4ce

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

Message

Fix `getNextWindowCandidate` returning null if a group is focused

Diff

 1diff --git a/src/Hy3Layout.cpp b/src/Hy3Layout.cpp
 2index 0e14fd3d253c85453c3f18cc5dca55650c23a0d5..e00394e76e8d0e6a0cc24f409061c6b4bb51b272 100644
 3--- a/src/Hy3Layout.cpp
 4+++ b/src/Hy3Layout.cpp
 5@@ -641,7 +641,7 @@ void Hy3Layout::alterSplitRatio(CWindow* pWindow, float delta, bool exact) {
 6 std::string Hy3Layout::getLayoutName() { return "hy3"; }
 7 
 8 CWindow* Hy3Layout::getNextWindowCandidate(CWindow* window) {
 9-	auto* node = this->getWorkspaceFocusedNode(window->m_iWorkspaceID);
10+	auto* node = this->getWorkspaceFocusedNode(window->m_iWorkspaceID, true);
11 	if (node == nullptr) return nullptr;
12 
13 	switch (node->data.type) {
14@@ -1051,10 +1051,10 @@ Hy3Node* Hy3Layout::getWorkspaceRootGroup(const int& workspace) {
15 	return nullptr;
16 }
17 
18-Hy3Node* Hy3Layout::getWorkspaceFocusedNode(const int& workspace) {
19+Hy3Node* Hy3Layout::getWorkspaceFocusedNode(const int& workspace, bool ignore_group_focus) {
20 	auto* rootNode = this->getWorkspaceRootGroup(workspace);
21 	if (rootNode == nullptr) return nullptr;
22-	return rootNode->getFocusedNode();
23+	return rootNode->getFocusedNode(ignore_group_focus);
24 }
25 
26 void Hy3Layout::renderHook(void*, std::any data) {
27diff --git a/src/Hy3Layout.hpp b/src/Hy3Layout.hpp
28index b77ed7a0813c83d0ed81b385cd69f6d3a3c1c419..62851fcf1f2e61ac80465897be18f8dbe5234ab7 100644
29--- a/src/Hy3Layout.hpp
30+++ b/src/Hy3Layout.hpp
31@@ -88,7 +88,7 @@ public:
32 	bool shouldRenderSelected(CWindow*);
33 
34 	Hy3Node* getWorkspaceRootGroup(const int& workspace);
35-	Hy3Node* getWorkspaceFocusedNode(const int& workspace);
36+	Hy3Node* getWorkspaceFocusedNode(const int& workspace, bool ignore_group_focus = false);
37 
38 	static void renderHook(void*, std::any);
39 	static void windowGroupUrgentHook(void*, std::any);
40diff --git a/src/Hy3Node.cpp b/src/Hy3Node.cpp
41index 97436e3cd972ea49c053330264db590c7b13e135..1b2c34bbc69287f6c8d4b36e9d4afd0b448048a8 100644
42--- a/src/Hy3Node.cpp
43+++ b/src/Hy3Node.cpp
44@@ -191,14 +191,16 @@ void Hy3Node::raiseToTop() {
45 	}
46 }
47 
48-Hy3Node* Hy3Node::getFocusedNode() {
49+Hy3Node* Hy3Node::getFocusedNode(bool ignore_group_focus) {
50 	switch (this->data.type) {
51 	case Hy3NodeType::Window: return this;
52 	case Hy3NodeType::Group:
53-		if (this->data.as_group.focused_child == nullptr || this->data.as_group.group_focused) {
54+		if (this->data.as_group.focused_child == nullptr
55+		    || (!ignore_group_focus && this->data.as_group.group_focused))
56+		{
57 			return this;
58 		} else {
59-			return this->data.as_group.focused_child->getFocusedNode();
60+			return this->data.as_group.focused_child->getFocusedNode(ignore_group_focus);
61 		}
62 	}
63 }
64diff --git a/src/Hy3Node.hpp b/src/Hy3Node.hpp
65index e98f2cb51437a50ee51d4a38d62ff1c87e9f7788..0b29099d51f63de4b3e0502655963fca135d6559 100644
66--- a/src/Hy3Node.hpp
67+++ b/src/Hy3Node.hpp
68@@ -84,7 +84,7 @@ struct Hy3Node {
69 	bool focusWindow();
70 	void markFocused();
71 	void raiseToTop();
72-	Hy3Node* getFocusedNode();
73+	Hy3Node* getFocusedNode(bool ignore_group_focus = false);
74 	bool isIndirectlyFocused();
75 
76 	void recalcSizePosRecursive(bool no_animation = false);