diff --git a/meson.build b/meson.build index efcb469f1d..f70527ab08 100644 --- a/meson.build +++ b/meson.build @@ -1161,6 +1161,7 @@ if build_tests 'system_monitor_service', 'taskbar_widget', 'time_format', + 'tray_identifier', 'triad_workspace_backend', 'ui_tree_reconciler', 'wayland_toplevels_identity', diff --git a/src/dbus/tray/tray_service.cpp b/src/dbus/tray/tray_service.cpp index 3fcc5452b7..b14426ea47 100644 --- a/src/dbus/tray/tray_service.cpp +++ b/src/dbus/tray/tray_service.cpp @@ -2118,7 +2118,7 @@ void TrayService::refreshItemMetadata(const std::string& itemId) { next.statusNotifierTitle = std::move(statusNotifierTitle); next.statusNotifierDescription = std::move(statusNotifierDescription); next.status = get_item_property_string_from(properties, "Status", cur.status); - next.needsAttention = (next.status == "NeedsAttention"); + next.needsAttention = (StringUtils::toLower(next.status) == "needsattention"); if (next.itemName == "chrome_status_icon_1" && !next.statusNotifierTitle.empty()) { next.itemName = next.itemName + "::" + next.statusNotifierTitle; diff --git a/src/shell/bar/widgets/tray_widget.cpp b/src/shell/bar/widgets/tray_widget.cpp index 1c04268d12..292994480d 100644 --- a/src/shell/bar/widgets/tray_widget.cpp +++ b/src/shell/bar/widgets/tray_widget.cpp @@ -526,7 +526,7 @@ void TrayWidget::rebuild(Renderer& renderer) { m_drawerChevronGlyph.clear(); bool hasDrawerItems = false; for (const auto& item : m_items) { - if (isHiddenItem(item) || isPinnedItem(item)) { + if (tray::isPassiveStatus(item) || isHiddenItem(item) || isPinnedItem(item)) { continue; } hasDrawerItems = true; @@ -581,7 +581,7 @@ void TrayWidget::rebuild(Renderer& renderer) { Flex* gridRow = nullptr; std::size_t gridCol = 0; for (const auto& item : m_items) { - if (isHiddenItem(item)) { + if (tray::isPassiveStatus(item) || isHiddenItem(item)) { continue; } if (m_drawerMode && !isPinnedItem(item)) { diff --git a/src/shell/tray/tray_drawer_panel.cpp b/src/shell/tray/tray_drawer_panel.cpp index 2b7ae4650b..ab49d861de 100644 --- a/src/shell/tray/tray_drawer_panel.cpp +++ b/src/shell/tray/tray_drawer_panel.cpp @@ -196,6 +196,9 @@ std::size_t TrayDrawerPanel::visibleItemCount() const { }; std::size_t visible = 0; for (const auto& item : m_tray->items()) { + if (tray::isPassiveStatus(item)) { + continue; + } const bool hidden = std::ranges::any_of(hiddenLower, [&](const std::string& token) { return tokenMatches(token, item); }); const bool pinned = diff --git a/src/shell/tray/tray_identifier.h b/src/shell/tray/tray_identifier.h index 707f3652e8..d0e82d1aa6 100644 --- a/src/shell/tray/tray_identifier.h +++ b/src/shell/tray/tray_identifier.h @@ -13,6 +13,8 @@ namespace tray { inline bool isUniqueBusName(std::string_view value) { return !value.empty() && value.front() == ':'; } + inline bool isPassiveStatus(const TrayItemInfo& item) { return StringUtils::toLower(item.status) == "passive"; } + inline bool isTransientUniqueIdentifier(std::string_view value) { return isUniqueBusName(value) || value.contains("/:"); } diff --git a/tests/tray_identifier_test.cpp b/tests/tray_identifier_test.cpp new file mode 100644 index 0000000000..9d6955269e --- /dev/null +++ b/tests/tray_identifier_test.cpp @@ -0,0 +1,22 @@ +#include "shell/tray/tray_identifier.h" + +#include + +int main() { + TrayItemInfo item; + + item.status = "Passive"; + assert(tray::isPassiveStatus(item)); + + item.status = "passive"; + assert(tray::isPassiveStatus(item)); + + item.status = "Active"; + assert(!tray::isPassiveStatus(item)); + + item.status = "NeedsAttention"; + assert(!tray::isPassiveStatus(item)); + + item.status.clear(); + assert(!tray::isPassiveStatus(item)); +}