use gpui::Modifiers;
pub(crate) const fn cmd_on(m: &Modifiers, mac: bool) -> bool {
if mac {
m.platform
} else {
m.control
}
}
pub(crate) const fn word_on(m: &Modifiers, mac: bool) -> bool {
if mac {
m.alt
} else {
m.control
}
}
pub(crate) const fn line_on(m: &Modifiers, mac: bool) -> bool {
mac && m.platform
}
pub(crate) const fn emacs_on(m: &Modifiers, mac: bool) -> bool {
mac && m.control
}
pub(crate) const fn shortcut_on(m: &Modifiers, mac: bool) -> bool {
cmd_on(m, mac) && !m.alt && (!mac || !m.control)
}
pub(crate) trait Chord {
fn cmd(&self) -> bool;
fn word(&self) -> bool;
fn line(&self) -> bool;
fn emacs(&self) -> bool;
fn shortcut(&self) -> bool;
}
impl Chord for Modifiers {
fn cmd(&self) -> bool {
cmd_on(self, cfg!(target_os = "macos"))
}
fn word(&self) -> bool {
word_on(self, cfg!(target_os = "macos"))
}
fn line(&self) -> bool {
line_on(self, cfg!(target_os = "macos"))
}
fn emacs(&self) -> bool {
emacs_on(self, cfg!(target_os = "macos"))
}
fn shortcut(&self) -> bool {
shortcut_on(self, cfg!(target_os = "macos"))
}
}
#[cfg(test)]
mod tests {
use super::*;
fn mods(platform: bool, control: bool, alt: bool) -> Modifiers {
Modifiers {
platform,
control,
alt,
..Default::default()
}
}
#[test]
fn cmd_is_the_platform_key_on_mac_and_control_elsewhere() {
assert!(cmd_on(&mods(true, false, false), true));
assert!(!cmd_on(&mods(false, true, false), true));
assert!(cmd_on(&mods(false, true, false), false));
assert!(!cmd_on(&mods(true, false, false), false));
}
#[test]
fn word_is_option_on_mac_and_control_elsewhere() {
assert!(word_on(&mods(false, false, true), true));
assert!(!word_on(&mods(false, true, false), true));
assert!(word_on(&mods(false, true, false), false));
assert!(!word_on(&mods(false, false, true), false));
}
#[test]
fn line_edges_and_emacs_keys_are_mac_only() {
assert!(line_on(&mods(true, false, false), true));
assert!(!line_on(&mods(true, false, false), false));
assert!(emacs_on(&mods(false, true, false), true));
assert!(!emacs_on(&mods(false, true, false), false));
}
#[test]
fn shortcut_rejects_option_and_mac_ctrl() {
assert!(shortcut_on(&mods(true, false, false), true));
assert!(!shortcut_on(&mods(true, false, true), true));
assert!(!shortcut_on(&mods(true, true, false), true));
assert!(shortcut_on(&mods(false, true, false), false));
assert!(!shortcut_on(&mods(false, true, true), false));
}
}