fix(default-apps): Avoid creating dropdowns for empty categories

This commit is contained in:
Md istekhar 2026-01-30 04:31:11 +05:30 • committed by GitHub
parent c654b6764b
commit 18beed5712
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 203 additions and 100 deletions

View file

@ -285,10 +285,18 @@ fn apps() -> Section<crate::pages::Message> {
return widget::row().into(); return widget::row().into();
}; };
// Avoid creating popup_dropdown for empty app lists.
// Empty categories are rendered as non-interactive text to prevent Wayland crashes.
settings::section() settings::section()
.title(&section.title) .title(&section.title)
.add({ .add({
let meta = &mime_apps.apps[DROPDOWN_WEB_BROWSER]; let meta = &mime_apps.apps[DROPDOWN_WEB_BROWSER];
if meta.apps.is_empty() {
settings::flex_item(
fl!("default-apps", "web-browser"),
widget::text(fl!("default-apps", "not-installed")),
)
} else {
settings::flex_item( settings::flex_item(
fl!("default-apps", "web-browser"), fl!("default-apps", "web-browser"),
dropdown::popup_dropdown( dropdown::popup_dropdown(
@ -297,14 +305,25 @@ fn apps() -> Section<crate::pages::Message> {
|id| Message::SetDefault(Category::WebBrowser, id), |id| Message::SetDefault(Category::WebBrowser, id),
cosmic::iced::window::Id::RESERVED, cosmic::iced::window::Id::RESERVED,
Message::Surface, Message::Surface,
|a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)), |a| {
crate::app::Message::PageMessage(
crate::pages::Message::DefaultApps(a),
)
},
) )
.icons(Cow::Borrowed(&meta.icons)), .icons(Cow::Borrowed(&meta.icons)),
) )
.min_item_width(300.0) .min_item_width(300.0)
}
}) })
.add({ .add({
let meta = &mime_apps.apps[DROPDOWN_FILE_MANAGER]; let meta = &mime_apps.apps[DROPDOWN_FILE_MANAGER];
if meta.apps.is_empty() {
settings::flex_item(
fl!("default-apps", "file-manager"),
widget::text(fl!("default-apps", "not-installed")),
)
} else {
settings::flex_item( settings::flex_item(
fl!("default-apps", "file-manager"), fl!("default-apps", "file-manager"),
dropdown::popup_dropdown( dropdown::popup_dropdown(
@ -313,13 +332,24 @@ fn apps() -> Section<crate::pages::Message> {
|id| Message::SetDefault(Category::FileManager, id), |id| Message::SetDefault(Category::FileManager, id),
cosmic::iced::window::Id::RESERVED, cosmic::iced::window::Id::RESERVED,
Message::Surface, Message::Surface,
|a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)), |a| {
crate::app::Message::PageMessage(
crate::pages::Message::DefaultApps(a),
)
},
) )
.icons(Cow::Borrowed(&meta.icons)), .icons(Cow::Borrowed(&meta.icons)),
) )
}
}) })
.add({ .add({
let meta = &mime_apps.apps[DROPDOWN_MAIL]; let meta = &mime_apps.apps[DROPDOWN_MAIL];
if meta.apps.is_empty() {
settings::flex_item(
fl!("default-apps", "mail-client"),
widget::text(fl!("default-apps", "not-installed")),
)
} else {
settings::flex_item( settings::flex_item(
fl!("default-apps", "mail-client"), fl!("default-apps", "mail-client"),
dropdown::popup_dropdown( dropdown::popup_dropdown(
@ -328,13 +358,24 @@ fn apps() -> Section<crate::pages::Message> {
|id| Message::SetDefault(Category::Mail, id), |id| Message::SetDefault(Category::Mail, id),
cosmic::iced::window::Id::RESERVED, cosmic::iced::window::Id::RESERVED,
Message::Surface, Message::Surface,
|a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)), |a| {
crate::app::Message::PageMessage(
crate::pages::Message::DefaultApps(a),
)
},
) )
.icons(Cow::Borrowed(&meta.icons)), .icons(Cow::Borrowed(&meta.icons)),
) )
}
}) })
.add({ .add({
let meta = &mime_apps.apps[DROPDOWN_MUSIC]; let meta = &mime_apps.apps[DROPDOWN_MUSIC];
if meta.apps.is_empty() {
settings::flex_item(
fl!("default-apps", "music"),
widget::text(fl!("default-apps", "not-installed")),
)
} else {
settings::flex_item( settings::flex_item(
fl!("default-apps", "music"), fl!("default-apps", "music"),
dropdown::popup_dropdown( dropdown::popup_dropdown(
@ -343,13 +384,24 @@ fn apps() -> Section<crate::pages::Message> {
|id| Message::SetDefault(Category::Audio, id), |id| Message::SetDefault(Category::Audio, id),
cosmic::iced::window::Id::RESERVED, cosmic::iced::window::Id::RESERVED,
Message::Surface, Message::Surface,
|a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)), |a| {
crate::app::Message::PageMessage(
crate::pages::Message::DefaultApps(a),
)
},
) )
.icons(Cow::Borrowed(&meta.icons)), .icons(Cow::Borrowed(&meta.icons)),
) )
}
}) })
.add({ .add({
let meta = &mime_apps.apps[DROPDOWN_VIDEO]; let meta = &mime_apps.apps[DROPDOWN_VIDEO];
if meta.apps.is_empty() {
settings::flex_item(
fl!("default-apps", "video"),
widget::text(fl!("default-apps", "not-installed")),
)
} else {
settings::flex_item( settings::flex_item(
fl!("default-apps", "video"), fl!("default-apps", "video"),
dropdown::popup_dropdown( dropdown::popup_dropdown(
@ -358,13 +410,24 @@ fn apps() -> Section<crate::pages::Message> {
|id| Message::SetDefault(Category::Video, id), |id| Message::SetDefault(Category::Video, id),
cosmic::iced::window::Id::RESERVED, cosmic::iced::window::Id::RESERVED,
Message::Surface, Message::Surface,
|a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)), |a| {
crate::app::Message::PageMessage(
crate::pages::Message::DefaultApps(a),
)
},
) )
.icons(Cow::Borrowed(&meta.icons)), .icons(Cow::Borrowed(&meta.icons)),
) )
}
}) })
.add({ .add({
let meta = &mime_apps.apps[DROPDOWN_PHOTO]; let meta = &mime_apps.apps[DROPDOWN_PHOTO];
if meta.apps.is_empty() {
settings::flex_item(
fl!("default-apps", "photos"),
widget::text(fl!("default-apps", "not-installed")),
)
} else {
settings::flex_item( settings::flex_item(
fl!("default-apps", "photos"), fl!("default-apps", "photos"),
dropdown::popup_dropdown( dropdown::popup_dropdown(
@ -373,13 +436,24 @@ fn apps() -> Section<crate::pages::Message> {
|id| Message::SetDefault(Category::Image, id), |id| Message::SetDefault(Category::Image, id),
cosmic::iced::window::Id::RESERVED, cosmic::iced::window::Id::RESERVED,
Message::Surface, Message::Surface,
|a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)), |a| {
crate::app::Message::PageMessage(
crate::pages::Message::DefaultApps(a),
)
},
) )
.icons(Cow::Borrowed(&meta.icons)), .icons(Cow::Borrowed(&meta.icons)),
) )
}
}) })
.add({ .add({
let meta = &mime_apps.apps[DROPDOWN_CALENDAR]; let meta = &mime_apps.apps[DROPDOWN_CALENDAR];
if meta.apps.is_empty() {
settings::flex_item(
fl!("default-apps", "calendar"),
widget::text(fl!("default-apps", "not-installed")),
)
} else {
settings::flex_item( settings::flex_item(
fl!("default-apps", "calendar"), fl!("default-apps", "calendar"),
dropdown::popup_dropdown( dropdown::popup_dropdown(
@ -388,13 +462,24 @@ fn apps() -> Section<crate::pages::Message> {
|id| Message::SetDefault(Category::Calendar, id), |id| Message::SetDefault(Category::Calendar, id),
cosmic::iced::window::Id::RESERVED, cosmic::iced::window::Id::RESERVED,
Message::Surface, Message::Surface,
|a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)), |a| {
crate::app::Message::PageMessage(
crate::pages::Message::DefaultApps(a),
)
},
) )
.icons(Cow::Borrowed(&meta.icons)), .icons(Cow::Borrowed(&meta.icons)),
) )
}
}) })
.add({ .add({
let meta = &mime_apps.apps[DROPDOWN_TERMINAL]; let meta = &mime_apps.apps[DROPDOWN_TERMINAL];
if meta.apps.is_empty() {
settings::flex_item(
fl!("default-apps", "terminal"),
widget::text(fl!("default-apps", "not-installed")),
)
} else {
settings::flex_item( settings::flex_item(
fl!("default-apps", "terminal"), fl!("default-apps", "terminal"),
dropdown::popup_dropdown( dropdown::popup_dropdown(
@ -403,13 +488,24 @@ fn apps() -> Section<crate::pages::Message> {
|id| Message::SetDefault(Category::Terminal, id), |id| Message::SetDefault(Category::Terminal, id),
cosmic::iced::window::Id::RESERVED, cosmic::iced::window::Id::RESERVED,
Message::Surface, Message::Surface,
|a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)), |a| {
crate::app::Message::PageMessage(
crate::pages::Message::DefaultApps(a),
)
},
) )
.icons(Cow::Borrowed(&meta.icons)), .icons(Cow::Borrowed(&meta.icons)),
) )
}
}) })
.add({ .add({
let meta = &mime_apps.apps[DROPDOWN_TEXT_EDITOR]; let meta = &mime_apps.apps[DROPDOWN_TEXT_EDITOR];
if meta.apps.is_empty() {
settings::flex_item(
fl!("default-apps", "text-editor"),
widget::text(fl!("default-apps", "not-installed")),
)
} else {
settings::flex_item( settings::flex_item(
fl!("default-apps", "text-editor"), fl!("default-apps", "text-editor"),
dropdown::popup_dropdown( dropdown::popup_dropdown(
@ -418,10 +514,15 @@ fn apps() -> Section<crate::pages::Message> {
|id| Message::SetDefault(Category::TextEditor, id), |id| Message::SetDefault(Category::TextEditor, id),
cosmic::iced::window::Id::RESERVED, cosmic::iced::window::Id::RESERVED,
Message::Surface, Message::Surface,
|a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)), |a| {
crate::app::Message::PageMessage(
crate::pages::Message::DefaultApps(a),
)
},
) )
.icons(Cow::Borrowed(&meta.icons)), .icons(Cow::Borrowed(&meta.icons)),
) )
}
}) })
.apply(Element::from) .apply(Element::from)
.map(crate::pages::Message::DefaultApps) .map(crate::pages::Message::DefaultApps)

View file

@ -843,6 +843,8 @@ default-apps = Default Applications
.terminal = Terminal .terminal = Terminal
.other-associations = Other associations .other-associations = Other associations
.text-editor = Text Editor .text-editor = Text Editor
.not-installed = Not installed
## Applications: Startup applications ## Applications: Startup applications