From f08c7ff2e45ea6a5668532b86521f78d683cb4ce Mon Sep 17 00:00:00 2001 From: outfoxxed Date: Mon, 31 Jul 2023 20:38:58 -0700 Subject: [PATCH] Fix `getNextWindowCandidate` returning null if a group is focused --- src/Hy3Layout.cpp | 6 +++--- src/Hy3Layout.hpp | 2 +- src/Hy3Node.cpp | 8 +++++--- src/Hy3Node.hpp | 2 +- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/Hy3Layout.cpp b/src/Hy3Layout.cpp index 0e14fd3..e00394e 100644 --- a/src/Hy3Layout.cpp +++ b/src/Hy3Layout.cpp @@ -641,7 +641,7 @@ void Hy3Layout::alterSplitRatio(CWindow* pWindow, float delta, bool exact) { std::string Hy3Layout::getLayoutName() { return "hy3"; } CWindow* Hy3Layout::getNextWindowCandidate(CWindow* window) { - auto* node = this->getWorkspaceFocusedNode(window->m_iWorkspaceID); + auto* node = this->getWorkspaceFocusedNode(window->m_iWorkspaceID, true); if (node == nullptr) return nullptr; switch (node->data.type) { @@ -1051,10 +1051,10 @@ Hy3Node* Hy3Layout::getWorkspaceRootGroup(const int& workspace) { return nullptr; } -Hy3Node* Hy3Layout::getWorkspaceFocusedNode(const int& workspace) { +Hy3Node* Hy3Layout::getWorkspaceFocusedNode(const int& workspace, bool ignore_group_focus) { auto* rootNode = this->getWorkspaceRootGroup(workspace); if (rootNode == nullptr) return nullptr; - return rootNode->getFocusedNode(); + return rootNode->getFocusedNode(ignore_group_focus); } void Hy3Layout::renderHook(void*, std::any data) { diff --git a/src/Hy3Layout.hpp b/src/Hy3Layout.hpp index b77ed7a..62851fc 100644 --- a/src/Hy3Layout.hpp +++ b/src/Hy3Layout.hpp @@ -88,7 +88,7 @@ public: bool shouldRenderSelected(CWindow*); Hy3Node* getWorkspaceRootGroup(const int& workspace); - Hy3Node* getWorkspaceFocusedNode(const int& workspace); + Hy3Node* getWorkspaceFocusedNode(const int& workspace, bool ignore_group_focus = false); static void renderHook(void*, std::any); static void windowGroupUrgentHook(void*, std::any); diff --git a/src/Hy3Node.cpp b/src/Hy3Node.cpp index 97436e3..1b2c34b 100644 --- a/src/Hy3Node.cpp +++ b/src/Hy3Node.cpp @@ -191,14 +191,16 @@ void Hy3Node::raiseToTop() { } } -Hy3Node* Hy3Node::getFocusedNode() { +Hy3Node* Hy3Node::getFocusedNode(bool ignore_group_focus) { switch (this->data.type) { case Hy3NodeType::Window: return this; case Hy3NodeType::Group: - if (this->data.as_group.focused_child == nullptr || this->data.as_group.group_focused) { + if (this->data.as_group.focused_child == nullptr + || (!ignore_group_focus && this->data.as_group.group_focused)) + { return this; } else { - return this->data.as_group.focused_child->getFocusedNode(); + return this->data.as_group.focused_child->getFocusedNode(ignore_group_focus); } } } diff --git a/src/Hy3Node.hpp b/src/Hy3Node.hpp index e98f2cb..0b29099 100644 --- a/src/Hy3Node.hpp +++ b/src/Hy3Node.hpp @@ -84,7 +84,7 @@ struct Hy3Node { bool focusWindow(); void markFocused(); void raiseToTop(); - Hy3Node* getFocusedNode(); + Hy3Node* getFocusedNode(bool ignore_group_focus = false); bool isIndirectlyFocused(); void recalcSizePosRecursive(bool no_animation = false);