49 lines
1.2 KiB
Rust
49 lines
1.2 KiB
Rust
|
//! Cursor.
|
||
|
|
||
|
use std::fmt;
|
||
|
|
||
|
derive_csi_sequence!("Hide the cursor.", Hide, "?25l");
|
||
|
derive_csi_sequence!("Show the cursor.", Show, "?25h");
|
||
|
|
||
|
/// Goto some position ((1,1)-based).
|
||
|
///
|
||
|
/// # Why one-based?
|
||
|
///
|
||
|
/// ANSI escapes are very poorly designed, and one of the many odd aspects is being one-based. This
|
||
|
/// can be quite strange at first, but it is not that big of an obstruction once you get used to
|
||
|
/// it.
|
||
|
#[derive(Copy, Clone, PartialEq, Eq)]
|
||
|
pub struct Goto(pub u16, pub u16);
|
||
|
|
||
|
impl Default for Goto {
|
||
|
fn default() -> Goto { Goto(1, 1) }
|
||
|
}
|
||
|
|
||
|
impl fmt::Display for Goto {
|
||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||
|
debug_assert!(self != &Goto(0, 0), "Goto is one-based.");
|
||
|
|
||
|
write!(f, csi!("{};{}H"), self.0, self.1)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// Move cursor left.
|
||
|
#[derive(Copy, Clone, PartialEq, Eq)]
|
||
|
pub struct Left(pub u16);
|
||
|
|
||
|
impl fmt::Display for Left {
|
||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||
|
write!(f, csi!("{}D"), self.0)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// Move cursor right.
|
||
|
#[derive(Copy, Clone, PartialEq, Eq)]
|
||
|
pub struct Right(pub u16);
|
||
|
|
||
|
impl fmt::Display for Right {
|
||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||
|
write!(f, csi!("{}C"), self.0)
|
||
|
}
|
||
|
}
|