#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub enum PointerMode {
#[default]
Free,
Confined,
Locked,
}
impl PointerMode {
#[inline]
#[must_use]
pub const fn is_captured(self) -> bool {
!matches!(self, Self::Free)
}
#[inline]
#[must_use]
pub const fn required_cap(self) -> crate::ShellCaps {
match self {
Self::Free => crate::ShellCaps::empty(),
Self::Confined => crate::ShellCaps::POINTER_CONFINE,
Self::Locked => crate::ShellCaps::POINTER_LOCK,
}
}
#[inline]
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::Free => "a free pointer",
Self::Confined => "pointer confinement",
Self::Locked => "pointer lock",
}
}
}
pub use crcbl_core::input::CursorIcon;
#[cfg(test)]
mod tests {
use super::*;
use crate::ShellCaps;
#[test]
fn capture_modes_declare_the_cap_they_need() {
assert!(!PointerMode::Free.is_captured());
assert!(PointerMode::Confined.is_captured());
assert!(PointerMode::Locked.is_captured());
for mode in [
PointerMode::Free,
PointerMode::Confined,
PointerMode::Locked,
] {
assert!(ShellCaps::DESKTOP.contains(mode.required_cap()));
}
assert!(ShellCaps::empty().contains(PointerMode::Free.required_cap()));
assert!(!ShellCaps::POINTER_CONFINE.contains(PointerMode::Locked.required_cap()));
assert_eq!(PointerMode::default(), PointerMode::Free);
}
}