From a0017eeb9c9965c067b830b56899f74ef6dd4d24 Mon Sep 17 00:00:00 2001 From: Michael Aaron Murphy Date: Tue, 12 Mar 2024 07:01:41 +0100 Subject: [PATCH] fix(wallpaper): avoid walking custom paths for wallpapers --- app/src/pages/desktop/wallpaper/mod.rs | 22 +++++++++++----------- pages/wallpapers/src/lib.rs | 5 +++-- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/app/src/pages/desktop/wallpaper/mod.rs b/app/src/pages/desktop/wallpaper/mod.rs index e3a9993..8c8b0ee 100644 --- a/app/src/pages/desktop/wallpaper/mod.rs +++ b/app/src/pages/desktop/wallpaper/mod.rs @@ -207,10 +207,12 @@ impl page::Page for Page { fn reload(&mut self, _page: page::Entity) -> Command { let current_folder = self.config.current_folder().to_owned(); + let recurse = self.categories.selected == Some(Category::Wallpapers); + command::future(async move { let (service_config, displays) = wallpaper::config().await; - let selection = change_folder(current_folder).await; + let selection = change_folder(current_folder, recurse).await; crate::pages::Message::DesktopWallpaper(Message::Init(Box::new(InitUpdate { service_config, @@ -512,7 +514,7 @@ impl Page { if self.config.current_folder.is_some() { let _ = self.config.set_current_folder(None); command = cosmic::command::future(async move { - let folder = change_folder(Config::default_folder().to_owned()).await; + let folder = change_folder(Config::default_folder().to_owned(), true).await; Message::ChangeFolder(folder).into() }); } else { @@ -532,7 +534,7 @@ impl Page { } command = cosmic::command::future(async move { - Message::ChangeFolder(change_folder(path).await).into() + Message::ChangeFolder(change_folder(path, false).await).into() }); } } @@ -824,9 +826,12 @@ impl Page { } } + // Avoid walking user-selected folders. + let recurse = self.categories.selected == Some(Category::Wallpapers); + // Load the wallpapers from the selected folder into the view. return cosmic::command::future(async move { - let message = Message::ChangeFolder(change_folder(path).await); + let message = Message::ChangeFolder(change_folder(path, recurse).await); let page_message = crate::pages::Message::DesktopWallpaper(message); crate::Message::PageMessage(page_message) }); @@ -1046,11 +1051,9 @@ impl Context { } } -pub async fn change_folder(current_folder: PathBuf) -> Context { +pub async fn change_folder(current_folder: PathBuf, recurse: bool) -> Context { let mut update = Context::default(); - let mut start = std::time::Instant::now(); - - let mut wallpapers = wallpaper::load_each_from_path(current_folder).await; + let mut wallpapers = wallpaper::load_each_from_path(current_folder, recurse).await; while let Some((path, display_image, selection_image)) = wallpapers.next().await { let id = update.paths.insert(path); @@ -1066,9 +1069,6 @@ pub async fn change_folder(current_folder: PathBuf) -> Context { update.selection_handles.insert(id, selection_handle); } - let elapsed = std::time::Instant::now().duration_since(start); - tracing::info!(?elapsed, "time to load backgrounds"); - update } diff --git a/pages/wallpapers/src/lib.rs b/pages/wallpapers/src/lib.rs index f6f7139..9d28893 100644 --- a/pages/wallpapers/src/lib.rs +++ b/pages/wallpapers/src/lib.rs @@ -1,6 +1,6 @@ pub use cosmic_bg_config::{Color, Config, Entry, Gradient, ScalingMode, Source}; -use futures_lite::{Future, Stream}; +use futures_lite::Stream; use image::{DynamicImage, ImageBuffer, Rgba, RgbaImage}; use std::{ borrow::Cow, @@ -90,6 +90,7 @@ pub fn cache_dir() -> Option { #[must_use] pub async fn load_each_from_path( path: PathBuf, + recurse: bool, ) -> Pin>> { let wallpapers = tokio::task::spawn_blocking(move || { // Directories to search recursively. @@ -107,7 +108,7 @@ pub async fn load_each_from_path( let path = entry.path(); // Recursively search directories, while storing only image files. - if file_type.is_dir() { + if recurse && file_type.is_dir() { paths.push(path); } else if file_type.is_file() { let Ok(Some(kind)) = infer::get_from_path(&path) else {