hyprshell_windows_lib/overview/
close.rs1use crate::global::WindowsOverviewData;
2use adw::gtk::glib;
3use adw::gtk::prelude::*;
4use core_lib::transfer::WindowsOverride;
5use core_lib::{FindByFirst, WarnWithDetails};
6use exec_lib::switch::{switch_client, switch_workspace};
7use exec_lib::{reset_no_follow_mouse, to_client_address};
8use tracing::{debug, debug_span, trace};
9
10#[must_use]
11pub fn overview_already_hidden(data: &WindowsOverviewData) -> bool {
12 !data.window_list.iter().any(|w| w.0.get_visible())
13}
14
15pub fn close_overview(data: &mut WindowsOverviewData, ids: Option<Option<WindowsOverride>>) {
16 let _span = debug_span!("close_overview").entered();
17 reset_no_follow_mouse().warn_details("Failed to reset follow mouse");
18
19 for (window, monitor_data) in &mut data.window_list.iter_mut() {
20 while let Some(child) = monitor_data.workspaces_flow.first_child() {
21 monitor_data.workspaces_flow.remove(&child);
22 }
23 trace!("Hiding window (windows) {:?}", window.id());
24 window.set_visible(false);
25 }
26
27 if let Some(ids) = ids {
28 let ids = match ids {
29 None => data.active.client.map_or_else(
30 || WindowsOverride::WorkspaceID(data.active.workspace),
31 WindowsOverride::ClientId,
32 ),
33 Some(WindowsOverride::ClientId(client_id)) => WindowsOverride::ClientId(client_id),
34 Some(WindowsOverride::WorkspaceID(workspace_id)) => {
35 WindowsOverride::WorkspaceID(workspace_id)
36 }
37 };
38 match ids {
39 WindowsOverride::ClientId(client_id) => {
40 debug!(
41 "Switching to client {}",
42 data.hypr_data
43 .clients
44 .find_by_first(&client_id)
45 .map_or_else(|| "<Unknown>".to_string(), |c| c.title.clone())
46 );
47 glib::idle_add_local(move || {
48 switch_client(to_client_address(client_id))
49 .warn_details(&format!("Failed to execute with id {client_id:?}"));
50 glib::ControlFlow::Break
51 });
52 }
53 WindowsOverride::WorkspaceID(workspace_id) => {
54 debug!(
55 "Switching to workspace {}",
56 data.hypr_data
57 .workspaces
58 .find_by_first(&workspace_id)
59 .map_or_else(|| "<Unknown>".to_string(), |c| c.name.clone())
60 );
61 glib::idle_add_local(move || {
62 switch_workspace(workspace_id).warn_details(&format!(
63 "Failed to execute switch workspace with id {workspace_id:?}"
64 ));
65 glib::ControlFlow::Break
66 });
67 }
68 }
69 }
70}