feat(userspace): programs in /bin w/o .elf; bin manifests (needs = display) so shell runs snake; Ctrl+C kills foreground via terminal interrupt notification; ctrl keys; sleep
This commit is contained in:
@@ -31,6 +31,7 @@ pub struct VirtioInputDevice {
|
||||
next_avail: u16,
|
||||
evbuf_pa: usize,
|
||||
shift: bool,
|
||||
ctrl: bool,
|
||||
}
|
||||
|
||||
impl VirtioInputDevice {
|
||||
@@ -48,7 +49,7 @@ impl VirtioInputDevice {
|
||||
let evbuf_pa = libkos::device::dma(1, EVBUF_VA).ok()?;
|
||||
hw_virtio::mmio::init_legacy_device(®s, vq_pa, QUEUE_SIZE as u32);
|
||||
|
||||
let mut dev = Self { last_used: 0, next_avail: 0, evbuf_pa, shift: false };
|
||||
let mut dev = Self { last_used: 0, next_avail: 0, evbuf_pa, shift: false, ctrl: false };
|
||||
dev.fill_queue();
|
||||
Some(dev)
|
||||
}
|
||||
@@ -139,8 +140,13 @@ impl InputDevice for VirtioInputDevice {
|
||||
self.shift = ev_value != 0;
|
||||
continue;
|
||||
}
|
||||
if ev_type == EV_KEY && matches!(ev_code, keymap::LEFT_CTRL | keymap::RIGHT_CTRL) {
|
||||
self.ctrl = ev_value != 0;
|
||||
continue;
|
||||
}
|
||||
if ev_type == EV_KEY {
|
||||
if let Some(key) = keymap::key(ev_code, self.shift) {
|
||||
let key = keymap::key(ev_code, self.shift).map(|k| if self.ctrl { keymap::with_ctrl(k) } else { k });
|
||||
if let Some(key) = key {
|
||||
if ev_value == KEY_PRESS {
|
||||
return Some(InputEvent::KeyDown(key));
|
||||
} else if ev_value == 0 {
|
||||
|
||||
Reference in New Issue
Block a user