From eba19a7482e3d5e86745a51039678aba38abc884 Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Tue, 26 Jul 2022 14:15:24 -0400 Subject: [PATCH] fix: handle removed toplevels --- applets/cosmic-app-list/src/main.rs | 10 ++++++++++ applets/cosmic-app-list/src/wayland.rs | 27 +++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/applets/cosmic-app-list/src/main.rs b/applets/cosmic-app-list/src/main.rs index d8b60a14..2e825799 100644 --- a/applets/cosmic-app-list/src/main.rs +++ b/applets/cosmic-app-list/src/main.rs @@ -191,9 +191,12 @@ fn main() { true } AppListEvent::Remove(top_level) => { + dbg!(cached_results.len()); if let Some(i) = cached_results.iter().position(|t| t.toplevel_handle == top_level.toplevel_handle) { cached_results.swap_remove(i); } + dbg!(cached_results.len()); + true } AppListEvent::Add(top_level) => { @@ -233,6 +236,13 @@ fn main() { let mut saved_i: u32 = 0; while let Some(item) = saved_app_model.item(saved_i) { if let Ok(dock_obj) = item.downcast::() { + // clear active if it has some, they will be updated back if they still exist + let prev_active: BoxedWindowList = dock_obj.property("active"); + if !prev_active.0.is_empty() { + dock_obj.set_property("active", BoxedWindowList::default().to_value()); + saved_app_model.items_changed(saved_i, 0, 0); + } + if let Some(cur_app_info) = dock_obj.property::>("appinfo") { diff --git a/applets/cosmic-app-list/src/wayland.rs b/applets/cosmic-app-list/src/wayland.rs index fbd01abd..235d44af 100644 --- a/applets/cosmic-app-list/src/wayland.rs +++ b/applets/cosmic-app-list/src/wayland.rs @@ -303,7 +303,32 @@ impl Dispatch for State { match event { zcosmic_toplevel_handle_v1::Event::Closed => { if let Some(i) = state.toplevels.iter().position(|t| &t.toplevel_handle == p) { - state.toplevels.remove(i); + let removed_toplevel = state.toplevels.remove(i); + if match state.config.filter_top_levels { + Some(TopLevelFilter::ActiveWorkspace) => { + state + .workspace_groups + .iter() + .find(|g| { + g.workspaces + .iter() + .find(|w| { + w.states.contains( + &zcosmic_workspace_handle_v1::State::Active, + ) && Some(&w.workspace_handle) == removed_toplevel.workspace.as_ref() + }) + .is_some() + }) + .is_some() + }, + Some(TopLevelFilter::ConfiguredOutput) => { + state.expected_output == removed_toplevel.output + } + _ => true + } { + let tx = TX.get().unwrap().clone(); + let _ = tx.send(AppListEvent::Remove(removed_toplevel)); + } } } zcosmic_toplevel_handle_v1::Event::Done => {