hyprshell_windows_lib/overview/
close.rs

1use 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}