#[cfg(unix)]
mod unix;
#[cfg(windows)]
mod windows;
use std::io;
#[cfg(unix)]
use unix as sys;
#[cfg(windows)]
use windows as sys;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct TerminalSize {
pub width: u16,
pub height: u16,
pub pixel_width: u16,
pub pixel_height: u16,
}
pub fn size() -> Result<TerminalSize, io::Error> {
sys::size()
}
pub fn is_raw_mode_enabled() -> Result<bool, io::Error> {
sys::is_raw_mode_enabled()
}
pub fn enable_raw_mode() -> Result<RawModeGuard, io::Error> {
RawModeGuard::new()
}
#[cfg(feature = "tokio")]
pub fn on_resize() -> Result<tokio::sync::watch::Receiver<TerminalSize>, io::Error> {
let terminal_size = size()?;
let (tx, rx) = tokio::sync::watch::channel(terminal_size);
sys::spawn_on_resize_task(tx)?;
Ok(rx)
}
pub struct RawModeGuard {
original_state: sys::TerminalState,
}
impl RawModeGuard {
fn new() -> Result<Self, io::Error> {
let original_state = sys::enable_raw_mode()?;
Ok(Self { original_state })
}
}
impl Drop for RawModeGuard {
fn drop(&mut self) {
let _ = sys::restore_mode(self.original_state);
}
}