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);