diff options
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/src/main.rs b/src/main.rs index 0c83398..927e5ff 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,6 @@ use nix::fcntl::{fcntl, OFlag, F_GETFL, F_SETFL}; use nix::pty::{forkpty, ForkptyResult, PtyMaster}; -use nix::unistd::{execv, read, write}; +use nix::unistd::{execve, read, write}; use minifb::{Key, KeyRepeat, Window, WindowOptions}; @@ -242,11 +242,19 @@ fn main() { }; let keys = window.get_keys_pressed(KeyRepeat::No); + if !keys.is_empty() { println!("{:?}", keys); } + let shift = window.is_key_down(Key::LeftShift); + let ctrl = window.is_key_down(Key::LeftCtrl); if !keys.is_empty() { let bytes: Vec<u8> = keys .iter() // TODO apply modifiers - .map(|key| key_to_u8(*key, false, false)) + .map(|key| key_to_u8( + *key, // key + shift, + ctrl + )) + .filter(|v| *v != 0u8) .collect(); write(&pty, bytes.as_slice()); }; @@ -263,13 +271,14 @@ fn spawn_pty() -> Option<PtyMaster> { return Some(unsafe { PtyMaster::from_owned_fd(master) }); } ForkptyResult::Child => { - let _ = execv::<CString>( + let _ = execve::<CString, CString>( &CString::new("/usr/bin/env").unwrap(), &[ CString::new("/usr/bin/env").unwrap(), CString::new("-i").unwrap(), CString::new("sh").unwrap(), CString::new("--norc").unwrap(), CString::new("--noprofile").unwrap() ], + &[ CString::new("TERM=dumb").unwrap() ], ); return None; } @@ -280,7 +289,7 @@ fn spawn_pty() -> Option<PtyMaster> { // WARNING not functional; missing some keys and also modifiers fn key_to_u8(key: Key, shift: bool, ctrl: bool) -> u8 { - let base = match key { + let mut base = match key { Key::Key0 => b'0', Key::Key1 => b'1', Key::Key2 => b'2', @@ -391,8 +400,8 @@ fn key_to_u8(key: Key, shift: bool, ctrl: bool) -> u8 { Key::Count => 0, }; - let base_shift = if shift { - match base { + if shift { + base = match base { b'0' => b')', b'1' => b'!', b'2' => b'@', @@ -416,14 +425,14 @@ fn key_to_u8(key: Key, shift: bool, ctrl: bool) -> u8 { b';' => b':', b'/' => b'?', _ => base, - } - } else { - base - }; + }; + } - let base_shift_ctrl = if ctrl { base_shift & 0x1F } else { base_shift }; + if ctrl { + base = base & 0x1F; + } - return base_shift_ctrl; + return base; } // creats a mapping from a `char` to its svg spec for a selection of characters |
