feat(userspace): terminal server + shell desktop; US keymap w/ shift; libkos allocator multi-page fix; panics print

This commit is contained in:
2026-10-27 16:50:35 +01:00
parent 2845d190f0
commit b80303f553
26 changed files with 739 additions and 53 deletions

View File

@@ -0,0 +1,70 @@
extern crate std;
use crate::server::{BACKSPACE, Console, TerminalServer};
use server_framework::Server;
use std::vec::Vec;
use types::log::{text_of, text_words};
#[derive(Default)]
struct Fake {
keys: Vec<u8>,
flushes: usize,
timers: usize,
}
impl Console for Fake {
fn draw_row(&mut self, _row: usize, _text: &[u8]) {}
fn draw_cursor(&mut self, _col: usize, _row: usize, _under: u8) {}
fn flush(&mut self) {
self.flushes += 1;
}
fn flush_later(&mut self) {
self.timers += 1;
}
fn next_key(&mut self) -> u8 {
self.keys.remove(0)
}
}
fn term(keys: &[u8]) -> TerminalServer<Fake> {
TerminalServer::new(Fake { keys: keys.to_vec(), ..Fake::default() }, 40, 10)
}
fn read(t: &mut TerminalServer<Fake>) -> Vec<u8> {
let (words, _) = t.handle_call(1, [types::terminal::READ, 0, 0, 0], None);
let (bytes, len) = text_of(words).unwrap();
bytes[..len].to_vec()
}
#[test]
fn writes_land_on_the_grid_and_flush_once_per_burst() {
let mut t = term(&[]);
let before = t.console().flushes;
for chunk in [&b"hello "[..], b"world"] {
t.handle_call(1, text_words(chunk), None);
}
assert_eq!(&t.grid().row(0)[..11], b"hello world");
assert_eq!((t.console().timers, t.console().flushes), (1, before));
t.signal(1);
assert_eq!(t.console().flushes, before + 1);
}
#[test]
fn a_read_returns_the_edited_line_in_chunks() {
let mut keys = b"ls -lx".to_vec();
keys.push(BACKSPACE);
keys.extend_from_slice(b"a /home/someone/very/long\n");
let mut t = term(&keys);
let mut line = read(&mut t);
while line.last() != Some(&b'\n') {
line.extend(read(&mut t));
}
assert_eq!(line, b"ls -la /home/someone/very/long\n");
assert_eq!(&t.grid().row(0)[..6], b"ls -la");
}
#[test]
fn backspace_on_an_empty_line_does_nothing() {
let mut t = term(&[BACKSPACE, b'x', b'\n']);
assert_eq!(read(&mut t), b"x\n");
}