From dccce56f6e68fbc2010345910138d98c872d2124 Mon Sep 17 00:00:00 2001 From: Alexandre Bury Date: Thu, 19 Jan 2017 13:44:49 -0800 Subject: [PATCH] Fix off-by-1 errors on termion Termion's Goto is 1-based, Cursive's print_at is 0-based --- src/backend/termion.rs | 34 +++++++++++----------------------- 1 file changed, 11 insertions(+), 23 deletions(-) diff --git a/src/backend/termion.rs b/src/backend/termion.rs index 3ebdae7..f77c0f7 100644 --- a/src/backend/termion.rs +++ b/src/backend/termion.rs @@ -3,6 +3,7 @@ extern crate termion; extern crate chan_signal; use ::backend; +use chan; use ::event::{Event, Key}; use self::termion::color as tcolor; use self::termion::event::Key as TKey; @@ -15,7 +16,6 @@ use std::fmt; use std::io::Write; use std::thread; use std::time; -use chan; use ::theme; @@ -84,13 +84,9 @@ impl backend::Backend for Concrete { let terminal = ::std::io::stdout().into_raw_mode().unwrap(); let (sender, receiver) = chan::async(); - // TODO: use signal_chan crate - - thread::spawn(move || { - for key in ::std::io::stdin().keys() { - if let Ok(key) = key { - sender.send(map_key(key)) - } + thread::spawn(move || for key in ::std::io::stdin().keys() { + if let Ok(key) = key { + sender.send(map_key(key)) } }); @@ -108,7 +104,10 @@ impl backend::Backend for Concrete { fn finish(&mut self) { print!("{}{}", termion::cursor::Show, termion::cursor::Goto(1, 1)); - print!("{}[49m{}[39m{}", 27 as char, 27 as char, termion::clear::All); + print!("{}[49m{}[39m{}", + 27 as char, + 27 as char, + termion::clear::All); } fn init_color_style(&mut self, style: theme::ColorStyle, @@ -120,10 +119,6 @@ impl backend::Backend for Concrete { } fn with_color(&self, color: theme::ColorStyle, f: F) { - // TODO: actually use colors - // TODO: careful! need to remember the previous state - // and apply it back - let current_style = self.current_style.get(); self.apply_colorstyle(color); @@ -136,9 +131,6 @@ impl backend::Backend for Concrete { } fn with_effect(&self, effect: theme::Effect, f: F) { - // TODO: actually use effects - // TODO: careful! need to remember the previous state - // and apply it back effect.on(); f(); effect.off(); @@ -164,20 +156,16 @@ impl backend::Backend for Concrete { } fn print_at(&self, (x, y): (usize, usize), text: &str) { - // TODO: terminals are 1-based. Should we add 1 here? - print!("{}{}", termion::cursor::Goto(x as u16, y as u16), text); + print!("{}{}", + termion::cursor::Goto(1 + x as u16, 1 + y as u16), + text); } fn set_refresh_rate(&mut self, fps: u32) { - // TODO: handle async refresh, when no input is entered. - // Could be done with a timeout on the event polling, - // if it was supportedd. self.timeout = Some(1000 / fps as u32); } fn poll_event(&self) -> Event { - // TODO: select! on the input and SIGWINCH signal channel. - // TODO: also handle timeout... recv_timeout? let input = &self.input; let resize = &self.resize;