summaryrefslogtreecommitdiffstats
path: root/vendor/anes/examples/parser.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/anes/examples/parser.rs')
-rw-r--r--vendor/anes/examples/parser.rs106
1 files changed, 106 insertions, 0 deletions
diff --git a/vendor/anes/examples/parser.rs b/vendor/anes/examples/parser.rs
new file mode 100644
index 000000000..a5ec5b6dd
--- /dev/null
+++ b/vendor/anes/examples/parser.rs
@@ -0,0 +1,106 @@
+/// An example how to use the ANSI escape sequence parser.
+use std::io::{Read, Result, Write};
+
+use anes::{
+ self, execute,
+ parser::{KeyCode, Parser, Sequence},
+ queue,
+};
+use libc::termios as Termios;
+
+const HELP: &str = r#"ANES parser example
+
+* Hit `Esc` to quit
+* Hit 'c' to ask for cursor position
+* Use your mouse or type anything
+"#;
+
+fn main() -> Result<()> {
+ let mut w = std::io::stdout();
+ queue!(
+ w,
+ anes::SwitchBufferToAlternate,
+ anes::HideCursor,
+ anes::EnableMouseEvents
+ )?;
+ for line in HELP.split('\n') {
+ queue!(w, line, anes::MoveCursorToNextLine(1))?;
+ }
+ w.flush()?;
+
+ let saved_attributes = get_termios()?;
+ let mut attributes = saved_attributes;
+ make_raw(&mut attributes);
+ set_termios(attributes)?;
+
+ let mut stdin = std::io::stdin();
+ let mut stdin_buffer = [0u8; 1024];
+ let mut parser = Parser::default();
+
+ loop {
+ if let Ok(size) = stdin.read(&mut stdin_buffer) {
+ parser.advance(&stdin_buffer[..size], false);
+
+ let mut break_outer_loop = false;
+
+ while let Some(sequence) = parser.next() {
+ match sequence {
+ Sequence::Key(KeyCode::Esc, _) => {
+ break_outer_loop = true;
+ break;
+ }
+ Sequence::Key(KeyCode::Char('c'), _) => {
+ execute!(w, anes::ReportCursorPosition)?
+ }
+ _ => execute!(
+ w,
+ anes::ClearLine::Left,
+ anes::MoveCursorToColumn(1),
+ format!("{:?}", sequence),
+ )?,
+ }
+ }
+
+ if break_outer_loop {
+ break;
+ }
+ }
+ }
+
+ set_termios(saved_attributes)?;
+
+ execute!(
+ w,
+ anes::DisableMouseEvents,
+ anes::ShowCursor,
+ anes::SwitchBufferToNormal
+ )?;
+ Ok(())
+}
+
+//
+// RAW mode
+//
+
+fn get_termios() -> Result<Termios> {
+ unsafe {
+ let mut termios = std::mem::zeroed();
+ if libc::tcgetattr(libc::STDIN_FILENO, &mut termios) != -1 {
+ Ok(termios)
+ } else {
+ Err(std::io::Error::last_os_error())
+ }
+ }
+}
+
+fn set_termios(termios: Termios) -> Result<()> {
+ if unsafe { libc::tcsetattr(libc::STDIN_FILENO, libc::TCSANOW, &termios) } != -1 {
+ Ok(())
+ } else {
+ Err(std::io::Error::last_os_error())
+ }
+}
+
+fn make_raw(termios: &mut Termios) {
+ unsafe { libc::cfmakeraw(termios) }
+}