1fa5ce199bd8eaa12c5a41de87c8bfffea0bf0d3

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

Message

Fix urgent state in tab bars

Diff

  1diff --git a/src/Hy3Layout.cpp b/src/Hy3Layout.cpp
  2index f3704b0fe8942774e220b306595f84f105e38250..eeaa1750ac16bb29dc21b4cf5fb165215eb15b70 100644
  3--- a/src/Hy3Layout.cpp
  4+++ b/src/Hy3Layout.cpp
  5@@ -1320,7 +1320,9 @@ void Hy3Layout::replaceWindowDataWith(CWindow* from, CWindow* to) {
  6 std::unique_ptr<HOOK_CALLBACK_FN> renderHookPtr
  7     = std::make_unique<HOOK_CALLBACK_FN>(Hy3Layout::renderHook);
  8 std::unique_ptr<HOOK_CALLBACK_FN> windowTitleHookPtr
  9-    = std::make_unique<HOOK_CALLBACK_FN>(Hy3Layout::windowTitleHook);
 10+    = std::make_unique<HOOK_CALLBACK_FN>(Hy3Layout::windowGroupUpdateRecursiveHook);
 11+std::unique_ptr<HOOK_CALLBACK_FN> urgentHookPtr
 12+    = std::make_unique<HOOK_CALLBACK_FN>(Hy3Layout::windowGroupUrgentHook);
 13 std::unique_ptr<HOOK_CALLBACK_FN> tickHookPtr
 14     = std::make_unique<HOOK_CALLBACK_FN>(Hy3Layout::tickHook);
 15 
 16@@ -1334,6 +1336,7 @@ void Hy3Layout::onEnable() {
 17 
 18 	HyprlandAPI::registerCallbackStatic(PHANDLE, "render", renderHookPtr.get());
 19 	HyprlandAPI::registerCallbackStatic(PHANDLE, "windowTitle", windowTitleHookPtr.get());
 20+	HyprlandAPI::registerCallbackStatic(PHANDLE, "urgent", urgentHookPtr.get());
 21 	HyprlandAPI::registerCallbackStatic(PHANDLE, "tick", tickHookPtr.get());
 22 	selection_hook::enable();
 23 }
 24@@ -1341,6 +1344,7 @@ void Hy3Layout::onEnable() {
 25 void Hy3Layout::onDisable() {
 26 	HyprlandAPI::unregisterCallback(PHANDLE, renderHookPtr.get());
 27 	HyprlandAPI::unregisterCallback(PHANDLE, windowTitleHookPtr.get());
 28+	HyprlandAPI::unregisterCallback(PHANDLE, urgentHookPtr.get());
 29 	HyprlandAPI::unregisterCallback(PHANDLE, tickHookPtr.get());
 30 	selection_hook::disable();
 31 	this->nodes.clear();
 32@@ -1744,7 +1748,14 @@ void Hy3Layout::renderHook(void*, std::any data) {
 33 	}
 34 }
 35 
 36-void Hy3Layout::windowTitleHook(void*, std::any data) {
 37+void Hy3Layout::windowGroupUrgentHook(void* p, std::any data) {
 38+	CWindow* window = std::any_cast<CWindow*>(data);
 39+	if (window == nullptr) return;
 40+	window->m_bIsUrgent = true;
 41+	Hy3Layout::windowGroupUpdateRecursiveHook(p, data);
 42+}
 43+
 44+void Hy3Layout::windowGroupUpdateRecursiveHook(void*, std::any data) {
 45 	CWindow* window = std::any_cast<CWindow*>(data);
 46 	if (window == nullptr) return;
 47 	auto* node = g_Hy3Layout->getNodeFromWindow(window);
 48diff --git a/src/Hy3Layout.hpp b/src/Hy3Layout.hpp
 49index 7f06632d58572877143bb4a10c5c3fd909582352..5e1bd4bca90f3e63d44618b497e900158546f434 100644
 50--- a/src/Hy3Layout.hpp
 51+++ b/src/Hy3Layout.hpp
 52@@ -145,7 +145,8 @@ public:
 53 	Hy3Node* getWorkspaceFocusedNode(const int&);
 54 
 55 	static void renderHook(void*, std::any);
 56-	static void windowTitleHook(void*, std::any);
 57+	static void windowGroupUrgentHook(void*, std::any);
 58+	static void windowGroupUpdateRecursiveHook(void*, std::any);
 59 	static void tickHook(void*, std::any);
 60 
 61 	std::list<Hy3Node> nodes;
 62diff --git a/src/TabGroup.cpp b/src/TabGroup.cpp
 63index e2bb44949bce4e8b1839a3b62504cf0a56765af6..729d156fd7e59ee7a8d0e49ecdbccc18f04a6aea 100644
 64--- a/src/TabGroup.cpp
 65+++ b/src/TabGroup.cpp
 66@@ -189,16 +189,11 @@ void Hy3TabBarEntry::prepareTexture(float scale, wlr_box& box) {
 67 		cairo_restore(cairo);
 68 
 69 		// set brush
 70-		CColor c;
 71-		if (this->focused.fl() > 0.0) {
 72-			c = (CColor(*col_active) * this->focused.fl())
 73-			  + (CColor(*col_inactive) * (1.0 - this->focused.fl()));
 74-		} else if (this->urgent.fl() > 0.0) {
 75-			c = (CColor(*col_urgent) * this->urgent.fl())
 76-			  + (CColor(*col_inactive) * (1.0 - this->urgent.fl()));
 77-		} else {
 78-			c = CColor(*col_inactive);
 79-		}
 80+		auto focused = this->focused.fl();
 81+		auto urgent = this->urgent.fl();
 82+		auto inactive = 1.0 - (focused + urgent);
 83+		auto c = (CColor(*col_active) * focused) + (CColor(*col_urgent) * urgent)
 84+		       + (CColor(*col_inactive) * inactive);
 85 
 86 		cairo_set_source_rgba(cairo, c.r, c.g, c.b, c.a);
 87 
 88@@ -239,16 +234,8 @@ void Hy3TabBarEntry::prepareTexture(float scale, wlr_box& box) {
 89 			pango_layout_set_width(layout, width * PANGO_SCALE);
 90 			pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END);
 91 
 92-			CColor c;
 93-			if (this->focused.fl() > 0.0) {
 94-				c = (CColor(*col_text_active) * this->focused.fl())
 95-				  + (CColor(*col_text_inactive) * (1.0 - this->focused.fl()));
 96-			} else if (this->urgent.fl() > 0.0) {
 97-				c = (CColor(*col_text_urgent) * this->urgent.fl())
 98-				  + (CColor(*col_text_inactive) * (1.0 - this->urgent.fl()));
 99-			} else {
100-				c = CColor(*col_text_inactive);
101-			}
102+			auto c = (CColor(*col_text_active) * focused) + (CColor(*col_text_urgent) * urgent)
103+			       + (CColor(*col_text_inactive) * inactive);
104 
105 			cairo_set_source_rgba(cairo, c.r, c.g, c.b, c.a);
106