summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
authorandromeda <andromeda@lenovo>2026-01-18 02:25:58 +0100
committerandromeda <andromeda@lenovo>2026-01-18 02:25:58 +0100
commitb3e784fa97f68e2e458c632b57d71d89d061d675 (patch)
treedda02239148d18599b8cdc0c574f7884f76a141d /src/main.rs
parent7ef6196f10997f65273782ca71484bbfe1b77d64 (diff)
bump minifb, add shift and ctrl and so, use execve
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs33
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