From 76c7100ef454c4b92e19a7f531e701694b24451b Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Tue, 29 Apr 2025 13:53:16 -0400 Subject: [PATCH] refactor: add only_show_in filter for loaded apps --- src/desktop.rs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/desktop.rs b/src/desktop.rs index 1fef2e7d..c9c4c491 100644 --- a/src/desktop.rs +++ b/src/desktop.rs @@ -53,10 +53,18 @@ pub struct DesktopEntryData { pub fn load_applications<'a>( locales: &'a [String], include_no_display: bool, + only_show_in: Option<&'a str>, ) -> impl Iterator + 'a { fde::Iter::new(fde::default_paths()) .filter_map(move |p| fde::DesktopEntry::from_path(p, Some(locales)).ok()) - .filter(move |de| include_no_display || !de.no_display()) + .filter(move |de| { + (include_no_display || !de.no_display()) + && !only_show_in.zip(de.only_show_in()).is_some_and( + |(xdg_current_desktop, only_show_in)| { + !only_show_in.contains(&xdg_current_desktop) + }, + ) + }) .map(move |de| DesktopEntryData::from_desktop_entry(locales, de)) } @@ -69,6 +77,7 @@ pub fn load_applications_for_app_ids<'a>( app_ids: Vec<&'a str>, fill_missing_ones: bool, include_no_display: bool, + only_show_in: Option<&'a str>, ) -> impl Iterator + 'a { let app_ids = std::rc::Rc::new(std::cell::RefCell::new(app_ids)); let app_ids_ = app_ids.clone(); @@ -78,6 +87,11 @@ pub fn load_applications_for_app_ids<'a>( if !include_no_display && de.no_display() { return false; } + if only_show_in.zip(de.only_show_in()).is_some_and( + |(xdg_current_desktop, only_show_in)| !only_show_in.contains(&xdg_current_desktop), + ) { + return false; + } // Search by ID first app_ids