summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs200
1 files changed, 181 insertions, 19 deletions
diff --git a/src/main.rs b/src/main.rs
index 6e680f8..3b6518e 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -2,15 +2,18 @@ use nix::fcntl::{fcntl, F_GETFL, F_SETFL, OFlag};
use nix::pty::{ForkptyResult, forkpty, PtyMaster};
use nix::unistd::{execv, read, write};
-use nonblock::NonBlockingReader;
+use minifb::{Key, KeyRepeat, Window, WindowOptions};
use std::vec;
use std::ffi::CString;
-use std::io;
use vte::{Params, Parser, Perform};
-// yoinked form vte docs
+// window stuff
+const WIDTH: usize = 640;
+const HEIGHT: usize = 360;
+
+// yoinked from vte docs
struct Performer;
impl Perform for Performer {
fn print(&mut self, c: char) {
@@ -56,37 +59,47 @@ impl Perform for Performer {
}
fn main() {
- // TODO get rid of hard coded `sh` path
+ let mut buffer: Vec<u32> = vec![0; WIDTH * HEIGHT];
+ let mut window = Window::new(
+ "rust-term",
+ WIDTH,
+ HEIGHT,
+ WindowOptions::default(),
+ ).unwrap();
+
+ window.set_target_fps(60);
+
let pty = spawn_pty("/home/andromeda/.nix-profile/bin/sh").unwrap();
println!("{:?}", &pty);
let pty_flags = fcntl(&pty, F_GETFL).unwrap();
fcntl(&pty, F_SETFL(OFlag::from_bits_truncate(pty_flags) | OFlag::O_NONBLOCK)).unwrap();
- let stdin = io::stdin();
- let mut nb_stdin = NonBlockingReader::from_fd(stdin).unwrap();
-
let mut statemachine = Parser::new();
let mut performer = Performer;
let mut buf = [0u8; 2048];
- let mut vec: Vec<u8> = vec!();
- loop {
+ while window.is_open() && !window.is_key_down(Key::Escape) {
+ // windowing stuff
+ for i in buffer.iter_mut() {
+ *i = 0;
+ }
+ let keys = window.get_keys_pressed(KeyRepeat::No);
+ window.update_with_buffer(&buffer, WIDTH, HEIGHT).unwrap();
+
+ // other stuff
match read(&pty, &mut buf) {
Ok(0) => (),
Ok(n) => statemachine.advance(&mut performer, &buf[..n]),
Err(_e) => (),
};
- vec.clear();
- match &nb_stdin.read_available(&mut vec) {
- Ok(0) => (),
- Ok(n) => {
- let un = *n as usize;
- buf[..un].copy_from_slice(&vec[..un]);
- let _ = write(&pty, &buf[..un]);
- },
- Err(e) => println!("error: {:?}", e),
+ if !keys.is_empty() {
+ let bytes: Vec<u8> = keys.iter()
+ // TODO apply modifiers
+ .map(|key| key_to_u8(*key, false, false))
+ .collect();
+ write(&pty, bytes.as_slice());
};
- };
+ }
}
// forks a new pty and returns file descriptor of the master
@@ -107,3 +120,152 @@ fn spawn_pty(shell: &str) -> Option<PtyMaster> {
Err(_e) => return None,
};
}
+
+// WARNING not functional; missing some keys and also modifiers
+fn key_to_u8(key: Key, shift: bool, ctrl: bool) -> u8 {
+ let base = match key {
+ Key::Key0 => b'0',
+ Key::Key1 => b'1',
+ Key::Key2 => b'2',
+ Key::Key3 => b'3',
+ Key::Key4 => b'4',
+ Key::Key5 => b'5',
+ Key::Key6 => b'6',
+ Key::Key7 => b'7',
+ Key::Key8 => b'8',
+ Key::Key9 => b'9',
+ Key::A => b'a',
+ Key::B => b'b',
+ Key::C => b'c',
+ Key::D => b'd',
+ Key::E => b'e',
+ Key::F => b'f',
+ Key::G => b'g',
+ Key::H => b'h',
+ Key::I => b'i',
+ Key::J => b'j',
+ Key::K => b'k',
+ Key::L => b'l',
+ Key::M => b'm',
+ Key::N => b'n',
+ Key::O => b'o',
+ Key::P => b'p',
+ Key::Q => b'q',
+ Key::R => b'r',
+ Key::S => b's',
+ Key::T => b't',
+ Key::U => b'u',
+ Key::V => b'v',
+ Key::W => b'w',
+ Key::X => b'x',
+ Key::Y => b'y',
+ Key::Z => b'z',
+ Key::F1 => 0,
+ Key::F2 => 0,
+ Key::F3 => 0,
+ Key::F4 => 0,
+ Key::F5 => 0,
+ Key::F6 => 0,
+ Key::F7 => 0,
+ Key::F8 => 0,
+ Key::F9 => 0,
+ Key::F10 => 0,
+ Key::F11 => 0,
+ Key::F12 => 0,
+ Key::F13 => 0,
+ Key::F14 => 0,
+ Key::F15 => 0,
+ Key::Down => 0,
+ Key::Left => 0,
+ Key::Right => 0,
+ Key::Up => 0,
+ Key::Apostrophe => b'\'',
+ Key::Backquote => b'`',
+ Key::Backslash => b'\\',
+ Key::Comma => b',',
+ Key::Equal => b'=',
+ Key::LeftBracket => b'[',
+ Key::Minus => b'-',
+ Key::Period => b'.',
+ Key::RightBracket => b']',
+ Key::Semicolon => b';',
+ Key::Slash => b'/',
+ Key::Backspace => 8,
+ Key::Delete => 127,
+ Key::End => 0,
+ Key::Enter => b'\n',
+ Key::Escape => 27,
+ Key::Home => 0,
+ Key::Insert => 0,
+ Key::Menu => 0,
+ Key::PageDown => 0,
+ Key::PageUp => 0,
+ Key::Pause => 0,
+ Key::Space => b' ',
+ Key::Tab => b'\t',
+ Key::NumLock => 0,
+ Key::CapsLock => 0,
+ Key::ScrollLock => 0,
+ Key::LeftShift => 0,
+ Key::RightShift => 0,
+ Key::LeftCtrl => 0,
+ Key::RightCtrl => 0,
+ Key::NumPad0 => 0,
+ Key::NumPad1 => 0,
+ Key::NumPad2 => 0,
+ Key::NumPad3 => 0,
+ Key::NumPad4 => 0,
+ Key::NumPad5 => 0,
+ Key::NumPad6 => 0,
+ Key::NumPad7 => 0,
+ Key::NumPad8 => 0,
+ Key::NumPad9 => 0,
+ Key::NumPadDot => 0,
+ Key::NumPadSlash => 0,
+ Key::NumPadAsterisk => 0,
+ Key::NumPadMinus => 0,
+ Key::NumPadPlus => 0,
+ Key::NumPadEnter => 0,
+ Key::LeftAlt => 0,
+ Key::RightAlt => 0,
+ Key::LeftSuper => 0,
+ Key::RightSuper => 0,
+ Key::Unknown => 0,
+ Key::Count => 0,
+ };
+
+ let base_shift = if shift {
+ match base {
+ b'0' => b')',
+ b'1' => b'!',
+ b'2' => b'@',
+ b'3' => b'#',
+ b'4' => b'$',
+ b'5' => b'%',
+ b'6' => b'^',
+ b'7' => b'&',
+ b'8' => b'*',
+ b'9' => b'(',
+ b'a'..=b'z' => base - 32,
+ b'\'' => b'"',
+ b'`' => b'~',
+ b'\\' => b'|',
+ b',' => b'<',
+ b'=' => b'+',
+ b'[' => b'{',
+ b'-' => b'_',
+ b'.' => b'>',
+ b']' => b'}',
+ b';' => b':',
+ b'/' => b'?',
+ _ => base,
+ }
+ } else { base };
+
+ let base_shift_ctrl = if ctrl {
+ base_shift & 0x1F
+ } else { base_shift };
+
+ return base_shift_ctrl;
+}
+