pub mod tmux;
mod tmux_bindings;
#[doc(hidden)]
pub use libc;
#[macro_export]
macro_rules! format_plugin {
($name:expr, |$ft:ident| $body:block) => {
mod tmux_format_plugin {
use super::*;
use $crate::tmux;
$crate::__plugin!(
format,
tmux::format_plugin {
name: $name as *const u8 as *const ::libc::c_char,
cb: Some(plugin_format_cb),
}
);
use std::convert::AsRef;
fn format_plugin_body(
$ft: *mut tmux::format_tree,
fe: *mut tmux::format_entry,
) -> impl ::std::convert::AsRef<::std::ffi::CStr> {
$body
}
pub unsafe extern "C" fn plugin_format_cb(
$ft: *mut tmux::format_tree,
fe: *mut tmux::format_entry,
) {
let return_str = format_plugin_body($ft, fe);
let dup = $crate::libc::strdup(return_str.as_ref().as_ptr());
(*fe).value = dup;
}
}
};
}
#[macro_export]
macro_rules! format_function_plugin {
($name:expr, |$arg:ident| $body:block) => {
mod tmux_format_function_plugin {
use super::*;
use $crate::tmux;
$crate::__plugin!(
function,
tmux::function_plugin {
name: $name as *const u8 as *const $crate::libc::c_char,
cb: Some(plugin_format_function_cb),
}
);
use std::convert::AsRef;
fn format_function_plugin_body(
$arg: &::std::ffi::CStr,
) -> impl ::std::convert::AsRef<::std::ffi::CStr> {
$body
}
pub unsafe extern "C" fn plugin_format_function_cb(
$arg: *const $crate::libc::c_char,
) -> *mut $crate::libc::c_char {
let argument = ::std::ffi::CStr::from_ptr($arg);
let return_str = format_function_plugin_body(argument);
$crate::libc::strdup(return_str.as_ref().as_ptr())
}
}
};
}
#[macro_export]
macro_rules! notification_plugin {
(|$arg:ident| $body:block) => {
notification_plugin!(::std::ptr::null(), |$arg| $body);
};
($name:expr, |$arg:ident| $body:block) => {
mod tmux_notification_plugin {
use super::*;
use $crate::tmux;
$crate::__plugin!(
notify,
tmux::notification_plugin {
event: $name as *const u8 as *const $crate::libc::c_char,
cb: Some(notify_cb),
}
);
fn notify_plugin_body($arg: *mut tmux::notify_entry) {
$body
}
pub unsafe extern "C" fn notify_cb($arg: *mut tmux::notify_entry) {
notify_plugin_body($arg)
}
}
};
}
#[macro_export]
macro_rules! cmd_plugin {
($name:expr, $alias:expr, $usage:expr, $argsmin:expr, $argsmax:expr, |$self:ident| $body:block) => {
cmd_plugin!(
$name,
$alias,
$usage,
$argsmin,
$argsmax,
|$self: ident, _args| $body
);
};
($name:expr, $alias:expr, $usage:expr, $argsmin:expr, $argsmax:expr, |$self:ident, $args:ident| $body:block) => {
mod tmux_cmd_plugin {
use super::*;
use $crate::tmux;
$crate::__plugin!(
cmd,
tmux::cmd_entry {
name: $name as *const u8 as *const $crate::libc::c_char,
alias: $alias as *const u8 as *const $crate::libc::c_char,
args: tmux::cmd_entry__bindgen_ty_1 {
template: b"" as *const u8 as *const $crate::libc::c_char,
lower: $argsmin,
upper: $argsmax,
},
usage: $usage as *const u8 as *const $crate::libc::c_char,
source: tmux::cmd_entry_flag {
flag: 0,
type_: 0 as tmux::cmd_find_type,
flags: 0,
},
target: tmux::cmd_entry_flag {
flag: 0,
type_: 0,
flags: 0,
},
flags: 0,
exec: Some(cmd_exec),
}
);
fn cmd_plugin_body<'a>(
$self: *mut tmux::cmd,
$args: impl Iterator<Item = &'a CStr>,
) -> tmux::cmd_retval {
$body
}
pub unsafe extern "C" fn cmd_exec(
$self: *mut tmux::cmd,
_item: *mut tmux::cmdq_item,
) -> tmux::cmd_retval {
let args = *(*$self).args;
let argv: &[*mut i8] = std::slice::from_raw_parts(args.argv, args.argc as usize);
let argv = argv
.iter()
.map(|arg| unsafe { ::std::ffi::CStr::from_ptr(*arg) });
cmd_plugin_body($self, argv)
}
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __plugin {
(format, $body:expr) => {
$crate::__plugin!(format, tmux::FORMAT_PLUGIN, $body);
};
(function, $body:expr) => {
$crate::__plugin!(function, tmux::FORMAT_FUNCTION_PLUGIN, $body);
};
(notify, $body:expr) => {
$crate::__plugin!(notify, tmux::NOTIFICATION_PLUGIN, $body);
};
(cmd, $body:expr) => {
$crate::__plugin!(cmd, tmux::CMD_PLUGIN, $body);
};
($field:ident, $type:expr, $body:expr) => {
#[repr(transparent)]
pub struct Plugin(tmux::plugin);
unsafe impl Sync for Plugin {}
#[allow(non_upper_case_globals)]
#[no_mangle]
static plugin: Plugin = Plugin(tmux::plugin {
type_: $type as $crate::libc::c_int,
__bindgen_anon_1: { tmux::plugin_inner { $field: $body } },
});
};
}