2019-08-21 16:46:14 -04:00
|
|
|
use nix::Error as NixError;
|
|
|
|
use nix::sys::termios;
|
2019-08-22 14:25:18 -04:00
|
|
|
use nix::sys::termios::{InputFlags, LocalFlags, OutputFlags, SpecialCharacterIndices, Termios};
|
|
|
|
|
2019-08-21 14:39:17 -04:00
|
|
|
use std::io;
|
|
|
|
use std::io::{BufReader, Error};
|
|
|
|
use std::io::prelude::*;
|
|
|
|
|
2019-08-22 14:25:18 -04:00
|
|
|
use term_parser::ActionIter;
|
|
|
|
|
|
|
|
mod editor;
|
|
|
|
mod helpers;
|
|
|
|
|
|
|
|
// use crate::editor::Editor;
|
|
|
|
use crate::helpers::*;
|
|
|
|
|
2019-08-21 16:51:45 -04:00
|
|
|
// Redefine the posix constants for rust land
|
|
|
|
const STDIN_FILENO: i32 = 0;
|
2019-08-22 14:25:18 -04:00
|
|
|
// const STDOUT_FILENO: i32 = 1;
|
|
|
|
// const STDERR_FILENO: i32 = 2;
|
|
|
|
|
|
|
|
fn disable_raw_mode(original: &Termios) -> Result<(), Error> {
|
|
|
|
match termios::tcsetattr(STDIN_FILENO, termios::SetArg::TCSAFLUSH, original) {
|
|
|
|
Ok(()) => Ok(()),
|
|
|
|
Err(E) => match E.as_errno() {
|
|
|
|
Some(errno) => die(&errno, "tcsetattr"),
|
|
|
|
None => panic!("Failed to disable raw mode")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2019-08-21 16:46:14 -04:00
|
|
|
|
|
|
|
fn enable_raw_mode() -> Result<(), Error> {
|
2019-08-22 14:25:18 -04:00
|
|
|
let mut raw = termios::tcgetattr(STDIN_FILENO).unwrap();
|
|
|
|
|
|
|
|
raw.input_flags.remove(
|
|
|
|
InputFlags::BRKINT &
|
|
|
|
InputFlags::ICRNL &
|
|
|
|
InputFlags::INPCK &
|
|
|
|
InputFlags::ISTRIP &
|
|
|
|
InputFlags::IXON
|
|
|
|
);
|
|
|
|
|
|
|
|
raw.output_flags.remove(OutputFlags::OPOST);
|
|
|
|
|
|
|
|
raw.local_flags.remove(
|
|
|
|
LocalFlags::ECHO &
|
|
|
|
LocalFlags::ICANON &
|
|
|
|
LocalFlags::IEXTEN &
|
|
|
|
LocalFlags::ISIG
|
|
|
|
);
|
|
|
|
|
|
|
|
// 8 bit characters
|
|
|
|
raw.control_flags |= termios::ControlFlags::CS8;
|
|
|
|
|
|
|
|
raw.control_chars[SpecialCharacterIndices::VMIN as usize] = 0;
|
|
|
|
raw.control_chars[SpecialCharacterIndices::VTIME as usize] = 1;
|
2019-08-21 16:46:14 -04:00
|
|
|
|
2019-08-21 16:51:45 -04:00
|
|
|
match termios::tcsetattr(STDIN_FILENO, termios::SetArg::TCSAFLUSH, &raw) {
|
2019-08-21 16:46:14 -04:00
|
|
|
Ok(()) => Ok(()),
|
2019-08-22 14:25:18 -04:00
|
|
|
Err(e) => match e.as_errno() {
|
|
|
|
Some(errno) => die(&errno, "tcsetattr"),
|
|
|
|
None => panic!("Failed to enable raw mode")
|
|
|
|
}
|
2019-08-21 16:46:14 -04:00
|
|
|
}
|
|
|
|
}
|
2019-08-21 14:39:17 -04:00
|
|
|
|
|
|
|
fn main() -> Result<(), Error> {
|
2019-08-22 14:25:18 -04:00
|
|
|
let orig_termios = termios::tcgetattr(STDIN_FILENO).unwrap();
|
2019-08-21 16:46:14 -04:00
|
|
|
|
2019-08-22 14:25:18 -04:00
|
|
|
enable_raw_mode()?;
|
2019-08-21 14:39:17 -04:00
|
|
|
|
2019-08-22 14:25:18 -04:00
|
|
|
let stdin = io::stdin();
|
|
|
|
let buffer = BufReader::new(stdin);
|
|
|
|
let term_code_iter = ActionIter::new(buffer);
|
2019-08-21 14:39:17 -04:00
|
|
|
|
2019-08-22 14:25:18 -04:00
|
|
|
for term_code in term_code_iter {
|
|
|
|
let term_code = match term_code {
|
|
|
|
Ok(code) => code,
|
|
|
|
Err(e) => panic!("{:?}", e),
|
|
|
|
};
|
|
|
|
println!("\r{:?}", term_code);
|
2019-08-21 14:39:17 -04:00
|
|
|
}
|
2019-08-21 16:46:14 -04:00
|
|
|
|
|
|
|
Ok(())
|
2019-08-22 14:25:18 -04:00
|
|
|
|
|
|
|
// loop {
|
|
|
|
// let stdin = io::stdin();
|
|
|
|
// let mut in_str = String::new();
|
|
|
|
// let mut input = BufReader::new(stdin.take(1));
|
|
|
|
// input.read_to_string(&mut in_str)?;
|
|
|
|
//
|
|
|
|
// let mut chars = in_str.chars();
|
|
|
|
// let char = chars.next().unwrap();
|
|
|
|
//
|
|
|
|
// if char == 'q' {
|
|
|
|
// return disable_raw_mode(&orig_termios);
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// // Echo characters
|
|
|
|
// if is_cntrl(char) {
|
|
|
|
// print!("{}\r\n", char as u8);
|
|
|
|
// continue;
|
|
|
|
// } else {
|
|
|
|
// print!("{} ('{}')\r\n", char as u8, char);
|
|
|
|
// continue;
|
|
|
|
// }
|
|
|
|
// }
|
2019-08-21 14:39:17 -04:00
|
|
|
}
|