Struct ratatui::backend::TermionBackend
source · pub struct TermionBackend<W>where
W: Write,{ /* private fields */ }
termion
only.Expand description
A Backend
implementation that uses Termion to render to the terminal.
The TermionBackend
struct is a wrapper around a writer implementing Write
, which is used
to send commands to the terminal. It provides methods for drawing content, manipulating the
cursor, and clearing the terminal screen.
Most applications should not call the methods on TermionBackend
directly, but will instead
use the Terminal
struct, which provides a more ergonomic interface.
Usually applications will enable raw mode and switch to alternate screen mode when starting.
This is done by calling IntoRawMode::into_raw_mode()
and
IntoAlternateScreen::into_alternate_screen()
on the writer before creating the backend.
This is not done automatically by the backend because it is possible that the application may
want to use the terminal for other purposes (like showing help text) before entering alternate
screen mode. This backend automatically disable raw mode and switches back to the primary
screen when the writer is dropped.
§Example
use std::io::{stderr, stdout};
use ratatui::prelude::*;
use termion::{raw::IntoRawMode, screen::IntoAlternateScreen};
let writer = stdout().into_raw_mode()?.into_alternate_screen()?;
let mut backend = TermionBackend::new(writer);
// or
let writer = stderr().into_raw_mode()?.into_alternate_screen()?;
let backend = TermionBackend::new(stderr());
let mut terminal = Terminal::new(backend)?;
terminal.clear()?;
terminal.draw(|frame| {
// -- snip --
})?;
Implementations§
source§impl<W> TermionBackend<W>where
W: Write,
impl<W> TermionBackend<W>where
W: Write,
sourcepub const fn new(writer: W) -> Self
pub const fn new(writer: W) -> Self
Creates a new Termion backend with the given writer.
§Example
let backend = TermionBackend::new(stdout());
Examples found in repository?
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
pub fn run(tick_rate: Duration, enhanced_graphics: bool) -> Result<(), Box<dyn Error>> {
// setup terminal
let stdout = io::stdout()
.into_raw_mode()
.unwrap()
.into_alternate_screen()
.unwrap();
let stdout = MouseTerminal::from(stdout);
let backend = TermionBackend::new(stdout);
let mut terminal = Terminal::new(backend)?;
// create app and run it
let app = App::new("Termion demo", enhanced_graphics);
run_app(&mut terminal, app, tick_rate)?;
Ok(())
}
Trait Implementations§
source§impl<W> Backend for TermionBackend<W>where
W: Write,
impl<W> Backend for TermionBackend<W>where
W: Write,
source§fn append_lines(&mut self, n: u16) -> Result<()>
fn append_lines(&mut self, n: u16) -> Result<()>
n
line breaks to the terminal screen. Read moresource§fn get_cursor(&mut self) -> Result<(u16, u16)>
fn get_cursor(&mut self) -> Result<(u16, u16)>
source§fn set_cursor(&mut self, x: u16, y: u16) -> Result<()>
fn set_cursor(&mut self, x: u16, y: u16) -> Result<()>
source§fn draw<'a, I>(&mut self, content: I) -> Result<()>
fn draw<'a, I>(&mut self, content: I) -> Result<()>
source§fn window_size(&mut self) -> Result<WindowSize>
fn window_size(&mut self) -> Result<WindowSize>
WindowSize
. Read moresource§impl<W> Clone for TermionBackend<W>
impl<W> Clone for TermionBackend<W>
source§impl<W> Debug for TermionBackend<W>
impl<W> Debug for TermionBackend<W>
source§impl<W> Default for TermionBackend<W>
impl<W> Default for TermionBackend<W>
source§impl<W> Hash for TermionBackend<W>
impl<W> Hash for TermionBackend<W>
source§impl<W> PartialEq for TermionBackend<W>
impl<W> PartialEq for TermionBackend<W>
source§fn eq(&self, other: &TermionBackend<W>) -> bool
fn eq(&self, other: &TermionBackend<W>) -> bool
self
and other
values to be equal, and is used
by ==
.source§impl<W> Write for TermionBackend<W>where
W: Write,
impl<W> Write for TermionBackend<W>where
W: Write,
source§fn write(&mut self, buf: &[u8]) -> Result<usize>
fn write(&mut self, buf: &[u8]) -> Result<usize>
source§fn flush(&mut self) -> Result<()>
fn flush(&mut self) -> Result<()>
source§fn is_write_vectored(&self) -> bool
fn is_write_vectored(&self) -> bool
can_vector
)1.0.0 · source§fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>
fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>
source§fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<(), Error>
fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<(), Error>
write_all_vectored
)impl<W> Eq for TermionBackend<W>
impl<W> StructuralPartialEq for TermionBackend<W>where
W: Write,
Auto Trait Implementations§
impl<W> Freeze for TermionBackend<W>where
W: Freeze,
impl<W> RefUnwindSafe for TermionBackend<W>where
W: RefUnwindSafe,
impl<W> Send for TermionBackend<W>where
W: Send,
impl<W> Sync for TermionBackend<W>where
W: Sync,
impl<W> Unpin for TermionBackend<W>where
W: Unpin,
impl<W> UnwindSafe for TermionBackend<W>where
W: UnwindSafe,
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<W> DetectColors for Wwhere
W: Write,
impl<W> DetectColors for Wwhere
W: Write,
source§impl<W> DetectCursorPos for Wwhere
W: Write,
impl<W> DetectCursorPos for Wwhere
W: Write,
source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§impl<T> ExecutableCommand for T
impl<T> ExecutableCommand for T
source§fn execute(&mut self, command: impl Command) -> Result<&mut T, Error>
fn execute(&mut self, command: impl Command) -> Result<&mut T, Error>
Executes the given command directly.
The given command its ANSI escape code will be written and flushed onto Self
.
§Arguments
-
The command that you want to execute directly.
§Example
use std::io;
use crossterm::{ExecutableCommand, style::Print};
fn main() -> io::Result<()> {
// will be executed directly
io::stdout()
.execute(Print("sum:\n".to_string()))?
.execute(Print(format!("1 + 1= {} ", 1 + 1)))?;
Ok(())
// ==== Output ====
// sum:
// 1 + 1 = 2
}
Have a look over at the Command API for more details.
§Notes
- In the case of UNIX and Windows 10, ANSI codes are written to the given ‘writer’.
- In case of Windows versions lower than 10, a direct WinAPI call will be made.
The reason for this is that Windows versions lower than 10 do not support ANSI codes,
and can therefore not be written to the given
writer
. Therefore, there is no difference between execute and queue for those old Windows versions.
source§impl<W> IntoAlternateScreen for Wwhere
W: Write,
impl<W> IntoAlternateScreen for Wwhere
W: Write,
source§fn into_alternate_screen(self) -> Result<AlternateScreen<Self>, Error>
fn into_alternate_screen(self) -> Result<AlternateScreen<Self>, Error>
AlternateScreen
returned by this function is
dropped.source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§impl<T> QueueableCommand for T
impl<T> QueueableCommand for T
source§fn queue(&mut self, command: impl Command) -> Result<&mut T, Error>
fn queue(&mut self, command: impl Command) -> Result<&mut T, Error>
Queues the given command for further execution.
Queued commands will be executed in the following cases:
- When
flush
is called manually on the given type implementingio::Write
. - The terminal will
flush
automatically if the buffer is full. - Each line is flushed in case of
stdout
, because it is line buffered.
§Arguments
-
The command that you want to queue for later execution.
§Examples
use std::io::{self, Write};
use crossterm::{QueueableCommand, style::Print};
fn main() -> io::Result<()> {
let mut stdout = io::stdout();
// `Print` will executed executed when `flush` is called.
stdout
.queue(Print("foo 1\n".to_string()))?
.queue(Print("foo 2".to_string()))?;
// some other code (no execution happening here) ...
// when calling `flush` on `stdout`, all commands will be written to the stdout and therefore executed.
stdout.flush()?;
Ok(())
// ==== Output ====
// foo 1
// foo 2
}
Have a look over at the Command API for more details.
§Notes
- In the case of UNIX and Windows 10, ANSI codes are written to the given ‘writer’.
- In case of Windows versions lower than 10, a direct WinAPI call will be made.
The reason for this is that Windows versions lower than 10 do not support ANSI codes,
and can therefore not be written to the given
writer
. Therefore, there is no difference between execute and queue for those old Windows versions.
source§impl<W> SynchronizedUpdate for W
impl<W> SynchronizedUpdate for W
source§fn sync_update<T>(
&mut self,
operations: impl FnOnce(&mut W) -> T
) -> Result<T, Error>
fn sync_update<T>( &mut self, operations: impl FnOnce(&mut W) -> T ) -> Result<T, Error>
Performs a set of actions within a synchronous update.
Updates will be suspended in the terminal, the function will be executed against self, updates will be resumed, and a flush will be performed.
§Arguments
-
Function
A function that performs the operations that must execute in a synchronized update.
§Examples
use std::io;
use crossterm::{ExecutableCommand, SynchronizedUpdate, style::Print};
fn main() -> io::Result<()> {
let mut stdout = io::stdout();
stdout.sync_update(|stdout| {
stdout.execute(Print("foo 1\n".to_string()))?;
stdout.execute(Print("foo 2".to_string()))?;
// The effects of the print command will not be present in the terminal
// buffer, but not visible in the terminal.
std::io::Result::Ok(())
})?;
// The effects of the commands will be visible.
Ok(())
// ==== Output ====
// foo 1
// foo 2
}
§Notes
This command is performed only using ANSI codes, and will do nothing on terminals that do not support ANSI codes, or this specific extension.
When rendering the screen of the terminal, the Emulator usually iterates through each visible grid cell and renders its current state. With applications updating the screen a at higher frequency this can cause tearing.
This mode attempts to mitigate that.
When the synchronization mode is enabled following render calls will keep rendering the last rendered state. The terminal Emulator keeps processing incoming text and sequences. When the synchronized update mode is disabled again the renderer may fetch the latest screen buffer state again, effectively avoiding the tearing effect by unintentionally rendering in the middle a of an application screen update.