hyprswitch 3.3.2

A CLI/GUI that allows switching between windows in Hyprland
use crate::daemon::gui::gui_handle::{
    gui_close, gui_set_client, gui_set_monitor, gui_set_workspace,
};
use crate::Share;
use gtk4::glib::clone;
use gtk4::prelude::GestureExt;
use gtk4::{EventSequenceState, GestureClick};
use hyprland::shared::{Address, MonitorId, WorkspaceId};
use tracing::info;

pub(crate) fn click_client(share: &Share, address: &Address) -> GestureClick {
    let gesture = GestureClick::new();
    gesture.connect_pressed(clone!(
        #[strong]
        address,
        #[strong]
        share,
        move |gesture, _, _, _| {
            gesture.set_state(EventSequenceState::Claimed);
            info!("Switching to client {:?}", address.clone());
            gui_set_client(&share, address.clone());
            info!("Exiting on click of client window");
            gui_close(&share);
        }
    ));
    gesture
}

pub(crate) fn click_workspace(share: &Share, id: WorkspaceId) -> GestureClick {
    let gesture = GestureClick::new();
    gesture.connect_pressed(clone!(
        #[strong]
        share,
        move |gesture, _, _, _| {
            gesture.set_state(EventSequenceState::Claimed);
            info!("Switching to workspace {id:?}");
            gui_set_workspace(&share, id);
            info!("Exiting on click of workspace");
            gui_close(&share);
        }
    ));
    gesture
}

pub(crate) fn click_monitor(share: &Share, id: MonitorId) -> GestureClick {
    let gesture = GestureClick::new();
    gesture.connect_pressed(clone!(
        #[strong]
        share,
        move |gesture, _, _, _| {
            gesture.set_state(EventSequenceState::Claimed);
            info!("Switching to monitor {id:?}");
            gui_set_monitor(&share, id);
            info!("Exiting on click of monitor");
            gui_close(&share);
        }
    ));
    gesture
}