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