small software-rendered rust tty
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs57
1 files changed, 34 insertions, 23 deletions
diff --git a/src/main.rs b/src/main.rs
index 8ad18e5..5a110f0 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -55,13 +55,11 @@ fn write(fd: BorrowedFd, x: &[u8]) -> Result<()> {
Ok(())
}
-struct KeyPress(mpsc::Sender<Key>);
+struct KeyPress(mpsc::Sender<(Key, bool)>);
impl InputCallback for KeyPress {
fn add_char(&mut self, _: u32) {}
fn set_key_state(&mut self, key: Key, state: bool) {
- if state {
- self.0.send(key).unwrap();
- }
+ self.0.send((key, state)).unwrap();
}
}
enum Event {
@@ -82,7 +80,7 @@ fn main() -> Result<()> {
)?;
// input
- let (ktx, krx) = mpsc::channel::<Key>();
+ let (ktx, krx) = mpsc::channel();
w.set_input_callback(Box::new(KeyPress(ktx)));
w.update();
@@ -92,24 +90,37 @@ fn main() -> Result<()> {
std::thread::spawn(move || {
use Key::*;
- while let Ok(k) = krx.recv() {
- let x = match k {
- Enter => b"\n",
- Space => b" ",
- Period => b".",
- Slash => b"/",
- Backslash => b"\\",
- Backspace => b"",
- LeftBracket => b"[",
- RightBracket => b"]",
- Comma => b",",
-
- Key0 | Key1 | Key2 | Key3 | Key4 | Key5 | Key6 | Key7
- | Key8 | Key9 => &[k as u8 + b'0'],
-
- _ => &[k as u8 - 10 + b'a'],
- };
- write(pty1.as_fd(), x).unwrap();
+ let mut shifting = false;
+ while let Ok((k, s)) = krx.recv() {
+ if s == true {
+ if k == LeftShift || k == RightShift {
+ shifting = true;
+ continue;
+ }
+ let x = match k {
+ Enter => b"\n",
+ Space => b" ",
+ Period => b".",
+ Slash => b"/",
+ Backslash => b"\\",
+ Backspace => b"",
+ LeftBracket => b"[",
+ RightBracket => b"]",
+ Semicolon if shifting => b":",
+ Semicolon => b";",
+ Comma => b",",
+
+ Key0 | Key1 | Key2 | Key3 | Key4 | Key5 | Key6
+ | Key7 | Key8 | Key9 => &[k as u8 + b'0'],
+
+ _ => &[k as u8 - 10 + b'a'],
+ };
+ write(pty1.as_fd(), x).unwrap();
+ } else {
+ if k == LeftShift || k == RightShift {
+ shifting = false;
+ }
+ }
}
});