use hyprland::shared::{Address, MonitorId, WorkspaceId};
use tracing::error;
use crate::{ClientData, FindByFirst, MonitorData, WorkspaceData};
pub fn update_clients(
clients: Vec<(Address, ClientData)>,
workspace_data: Option<&Vec<(WorkspaceId, WorkspaceData)>>,
monitor_data: Option<&Vec<(MonitorId, MonitorData)>>,
) -> Vec<(Address, ClientData)> {
clients
.into_iter()
.filter_map(|(a, mut c)| {
let ws = if let Some(wdt) = workspace_data {
wdt.find_by_first(&c.workspace)
.map(|ws| (ws.x, ws.y))
.or_else(|| {
error!("Workspace {:?} not found for client: {:?}", c.workspace, c);
None
})
} else {
Some((0, 0))
};
let md = if let Some(mdt) = monitor_data {
mdt.find_by_first(&c.monitor)
.map(|md| (md.x, md.y))
.or_else(|| {
error!("Monitor {:?} not found: {:?}", c.monitor, c);
None
})
} else {
Some((0, 0))
};
if let (Some((ws_x, ws_y)), Some((md_x, md_y))) = (ws, md) {
c.x += (ws_x - md_x) as i16; c.y += (ws_y - md_y) as i16; Some((a, c))
} else {
None
}
})
.collect()
}