use tokio::process::Command;
const FIELD_SEP: char = ':';
pub struct PaneInfo {
pub session: String,
pub pane_pid: u32,
pub activity: String,
pub title: String,
}
pub async fn list_active_panes() -> Vec<PaneInfo> {
let format = format!(
"#{{session_name}}{s}#{{window_active}}{s}#{{pane_active}}{s}#{{pane_pid}}{s}#{{window_activity}}{s}#{{pane_title}}",
s = FIELD_SEP
);
let output = match Command::new("tmux").args(["list-panes", "-a", "-F", &format]).output().await
{
Ok(o) if o.status.success() => o,
_ => return vec![],
};
String::from_utf8_lossy(&output.stdout)
.lines()
.filter_map(|line| {
let parts: Vec<&str> = line.splitn(6, FIELD_SEP).collect();
if parts.len() < 6 || parts[1] != "1" || parts[2] != "1" {
return None;
}
Some(PaneInfo {
session: parts[0].to_string(),
pane_pid: parts[3].parse().ok()?,
activity: parts[4].to_string(),
title: parts[5].to_string(),
})
})
.collect()
}