use ratatui::crossterm::event::KeyModifiers;
#[cfg(target_os = "macos")]
pub const MODIFIER: KeyModifiers = KeyModifiers::SUPER;
#[cfg(not(target_os = "macos"))]
pub const MODIFIER: KeyModifiers = KeyModifiers::CONTROL;
pub fn held(modifiers: KeyModifiers) -> bool {
modifiers.contains(MODIFIER)
}
#[cfg(target_os = "macos")]
macro_rules! label {
($key:literal) => {
concat!("cmd-", $key)
};
}
#[cfg(not(target_os = "macos"))]
macro_rules! label {
($key:literal) => {
concat!("ctrl-", $key)
};
}
pub(crate) use label;
pub fn enter() {
#[cfg(target_os = "macos")]
{
use ratatui::crossterm::event::{KeyboardEnhancementFlags, PushKeyboardEnhancementFlags};
let _ = ratatui::crossterm::execute!(
std::io::stdout(),
PushKeyboardEnhancementFlags(KeyboardEnhancementFlags::DISAMBIGUATE_ESCAPE_CODES)
);
}
}
pub fn leave() {
#[cfg(target_os = "macos")]
{
use ratatui::crossterm::event::PopKeyboardEnhancementFlags;
let _ = ratatui::crossterm::execute!(std::io::stdout(), PopKeyboardEnhancementFlags);
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn the_label_names_the_modifier_the_handler_wants() {
let expected = if MODIFIER == KeyModifiers::SUPER {
"cmd-x"
} else {
"ctrl-x"
};
assert_eq!(label!("x"), expected);
assert!(held(MODIFIER));
assert!(!held(KeyModifiers::ALT));
}
#[test]
fn command_is_the_chord_on_macos_and_control_everywhere_else() {
assert_eq!(
MODIFIER == KeyModifiers::SUPER,
cfg!(target_os = "macos"),
"the chord modifier does not match the platform"
);
}
}