hyprshell-windows-lib 4.1.1

A modern GTK4-based window switcher and application launcher for Hyprland
use crate::WindowsGlobal;
use crate::global::OverviewGlobalMonitorData;
use anyhow::Context;
use core_lib::OVERVIEW_NAMESPACE;
use exec_lib::get_monitors;
use gtk::gdk::{Display, Monitor};
use gtk::prelude::*;
use gtk::{Application, ApplicationWindow, FlowBox, Orientation, Overlay, SelectionMode};
use gtk4_layer_shell::{KeyboardMode, Layer, LayerShell};
use tracing::{Level, debug, span};

pub fn create_windows_window(app: &Application, global: &WindowsGlobal) -> anyhow::Result<()> {
    let _span = span!(Level::TRACE, "create_windows_window").entered();
    let monitors = get_monitors();
    if let Ok(display) = Display::default().context("Could not connect to a display") {
        let gtk_monitors = display
            .monitors()
            .iter()
            .filter_map(|m| m.ok())
            .collect::<Vec<Monitor>>();

        for monitor in gtk_monitors {
            let monitor_name = monitor.connector().unwrap_or_default();
            let monitor_id = monitors
                .iter()
                .find(|m| m.name == monitor_name)
                .map(|m| m.id)
                .unwrap_or_default();

            let workspaces_flow = FlowBox::builder()
                .selection_mode(SelectionMode::None)
                .orientation(Orientation::Horizontal)
                .max_children_per_line(global.workspaces_per_row as u32)
                .min_children_per_line(global.workspaces_per_row as u32)
                .build();

            let workspaces_flow_overlay = Overlay::builder()
                .child(&workspaces_flow)
                .css_classes(["monitor"])
                .build();

            let window = ApplicationWindow::builder()
                .css_classes(["window"])
                .application(app)
                .child(&workspaces_flow_overlay)
                .default_height(10)
                .default_width(10)
                .build();

            window.init_layer_shell();
            window.set_namespace(Some(OVERVIEW_NAMESPACE));
            window.set_layer(Layer::Overlay);
            window.set_keyboard_mode(KeyboardMode::Exclusive);
            window.set_can_focus(false);
            window.set_monitor(Some(&monitor));
            window.present();
            window.set_visible(false);

            debug!(
                "Created window window ({}) for monitor {:?}",
                window.id(),
                monitor_name
            );
            global.data.borrow_mut().monitor_list.insert(
                window,
                OverviewGlobalMonitorData::new(monitor_id, workspaces_flow),
            );
        }
    }

    Ok(())
}