Parse bytes into keys with Termion
This commit is contained in:
parent
b5f9066172
commit
01eaedcd37
7 changed files with 60 additions and 12 deletions
28
Cargo.lock
generated
28
Cargo.lock
generated
|
|
@ -892,6 +892,7 @@ dependencies = [
|
||||||
"signal-hook",
|
"signal-hook",
|
||||||
"strip-ansi-escapes",
|
"strip-ansi-escapes",
|
||||||
"structopt",
|
"structopt",
|
||||||
|
"termion",
|
||||||
"termios",
|
"termios",
|
||||||
"unicode-truncate",
|
"unicode-truncate",
|
||||||
"unicode-width",
|
"unicode-width",
|
||||||
|
|
@ -932,6 +933,12 @@ dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "numtoa"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "object"
|
name = "object"
|
||||||
version = "0.22.0"
|
version = "0.22.0"
|
||||||
|
|
@ -1135,6 +1142,15 @@ version = "0.1.57"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce"
|
checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "redox_termios"
|
||||||
|
version = "0.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76"
|
||||||
|
dependencies = [
|
||||||
|
"redox_syscall",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "regalloc"
|
name = "regalloc"
|
||||||
version = "0.0.31"
|
version = "0.0.31"
|
||||||
|
|
@ -1436,6 +1452,18 @@ dependencies = [
|
||||||
"winapi",
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "termion"
|
||||||
|
version = "1.5.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c22cec9d8978d906be5ac94bceb5a010d885c626c4c8855721a4dbd20e3ac905"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"numtoa",
|
||||||
|
"redox_syscall",
|
||||||
|
"redox_termios",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "termios"
|
name = "termios"
|
||||||
version = "0.3.2"
|
version = "0.3.2"
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@ serde_yaml = "0.8"
|
||||||
signal-hook = "0.1.10"
|
signal-hook = "0.1.10"
|
||||||
strip-ansi-escapes = "0.1.0"
|
strip-ansi-escapes = "0.1.0"
|
||||||
structopt = "0.3"
|
structopt = "0.3"
|
||||||
|
termion = "1.5.5"
|
||||||
termios = "0.3"
|
termios = "0.3"
|
||||||
unicode-truncate = "0.1.1"
|
unicode-truncate = "0.1.1"
|
||||||
unicode-width = "0.1.8"
|
unicode-width = "0.1.8"
|
||||||
|
|
|
||||||
|
|
@ -243,6 +243,7 @@ use crate::wasm_vm::PluginInstruction;
|
||||||
pub enum PluginContext {
|
pub enum PluginContext {
|
||||||
Load,
|
Load,
|
||||||
Draw,
|
Draw,
|
||||||
|
Input,
|
||||||
Unload,
|
Unload,
|
||||||
Quit,
|
Quit,
|
||||||
}
|
}
|
||||||
|
|
@ -252,6 +253,7 @@ impl From<&PluginInstruction> for PluginContext {
|
||||||
match *plugin_instruction {
|
match *plugin_instruction {
|
||||||
PluginInstruction::Load(..) => PluginContext::Load,
|
PluginInstruction::Load(..) => PluginContext::Load,
|
||||||
PluginInstruction::Draw(..) => PluginContext::Draw,
|
PluginInstruction::Draw(..) => PluginContext::Draw,
|
||||||
|
PluginInstruction::Input(..) => PluginContext::Input,
|
||||||
PluginInstruction::Unload(_) => PluginContext::Unload,
|
PluginInstruction::Unload(_) => PluginContext::Unload,
|
||||||
PluginInstruction::Quit => PluginContext::Quit,
|
PluginInstruction::Quit => PluginContext::Quit,
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@ mod utils;
|
||||||
|
|
||||||
mod wasm_vm;
|
mod wasm_vm;
|
||||||
|
|
||||||
|
use std::cell::RefCell;
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
use std::os::unix::net::UnixStream;
|
use std::os::unix::net::UnixStream;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
@ -24,6 +25,7 @@ use std::thread;
|
||||||
use panes::PaneId;
|
use panes::PaneId;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use structopt::StructOpt;
|
use structopt::StructOpt;
|
||||||
|
use termion::input::TermRead;
|
||||||
use wasm_vm::PluginInstruction;
|
use wasm_vm::PluginInstruction;
|
||||||
|
|
||||||
use crate::command_is_executing::CommandIsExecuting;
|
use crate::command_is_executing::CommandIsExecuting;
|
||||||
|
|
@ -37,7 +39,6 @@ use crate::utils::{
|
||||||
consts::{MOSAIC_IPC_PIPE, MOSAIC_TMP_DIR, MOSAIC_TMP_LOG_DIR},
|
consts::{MOSAIC_IPC_PIPE, MOSAIC_TMP_DIR, MOSAIC_TMP_LOG_DIR},
|
||||||
logging::*,
|
logging::*,
|
||||||
};
|
};
|
||||||
use std::cell::RefCell;
|
|
||||||
|
|
||||||
thread_local!(static OPENCALLS: RefCell<ErrorContext> = RefCell::default());
|
thread_local!(static OPENCALLS: RefCell<ErrorContext> = RefCell::default());
|
||||||
|
|
||||||
|
|
@ -462,6 +463,12 @@ pub fn start(mut os_input: Box<dyn OsApi>, opts: Opt) {
|
||||||
|
|
||||||
buf_tx.send(wasi_stdout(&wasi_env)).unwrap();
|
buf_tx.send(wasi_stdout(&wasi_env)).unwrap();
|
||||||
}
|
}
|
||||||
|
PluginInstruction::Input(pid, input_bytes) => {
|
||||||
|
let (instance, wasi_env) = plugin_map.get(&pid).unwrap();
|
||||||
|
|
||||||
|
let handle_key = instance.exports.get_function("handle_key").unwrap();
|
||||||
|
dbg!(input_bytes.keys().collect::<Vec<_>>());
|
||||||
|
}
|
||||||
PluginInstruction::Quit => break,
|
PluginInstruction::Quit => break,
|
||||||
i => panic!("Yo, dawg, nice job calling the wasm thread!\n {:?} is defo not implemented yet...", i),
|
i => panic!("Yo, dawg, nice job calling the wasm thread!\n {:?} is defo not implemented yet...", i),
|
||||||
}
|
}
|
||||||
|
|
|
||||||
14
src/tab.rs
14
src/tab.rs
|
|
@ -472,16 +472,24 @@ impl Tab {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn write_to_active_terminal(&mut self, input_bytes: Vec<u8>) {
|
pub fn write_to_active_terminal(&mut self, input_bytes: Vec<u8>) {
|
||||||
if let Some(active_terminal_id) = &self.get_active_terminal_id() {
|
match self.get_active_pane_id() {
|
||||||
|
Some(PaneId::Terminal(active_terminal_id)) => {
|
||||||
let active_terminal = self.get_active_pane().unwrap();
|
let active_terminal = self.get_active_pane().unwrap();
|
||||||
let mut adjusted_input = active_terminal.adjust_input_to_terminal(input_bytes);
|
let mut adjusted_input = active_terminal.adjust_input_to_terminal(input_bytes);
|
||||||
self.os_api
|
self.os_api
|
||||||
.write_to_tty_stdin(*active_terminal_id, &mut adjusted_input)
|
.write_to_tty_stdin(active_terminal_id, &mut adjusted_input)
|
||||||
.expect("failed to write to terminal");
|
.expect("failed to write to terminal");
|
||||||
self.os_api
|
self.os_api
|
||||||
.tcdrain(*active_terminal_id)
|
.tcdrain(active_terminal_id)
|
||||||
.expect("failed to drain terminal");
|
.expect("failed to drain terminal");
|
||||||
}
|
}
|
||||||
|
Some(PaneId::Plugin(pid)) => {
|
||||||
|
self.send_plugin_instructions
|
||||||
|
.send(PluginInstruction::Input(pid, input_bytes))
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
pub fn get_active_terminal_cursor_position(&self) -> Option<(usize, usize)> {
|
pub fn get_active_terminal_cursor_position(&self) -> Option<(usize, usize)> {
|
||||||
// (x, y)
|
// (x, y)
|
||||||
|
|
|
||||||
|
|
@ -15,4 +15,4 @@ parts:
|
||||||
- direction: Vertical
|
- direction: Vertical
|
||||||
split_size:
|
split_size:
|
||||||
Percent: 20
|
Percent: 20
|
||||||
#plugin: strider.wasm
|
plugin: strider.wasm
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ use wasmer_wasi::WasiEnv;
|
||||||
pub enum PluginInstruction {
|
pub enum PluginInstruction {
|
||||||
Load(Sender<u32>, PathBuf),
|
Load(Sender<u32>, PathBuf),
|
||||||
Draw(Sender<String>, u32, usize, usize), // String buffer, plugin id, rows, cols
|
Draw(Sender<String>, u32, usize, usize), // String buffer, plugin id, rows, cols
|
||||||
|
Input(u32, Vec<u8>), // plugin id, input bytes
|
||||||
Unload(u32),
|
Unload(u32),
|
||||||
Quit,
|
Quit,
|
||||||
}
|
}
|
||||||
|
|
@ -24,6 +25,7 @@ pub fn mosaic_imports(store: &Store, wasi_env: &WasiEnv) -> ImportObject {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME: Bundle up all of the channels! Pair that with WasiEnv?
|
||||||
fn host_open_file(wasi_env: &WasiEnv) {
|
fn host_open_file(wasi_env: &WasiEnv) {
|
||||||
Command::new("xdg-open")
|
Command::new("xdg-open")
|
||||||
.arg(format!(
|
.arg(format!(
|
||||||
|
|
@ -46,7 +48,7 @@ pub fn wasi_stdout(wasi_env: &WasiEnv) -> String {
|
||||||
buf
|
buf
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn _wasi_write_string(wasi_env: &WasiEnv, buf: &str) {
|
pub fn wasi_write_string(wasi_env: &WasiEnv, buf: &str) {
|
||||||
let mut state = wasi_env.state();
|
let mut state = wasi_env.state();
|
||||||
let wasi_file = state.fs.stdin_mut().unwrap().as_mut().unwrap();
|
let wasi_file = state.fs.stdin_mut().unwrap().as_mut().unwrap();
|
||||||
writeln!(wasi_file, "{}\r", buf).unwrap();
|
writeln!(wasi_file, "{}\r", buf).unwrap();
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue