fix(status-area): better handle apps with no menus

This commit is contained in:
Ashley Wulber 2025-11-06 09:32:54 -05:00 committed by Ashley Wulber
parent bd98de8228
commit b026db6f7c
3 changed files with 54 additions and 12 deletions

View file

@ -460,7 +460,11 @@ impl cosmic::Application for App {
.icon_button_from_handle(icon.clone().symbolic(true)),
_ => self.core.applet.icon_button(menu.icon_name()),
}
.on_press_down(Msg::TogglePopup(*id)),
.on_press_down(if menu.item.menu_proxy().is_some() {
Msg::TogglePopup(*id)
} else {
Msg::StatusMenu((*id, status_menu::Msg::Click(0, true)))
}),
)
.on_enter(Msg::Hovered(*id))
.into()

View file

@ -20,7 +20,7 @@ pub enum Msg {
}
pub struct State {
item: StatusNotifierItem,
pub item: StatusNotifierItem,
layout: Option<Layout>,
expanded: Option<i32>,
icon_name: String,
@ -101,9 +101,19 @@ impl State {
let Some((id, is_submenu)) = self.click_event else {
return iced::Task::none();
};
let menu_proxy = self.item.menu_proxy().clone();
let item_proxy = self.item.item_proxy().clone();
let Some(menu_proxy) = self.item.menu_proxy().cloned() else {
tokio::spawn(async move {
let _ = item_proxy.provide_xdg_activation_token(token).await;
if let Err(err) = item_proxy.activate(0, 0).await {
tracing::error!(
"Error activating status notifier item without menu proxy: {err:?}"
);
}
});
return iced::Task::none();
};
tokio::spawn(async move {
let _ = item_proxy.provide_xdg_activation_token(token).await;
let _ = menu_proxy.event(id, "clicked", &0.into(), 0).await;
@ -150,7 +160,9 @@ impl State {
}
pub fn opened(&self) {
let menu_proxy = self.item.menu_proxy().clone();
let Some(menu_proxy) = self.item.menu_proxy().cloned() else {
return;
};
tokio::spawn(async move {
let _ = menu_proxy.event(0, "opened", &0i32.into(), 0).await;
let _ = menu_proxy.about_to_show(0).await;
@ -158,7 +170,9 @@ impl State {
}
pub fn closed(&self) {
let menu_proxy = self.item.menu_proxy().clone();
let Some(menu_proxy) = self.item.menu_proxy().cloned() else {
return;
};
tokio::spawn(async move {
let _ = menu_proxy.event(0, "closed", &0i32.into(), 0).await;
});