use std::process::Command;
use crate::error::{BosunError, Result};
use crate::tmux::client::sync_tmux;
pub fn attach_with_ctrl_q_detach(socket: Option<&str>, name: &str) -> Result<()> {
ensure_ctrl_q_bound(socket);
run_attach(socket, name)
}
pub fn ensure_ctrl_q_bound(socket: Option<&str>) {
let out = sync_tmux(socket, ["bind-key", "-T", "root", "C-q", "detach-client"]).output();
match out {
Ok(o) if o.status.success() => {}
Ok(o) => {
let stderr = String::from_utf8_lossy(&o.stderr);
tracing::warn!("bind-key C-q: {}", stderr.trim());
}
Err(e) => tracing::warn!("bind-key C-q: {}", e),
}
}
pub fn clear_ctrl_q_bound(socket: Option<&str>) {
let out = sync_tmux(socket, ["unbind-key", "-T", "root", "C-q"]).output();
if let Ok(o) = out {
if !o.status.success() {
let stderr = String::from_utf8_lossy(&o.stderr);
tracing::warn!("unbind-key C-q: {}", stderr.trim());
}
}
}
fn run_attach(socket: Option<&str>, name: &str) -> Result<()> {
let status = sync_tmux(socket, ["attach-session", "-t", name])
.status()
.map_err(BosunError::Io)?;
if !status.success() {
return Err(BosunError::Tmux(format!(
"attach-session -t {} failed: {}",
name, status
)));
}
Ok(())
}
pub fn emergency_unbind(socket: Option<&str>) {
let _ = Command::new("tmux")
.args(match socket {
Some(s) => vec!["-L", s, "unbind-key", "-T", "root", "C-q"],
None => vec!["unbind-key", "-T", "root", "C-q"],
})
.output();
}