From c8104a98ce2f2032faee0a5b8e47f06e8d5bf3cc Mon Sep 17 00:00:00 2001 From: mikairyuu Date: Sat, 10 Jan 2026 17:08:57 +0900 Subject: [PATCH] fix(status-area): lazy-load status notifier menu layouts to prevent DBus timeouts Previously, the applet subscribed to layout updates for all items immediately upon registration (eager-loading). This caused severe issues with applications like VLC, which fail to respond to `com.canonical.dbusmenu.GetLayout` calls during high-load operations (e.g., initializing video playback). These unanswered calls resulted in DBus timeouts that: 1. Flooded the connection queue. 2. Blocked the processing of other signals (like `Unregistered`). 3. Caused the applet to become unresponsive and the icon to persist (ghosting). This patch modifies the subscription logic to only subscribe to layout updates when the specific menu is actually open. This "lazy-loading" approach: - Prevents hitting applications with DBus calls during vulnerable states. - Drastically reduces unnecessary DBus traffic. --- cosmic-applet-status-area/src/components/app.rs | 3 ++- .../src/components/status_menu.rs | 13 ++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/cosmic-applet-status-area/src/components/app.rs b/cosmic-applet-status-area/src/components/app.rs index 03e56e9d..c496a80d 100644 --- a/cosmic-applet-status-area/src/components/app.rs +++ b/cosmic-applet-status-area/src/components/app.rs @@ -453,7 +453,8 @@ impl cosmic::Application for App { subscriptions.push(status_notifier_watcher::subscription().map(Msg::StatusNotifier)); for (id, menu) in &self.menus { - subscriptions.push(menu.subscription().with(*id).map(Msg::StatusMenu)); + let is_open = self.open_menu == Some(*id); + subscriptions.push(menu.subscription(is_open).with(*id).map(Msg::StatusMenu)); } subscriptions.push(activation_token_subscription(0).map(Msg::Token)); diff --git a/cosmic-applet-status-area/src/components/status_menu.rs b/cosmic-applet-status-area/src/components/status_menu.rs index 8ca6bd85..32d6cbdc 100644 --- a/cosmic-applet-status-area/src/components/status_menu.rs +++ b/cosmic-applet-status-area/src/components/status_menu.rs @@ -157,11 +157,14 @@ impl State { } } - pub fn subscription(&self) -> iced::Subscription { - iced::Subscription::batch([ - self.item.layout_subscription().map(Msg::Layout), - self.item.icon_subscription().map(Msg::Icon), - ]) + pub fn subscription(&self, is_open: bool) -> iced::Subscription { + let mut subscriptions = vec![self.item.icon_subscription().map(Msg::Icon)]; + + if is_open { + subscriptions.push(self.item.layout_subscription().map(Msg::Layout)); + } + + iced::Subscription::batch(subscriptions) } pub fn opened(&self) {