use crate::*;
pub static CMD_BIND_KEY_ENTRY: cmd_entry = cmd_entry {
name: "bind-key",
alias: Some("bind"),
args: args_parse::new("nrN:T:", 1, -1, Some(cmd_bind_key_args_parse)),
usage: "[-nr] [-T key-table] [-N note] key [command [arguments]]",
flags: cmd_flag::CMD_AFTERHOOK,
exec: cmd_bind_key_exec,
source: cmd_entry_flag::zeroed(),
target: cmd_entry_flag::zeroed(),
};
fn cmd_bind_key_args_parse(_args: *mut args, _idx: u32, _cause: *mut *mut u8) -> args_parse_type {
args_parse_type::ARGS_PARSE_COMMANDS_OR_STRING
}
unsafe fn cmd_bind_key_exec(self_: *mut cmd, item: *mut cmdq_item) -> cmd_retval {
unsafe {
let args: *mut args = cmd_get_args(self_);
let note = args_get(args, b'N');
let count: u32 = args_count(args);
let key: key_code = key_string_lookup_string(args_string(args, 0));
if key == KEYC_NONE || key == KEYC_UNKNOWN {
cmdq_error!(item, "unknown key bind: {}", _s(args_string(args, 0)));
return cmd_retval::CMD_RETURN_ERROR;
}
let tablename: *const u8 = if args_has(args, 'T') {
args_get(args, b'T')
} else if args_has(args, 'n') {
c!("root")
} else {
c!("prefix")
};
let repeat = args_has(args, 'r');
if count == 1 {
key_bindings_add(tablename, key, note, repeat, null_mut());
return cmd_retval::CMD_RETURN_NORMAL;
}
let value = args_value(args, 1);
if count == 2 && (*value).type_ == args_type::ARGS_COMMANDS {
key_bindings_add(tablename, key, note, repeat, (*value).union_.cmdlist);
(*(*value).union_.cmdlist).references += 1;
return cmd_retval::CMD_RETURN_NORMAL;
}
let pr = if count == 2 {
cmd_parse_from_string(cstr_to_str(args_string(args, 1)), None)
} else {
cmd_parse_from_arguments(args_values(args).add(1), count - 1, None)
};
match pr {
Err(error) => {
cmdq_error!(item, "{}", _s(error));
free_(error);
cmd_retval::CMD_RETURN_ERROR
}
Ok(cmdlist) => {
key_bindings_add(tablename, key, note, repeat, cmdlist);
cmd_retval::CMD_RETURN_NORMAL
}
}
}
}