summaryrefslogtreecommitdiffstats
path: root/src/term.rs
diff options
context:
space:
mode:
authorrabite <rabite@posteo.de>2019-03-19 01:08:22 +0100
committerrabite <rabite@posteo.de>2019-03-19 14:38:15 +0100
commit161ba5ac3f38733b45c0167cb1e29f0be6059775 (patch)
tree794ec2517c71f6e6e3b9c572ebcc0e2fca66c3f4 /src/term.rs
parentc719ec7a3cb6ca3d2346f48dc11d2e0d5ee10d36 (diff)
handle terminal resizing
Diffstat (limited to 'src/term.rs')
-rw-r--r--src/term.rs34
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());