use super::InputEvent;
use libc::getchar;
use libc::EOF;
use std::sync::mpsc;
const BUF_SIZE: usize = 8;
fn handle_input(buf: &[u8], log_ch: &mpsc::Sender<InputEvent>) -> bool {
const CODE_LEFT: &[u8] = &[27, 91, 68];
const CODE_RIGHT: &[u8] = &[27, 91, 67];
const CODE_UP: &[u8] = &[27, 91, 65];
const CODE_DOWN: &[u8] = &[27, 91, 66];
const CODE_TAB: &[u8] = b"\t";
const CODE_HOME: &[u8] = &[27, 91, 72];
const CODE_END: &[u8] = &[27, 91, 70];
if buf == b"\x04" {
unsafe { libc::close(0) };
} else if buf == CODE_LEFT {
log_ch.send(InputEvent::Left).unwrap();
return true;
} else if buf == CODE_RIGHT {
log_ch.send(InputEvent::Right).unwrap();
return true;
} else if buf == CODE_TAB {
log_ch.send(InputEvent::Complete).unwrap();
return true;
} else if buf == CODE_UP {
log_ch.send(InputEvent::HistoryPrev).unwrap();
return true;
} else if buf == CODE_DOWN {
log_ch.send(InputEvent::HistoryNext).unwrap();
return true;
} else if buf == CODE_HOME {
log_ch.send(InputEvent::LineStart).unwrap();
return true;
} else if buf == CODE_END {
log_ch.send(InputEvent::LineEnd).unwrap();
return true;
} else if buf == b"\n" {
log_ch.send(InputEvent::NewLine).unwrap();
return true;
} else if buf == b"\x7f" {
log_ch.send(InputEvent::Delete).unwrap();
return true;
} else if buf[0] != 27 {
log_ch
.send(InputEvent::Input(String::from_utf8_lossy(buf).into()))
.unwrap();
return true;
}
false
}
pub fn input_thread(log_ch: mpsc::Sender<InputEvent>) {
let mut buf: [u8; BUF_SIZE] = [0; BUF_SIZE];
let mut idx = 0;
loop {
let ch = unsafe { getchar() };
if ch == EOF {
break;
}
if idx == BUF_SIZE {
idx = 0;
}
buf[idx] = ch as u8;
if idx < BUF_SIZE {
idx += 1;
}
if handle_input(&buf[..idx], &log_ch) {
idx = 0;
}
}
log_ch.send(InputEvent::End).unwrap();
}