fix(desktop_entries): respect NoDisplay precedence

Closes: pop-os/cosmic-epoch#905

`NoDisplay` allows applications or users to signal that an entry
shouldn't be shown in menus. This is useful for entries that may launch
an app in a certain way such as opening a specific menu or handling a
MIME type. Some desktop environments use it to signal special cases.

`NoDisplay` as well as `Hidden` allow user defined entries to hide apps.
User defined desktop entries should override the system's applications,
but the old logic continued parsing entries from all locations instead
of stopping at a user override.
This commit is contained in:
Joshua Megnauth 2024-09-30 18:10:36 +00:00 committed by GitHub
parent 6a1b8b9ad0
commit 8cc0d28402
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -76,9 +76,15 @@ impl<W: AsyncWrite + Unpin> App<W> {
let desktop_entries = DesktopEntry::from_paths(paths, &locales)
.filter_map(|de| {
de.ok().and_then(|de| {
if deduplicator.contains(de.appid.as_ref()) {
// Treat Flatpak and system apps differently in the cache so they don't
// override each other
let appid = de.flatpak().unwrap_or_else(|| de.appid.as_ref());
if deduplicator.contains(appid) {
return None;
}
// Always cache already visited entries to allow overriding entries e.g. by
// placing a modified copy in ~/.local/share/applications/
deduplicator.insert(appid.to_owned());
if de.name(&self.locales).is_none() {
return None;
@ -128,12 +134,14 @@ impl<W: AsyncWrite + Unpin> App<W> {
return None;
}
}
} else {
if de.no_display() {
return None;
}
}
deduplicator.insert(de.appid.to_string());
// Treat `OnlyShowIn` as an override otherwise do not show if `NoDisplay` is true
// Some desktop environments set `OnlyShowIn` and `NoDisplay = true` to
// indicate special entries
else if de.no_display() {
return None;
}
Some(de)
})
})