Diff
1diff --git a/src/Hy3Layout.cpp b/src/Hy3Layout.cpp
2index efe6b27bf23dd7530d1fb022464ef82ce34e604a..d80cf1c593fafa1d91ca872a285c2bb898d92659 100644
3--- a/src/Hy3Layout.cpp
4+++ b/src/Hy3Layout.cpp
5@@ -298,7 +298,6 @@ void Hy3Node::markFocused() {
6 // update focus
7 if (this->data.type == Hy3NodeData::Group) {
8 this->data.as_group.group_focused = true;
9- this->data.as_group.focused_child = nullptr;
10 }
11
12 auto* node2 = node;
13@@ -507,6 +506,39 @@ void Hy3Node::swapData(Hy3Node& a, Hy3Node& b) {
14 }
15 }
16
17+struct FindTopWindowInNodeResult {
18+ CWindow* window = nullptr;
19+ size_t index = 0;
20+};
21+
22+void findTopWindowInNode(Hy3Node& node, FindTopWindowInNodeResult& result) {
23+ switch(node.data.type) {
24+ case Hy3NodeData::Window: {
25+ auto* window = node.data.as_window;
26+ auto& windows = g_pCompositor->m_vWindows;
27+
28+ for (; result.index < windows.size(); result.index++) {
29+ if (&*windows[result.index] == window) {
30+ result.window = window;
31+ break;
32+ }
33+ }
34+
35+ } break;
36+ case Hy3NodeData::Group: {
37+ auto& group = node.data.as_group;
38+
39+ if (group.layout == Hy3GroupLayout::Tabbed) {
40+ if (group.focused_child != nullptr) findTopWindowInNode(*group.focused_child, result);
41+ } else {
42+ for (auto* child: group.children) {
43+ findTopWindowInNode(*child, result);
44+ }
45+ }
46+ } break;
47+ }
48+}
49+
50 void Hy3Node::updateTabBar() {
51 if (this->data.type == Hy3NodeData::Group) {
52 auto& group = this->data.as_group;
53@@ -514,6 +546,10 @@ void Hy3Node::updateTabBar() {
54 if (group.layout == Hy3GroupLayout::Tabbed) {
55 if (group.tab_bar == nullptr) group.tab_bar = &this->layout->tab_groups.emplace_back(*this);
56 group.tab_bar->updateWithGroup(*this);
57+
58+ FindTopWindowInNodeResult result;
59+ findTopWindowInNode(*this, result);
60+ group.tab_bar->target_window = result.window;
61 } else if (group.tab_bar != nullptr) {
62 group.tab_bar->bar.beginDestroy();
63 group.tab_bar = nullptr;
64@@ -1553,12 +1589,13 @@ void renderTabs(Hy3Node& node);
65
66 void Hy3Layout::renderHook(void*, std::any data) {
67 auto render_stage = std::any_cast<eRenderStage>(data);
68- if (render_stage == RENDER_POST_WINDOWS) {
69+ if (render_stage == RENDER_POST_WINDOW) {
70 auto& tab_groups = g_Hy3Layout->tab_groups;
71 auto entry = tab_groups.begin();
72 while (entry != tab_groups.end()) {
73 if (entry->bar.destroy) tab_groups.erase(entry++);
74- else entry++->renderTabBar();
75+ else if (entry->target_window == g_pHyprOpenGL->m_pCurrentWindow) entry++->renderTabBar();
76+ else entry++;
77 }
78 }
79 }
80diff --git a/src/TabGroup.hpp b/src/TabGroup.hpp
81index e52667d031089a1728b54a6fa02cdd802c5203f1..7daf1ec55c3dacba1da86cf31e0aed2d4c291856 100644
82--- a/src/TabGroup.hpp
83+++ b/src/TabGroup.hpp
84@@ -63,6 +63,7 @@ private:
85
86 class Hy3TabGroup {
87 public:
88+ CWindow* target_window = nullptr;
89 Hy3TabBar bar;
90 CAnimatedVariable pos;
91 CAnimatedVariable size;