feat: restore the cursor state on terminal drop

pull/78/head
Florian Dehau 6 years ago
parent a99fc115f8
commit 7b4d35d224

@ -132,6 +132,5 @@ fn main() -> Result<(), failure::Error> {
} }
} }
terminal.show_cursor()?;
Ok(()) Ok(())
} }

@ -105,6 +105,5 @@ fn main() -> Result<(), failure::Error> {
_ => {} _ => {}
} }
} }
terminal.show_cursor()?;
Ok(()) Ok(())
} }

@ -176,6 +176,5 @@ fn main() -> Result<(), failure::Error> {
} }
} }
terminal.show_cursor()?;
Ok(()) Ok(())
} }

@ -129,6 +129,5 @@ fn main() -> Result<(), failure::Error> {
} }
} }
terminal.show_cursor()?;
Ok(()) Ok(())
} }

@ -55,6 +55,5 @@ fn main() -> Result<(), failure::Error> {
_ => {} _ => {}
}; };
} }
terminal.show_cursor()?;
Ok(()) Ok(())
} }

@ -249,7 +249,6 @@ fn main() -> Result<(), failure::Error> {
} }
} }
} }
terminal.show_cursor()?;
Ok(()) Ok(())
} }

@ -125,6 +125,5 @@ fn main() -> Result<(), failure::Error> {
} }
} }
terminal.show_cursor()?;
Ok(()) Ok(())
} }

@ -85,6 +85,5 @@ fn main() -> Result<(), failure::Error> {
} }
} }
terminal.show_cursor()?;
Ok(()) Ok(())
} }

@ -174,6 +174,5 @@ fn main() -> Result<(), failure::Error> {
} }
} }
terminal.show_cursor()?;
Ok(()) Ok(())
} }

@ -102,6 +102,5 @@ fn main() -> Result<(), failure::Error> {
_ => {} _ => {}
} }
} }
terminal.show_cursor()?;
Ok(()) Ok(())
} }

@ -128,6 +128,5 @@ fn main() -> Result<(), failure::Error> {
} }
} }
terminal.show_cursor()?;
Ok(()) Ok(())
} }

@ -108,6 +108,5 @@ fn main() -> Result<(), failure::Error> {
}; };
} }
terminal.show_cursor()?;
Ok(()) Ok(())
} }

@ -57,6 +57,7 @@ fn main() -> Result<(), failure::Error> {
let stdout = AlternateScreen::from(stdout); let stdout = AlternateScreen::from(stdout);
let backend = TermionBackend::new(stdout); let backend = TermionBackend::new(stdout);
let mut terminal = Terminal::new(backend)?; let mut terminal = Terminal::new(backend)?;
terminal.hide_cursor()?;
// Setup event handlers // Setup event handlers
let events = Events::new(); let events = Events::new();

@ -17,6 +17,8 @@ where
buffers: [Buffer; 2], buffers: [Buffer; 2],
/// Index of the current buffer in the previous array /// Index of the current buffer in the previous array
current: usize, current: usize,
/// Whether the cursor is currently hidden
hidden_cursor: bool,
} }
pub struct Frame<'a, B: 'a> pub struct Frame<'a, B: 'a>
@ -39,18 +41,33 @@ where
} }
} }
impl<B> Drop for Terminal<B>
where
B: Backend,
{
fn drop(&mut self) {
// Attempt to restore the cursor state
if self.hidden_cursor {
if let Err(_) = self.show_cursor() {
error!("Failed to show the cursor");
}
}
}
}
impl<B> Terminal<B> impl<B> Terminal<B>
where where
B: Backend, B: Backend,
{ {
/// Wrapper around Termion initialization. Each buffer is initialized with a blank string and /// Wrapper around Termion initialization. Each buffer is initialized with a blank string and
/// default colors for the foreground and the background /// default colors for the foreground and the background
pub fn new(backend: B) -> Result<Terminal<B>, io::Error> { pub fn new(backend: B) -> io::Result<Terminal<B>> {
let size = backend.size()?; let size = backend.size()?;
Ok(Terminal { Ok(Terminal {
backend, backend,
buffers: [Buffer::empty(size), Buffer::empty(size)], buffers: [Buffer::empty(size), Buffer::empty(size)],
current: 0, current: 0,
hidden_cursor: false,
}) })
} }
@ -72,7 +89,7 @@ where
/// Builds a string representing the minimal escape sequences and characters set necessary to /// Builds a string representing the minimal escape sequences and characters set necessary to
/// update the UI and writes it to stdout. /// update the UI and writes it to stdout.
pub fn flush(&mut self) -> Result<(), io::Error> { pub fn flush(&mut self) -> io::Result<()> {
let width = self.buffers[self.current].area.width; let width = self.buffers[self.current].area.width;
let content = self.buffers[self.current] let content = self.buffers[self.current]
.content .content
@ -94,7 +111,7 @@ where
/// Updates the interface so that internal buffers matches the current size of the terminal. /// Updates the interface so that internal buffers matches the current size of the terminal.
/// This leads to a full redraw of the screen. /// This leads to a full redraw of the screen.
pub fn resize(&mut self, area: Rect) -> Result<(), io::Error> { pub fn resize(&mut self, area: Rect) -> io::Result<()> {
self.buffers[self.current].resize(area); self.buffers[self.current].resize(area);
self.buffers[1 - self.current].reset(); self.buffers[1 - self.current].reset();
self.buffers[1 - self.current].resize(area); self.buffers[1 - self.current].resize(area);
@ -102,7 +119,7 @@ where
} }
/// Flushes the current internal state and prepares the interface for the next draw call /// Flushes the current internal state and prepares the interface for the next draw call
pub fn draw<F>(&mut self, f: F) -> Result<(), io::Error> pub fn draw<F>(&mut self, f: F) -> io::Result<()>
where where
F: FnOnce(Frame<B>), F: FnOnce(Frame<B>),
{ {
@ -120,16 +137,20 @@ where
Ok(()) Ok(())
} }
pub fn hide_cursor(&mut self) -> Result<(), io::Error> { pub fn hide_cursor(&mut self) -> io::Result<()> {
self.backend.hide_cursor() self.backend.hide_cursor()?;
self.hidden_cursor = true;
Ok(())
} }
pub fn show_cursor(&mut self) -> Result<(), io::Error> { pub fn show_cursor(&mut self) -> io::Result<()> {
self.backend.show_cursor() self.backend.show_cursor()?;
self.hidden_cursor = false;
Ok(())
} }
pub fn clear(&mut self) -> Result<(), io::Error> { pub fn clear(&mut self) -> io::Result<()> {
self.backend.clear() self.backend.clear()
} }
pub fn size(&self) -> Result<Rect, io::Error> { pub fn size(&self) -> io::Result<Rect> {
self.backend.size() self.backend.size()
} }
} }

Loading…
Cancel
Save