From 0efa64ab9380661e56bd8f6ed313b33175da2b8e Mon Sep 17 00:00:00 2001 From: taro Date: Mon, 3 Feb 2025 12:15:13 -0300 Subject: [PATCH] fix(FileBrowser): use Rc::downgrade to avoid a circular Rc reference that prevents the callback from ever being dropped --- src/app.rs | 2 ++ src/components/file_browser/file_browser.rs | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/app.rs b/src/app.rs index 708ade6..ea10d57 100644 --- a/src/app.rs +++ b/src/app.rs @@ -143,7 +143,9 @@ fn run_sync(mpris: Mpris) -> Result<(), Box> { log::error!("Could not save app state {err:?}"); } + log::trace!("Dropping root_component..."); drop(root_component); + log::trace!("root_component dropped"); log::debug!( "main_player strong_count: {}. weak_count: {}", diff --git a/src/components/file_browser/file_browser.rs b/src/components/file_browser/file_browser.rs index a568e45..bbe1734 100644 --- a/src/components/file_browser/file_browser.rs +++ b/src/components/file_browser/file_browser.rs @@ -165,12 +165,16 @@ impl<'a> FileBrowser<'a> { parents_list.on_confirm({ let on_enqueue_fn = Rc::clone(&on_enqueue_fn); let current_directory = Rc::clone(¤t_directory); - let parents_list = Rc::clone(&parents_list); + let parents_list = Rc::downgrade(&parents_list); let children_list = children_list.clone(); let history = Rc::clone(&history); move |item| match item { FileBrowserSelection::Directory(path) => { + let Some(parents_list) = parents_list.upgrade() else { + return; + }; + let files = directory_to_songs_and_folders(path.as_path()); if !files.iter().any(|f| matches!(f, FileBrowserSelection::Directory(_))) {