00262d89dd85c5fb8a861bf0a3cff4a955ec6a24

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

Message

Render tab bars based on the topmost window

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;