diff options
author | rabite <rabite@posteo.de> | 2019-03-19 01:08:22 +0100 |
---|---|---|
committer | rabite <rabite@posteo.de> | 2019-03-19 14:38:15 +0100 |
commit | 161ba5ac3f38733b45c0167cb1e29f0be6059775 (patch) | |
tree | 794ec2517c71f6e6e3b9c572ebcc0e2fca66c3f4 /src/term.rs | |
parent | c719ec7a3cb6ca3d2346f48dc11d2e0d5ee10d36 (diff) |
handle terminal resizing
Diffstat (limited to 'src/term.rs')
-rw-r--r-- | src/term.rs | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/src/term.rs b/src/term.rs index 94e0c5d..abedbba 100644 --- a/src/term.rs +++ b/src/term.rs @@ -1,5 +1,5 @@ use std::io::{Stdout, Write, BufWriter}; -use std::sync::{Arc, Mutex}; +use std::sync::{Arc, Mutex, RwLock}; use termion; use termion::screen::AlternateScreen; @@ -14,7 +14,8 @@ pub type TermMode = AlternateScreen<MouseTerminal<RawTerminal<BufWriter<Stdout>> #[derive(Clone)] pub struct Screen { - screen: Arc<Mutex<Option<TermMode>>> + screen: Arc<Mutex<Option<TermMode>>>, + size: Arc<RwLock<Option<(usize, usize)>>> } impl Screen { @@ -25,7 +26,8 @@ impl Screen { screen.cursor_hide()?; Ok(Screen { - screen: Arc::new(Mutex::new(Some(screen))) + screen: Arc::new(Mutex::new(Some(screen))), + size: Arc::new(RwLock::new(None)) }) } @@ -43,6 +45,19 @@ impl Screen { *self.screen.lock()? = Some(screen); Ok(()) } + + pub fn set_size(&self, size: (usize, usize)) -> HResult<()> { + *self.size.write()? = Some(size); + Ok(()) + } + + pub fn is_resized(&self) -> HResult<(usize, usize)> { + Ok(self.size.read()?.clone()?) + } + + pub fn take_size(&self) -> HResult<(usize, usize)> { + Ok(self.size.write()?.take()?) + } } impl Write for Screen { @@ -70,7 +85,9 @@ pub trait ScreenExt: Write { Ok(()) } fn clear(&mut self) -> HResult<()> { - write!(self, "{}", termion::clear::All)?; + write!(self, "{}{}", + termion::style::Reset, + termion::clear::All)?; Ok(()) } fn write_str(&mut self, str: &str) -> HResult<()> { @@ -83,6 +100,10 @@ pub trait ScreenExt: Write { write!(self, "{}", goto_xy(x + 1, y + 1))?; Ok(()) } + fn size(&self) -> HResult<(usize, usize)> { + let (xsize, ysize) = termion::terminal_size()?; + Ok(((xsize-1) as usize, (ysize-1) as usize)) + } fn xsize(&self) -> HResult<usize> { let (xsize, _) = termion::terminal_size()?; Ok((xsize - 1) as usize) @@ -116,6 +137,11 @@ pub fn ysize() -> u16 { ysize } +pub fn size() -> HResult<(usize, usize)> { + let (xsize, ysize) = termion::terminal_size()?; + Ok(((xsize-1) as usize, (ysize-1) as usize)) +} + pub fn sized_string(string: &str, xsize: u16) -> String { string.chars().fold("".to_string(), |acc, ch| { let width: usize = unicode_width::UnicodeWidthStr::width_cjk(acc.as_str()); |