45d0c20cbab3eadab815755069d5314b674f84df

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

Message

Fix tab bars appearing on all workspaces

Diff

 1diff --git a/src/Hy3Layout.cpp b/src/Hy3Layout.cpp
 2index bbe12d6dc62cac3c9baeeb7f750a1eae93db42be..82dc6efe360915bca3df1a16c545425f0b6bc4b1 100644
 3--- a/src/Hy3Layout.cpp
 4+++ b/src/Hy3Layout.cpp
 5@@ -586,6 +586,7 @@ void Hy3Node::updateTabBar() {
 6 			FindTopWindowInNodeResult result;
 7 			findTopWindowInNode(*this, result);
 8 			group.tab_bar->target_window = result.window;
 9+			if (result.window != nullptr) group.tab_bar->workspace_id = result.window->m_iWorkspaceID;
10 		} else if (group.tab_bar != nullptr) {
11 			group.tab_bar->bar.beginDestroy();
12 			group.tab_bar = nullptr;
13diff --git a/src/TabGroup.cpp b/src/TabGroup.cpp
14index 32ddfb6cbaa93446afd5e9f6f46bc2e74fb63d70..56e460a3d1d4cbb05eeb540399b52a2d602eeb6e 100644
15--- a/src/TabGroup.cpp
16+++ b/src/TabGroup.cpp
17@@ -311,16 +311,28 @@ void Hy3TabGroup::renderTabBar() {
18 	static const auto* padding = &HyprlandAPI::getConfigValue(PHANDLE, "general:gaps_in")->intValue;
19 
20 	auto* monitor = g_pHyprOpenGL->m_RenderData.pMonitor;
21+	auto* workspace = g_pCompositor->getWorkspaceByID(this->workspace_id);
22 	auto scale = monitor->scale;
23 
24+	auto monitor_size = monitor->vecSize;
25 	auto pos = this->pos.vec() - monitor->vecPosition;
26 	auto size = this->size.vec();
27 	pos.y += (this->bar.vertical_pos.fl() * size.y) * (*enter_from_top ? -1 : 1);
28 
29+	if (workspace != nullptr) {
30+		pos = pos + workspace->m_vRenderOffset.vec();
31+	}
32+
33 	auto scaled_pos = Vector2D(std::round(pos.x * scale), std::round(pos.y * scale));
34 	auto scaled_size = Vector2D(std::round(size.x * scale), std::round(size.y * scale));
35 	wlr_box box = { scaled_pos.x, scaled_pos.y, scaled_size.x, scaled_size.y };
36 
37+	if (scaled_pos.x > monitor_size.x
38+			|| scaled_pos.y > monitor_size.y
39+			|| scaled_pos.x + scaled_size.x < 0
40+			|| scaled_pos.y + scaled_size.y < 0)
41+		return;
42+
43 	if (!this->bar.damaged) {
44 		pixman_region32 damage;
45 		pixman_region32_init(&damage);
46diff --git a/src/TabGroup.hpp b/src/TabGroup.hpp
47index 2834a3cdd290accf85a0651ebcac8f95cfb55084..837c28b558e310e395659b185911f6f7b3db6b6c 100644
48--- a/src/TabGroup.hpp
49+++ b/src/TabGroup.hpp
50@@ -63,6 +63,7 @@ private:
51 class Hy3TabGroup {
52 public:
53 	CWindow* target_window = nullptr;
54+	int workspace_id = -1;
55 	Hy3TabBar bar;
56 	CAnimatedVariable pos;
57 	CAnimatedVariable size;