use crate::*;
use crate::options_::*;
pub static CMD_BREAK_PANE_ENTRY: cmd_entry = cmd_entry {
name: "break-pane",
alias: Some("breakp"),
args: args_parse::new("abdPF:n:s:t:", 0, 0, None),
usage: "[-abdP] [-F format] [-n window-name] [-s src-pane] [-t dst-window]",
source: cmd_entry_flag::new(b's', cmd_find_type::CMD_FIND_PANE, cmd_find_flags::empty()),
target: cmd_entry_flag::new(
b't',
cmd_find_type::CMD_FIND_WINDOW,
cmd_find_flags::CMD_FIND_WINDOW_INDEX,
),
flags: cmd_flag::empty(),
exec: cmd_break_pane_exec,
};
pub unsafe fn cmd_break_pane_exec(self_: *mut cmd, item: *mut cmdq_item) -> cmd_retval {
unsafe {
let args = cmd_get_args(self_);
let current = cmdq_get_current(item);
let target = cmdq_get_target(item);
let source = cmdq_get_source(item);
let tc = cmdq_get_target_client(item);
let mut wl = (*source).wl;
let src_s = (*source).s;
let dst_s = (*target).s;
let wp = (*source).wp;
let mut w = (*wl).window;
let name: *mut u8;
let mut cause: *mut u8 = null_mut();
let cp: *mut u8;
let mut idx = (*target).idx;
let mut template: *const u8;
let before = args_has(args, 'b');
if args_has(args, 'a') || before {
idx = if !(*target).wl.is_null() {
winlink_shuffle_up(dst_s, (*target).wl, before)
} else {
winlink_shuffle_up(dst_s, (*dst_s).curw, before)
};
if idx == -1 {
return cmd_retval::CMD_RETURN_ERROR;
}
}
server_unzoom_window(w);
if window_count_panes(w) == 1 {
if server_link_window(
src_s,
wl,
dst_s,
idx,
false,
!args_has(args, 'd'),
&raw mut cause,
) != 0
{
cmdq_error!(item, "{}", _s(cause));
free_(cause);
return cmd_retval::CMD_RETURN_ERROR;
}
if args_has(args, 'n') {
window_set_name(w, args_get(args, b'n'));
options_set_number((*w).options, "automatic-rename", 0);
}
server_unlink_window(src_s, wl);
return cmd_retval::CMD_RETURN_NORMAL;
}
if idx != -1 && !winlink_find_by_index(&raw mut (*dst_s).windows, idx).is_null() {
cmdq_error!(item, "index in use: {}", idx);
return cmd_retval::CMD_RETURN_ERROR;
}
tailq_remove::<_, discr_entry>(&raw mut (*w).panes, wp);
server_client_remove_pane(wp);
window_lost_pane(w, wp);
layout_close_pane(wp);
(*wp).window = window_create((*w).sx, (*w).sy, (*w).xpixel, (*w).ypixel);
w = (*wp).window;
options_set_parent(&mut *(*wp).options, (*w).options);
(*wp).flags |= window_pane_flags::PANE_STYLECHANGED;
tailq_insert_head::<_, discr_entry>(&raw mut (*w).panes, wp);
(*w).active = wp;
(*w).latest = tc as *mut c_void;
if !args_has(args, 'n') {
name = CString::new(default_window_name(w))
.unwrap()
.into_raw()
.cast();
window_set_name(w, name);
free_(name);
} else {
window_set_name(w, args_get(args, b'n'));
options_set_number((*w).options, "automatic-rename", 0);
}
layout_init(w, wp);
(*wp).flags |= window_pane_flags::PANE_CHANGED;
colour_palette_from_option(Some(&mut (*wp).palette), (*wp).options);
if idx == -1 {
idx = -1 - options_get_number___::<i32>(&*(*dst_s).options, "base-index");
}
wl = session_attach(dst_s, w, idx, &raw mut cause);
if !args_has(args, 'd') {
session_select(dst_s, (*wl).idx);
cmd_find_from_session(current, dst_s, cmd_find_flags::empty());
}
server_redraw_session(src_s);
if src_s != dst_s {
server_redraw_session(dst_s);
}
server_status_session_group(src_s);
if src_s != dst_s {
server_status_session_group(dst_s);
}
if args_has(args, 'P') {
template = args_get(args, b'F');
if template.is_null() {
template = c!("#{session_name}:#{window_index}.#{pane_index}");
}
cp = format_single(item, cstr_to_str(template), tc, dst_s, wl, wp);
cmdq_print!(item, "{}", _s(cp));
free_(cp);
}
cmd_retval::CMD_RETURN_NORMAL
}
}