small software-rendered rust tty
add csi 6n cursor report
bendn 9 months ago
parent 33eba06 · commit 5a76eb7
-rw-r--r--src/main.rs4
-rw-r--r--src/term.rs16
2 files changed, 17 insertions, 3 deletions
diff --git a/src/main.rs b/src/main.rs
index 944318e..d59817b 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -223,7 +223,7 @@ fn main() -> Result<()> {
while let Ok(x) = trx.recv_timeout(Duration::from_millis(16)) {
f.write_all(&x)?;
for char in x {
- t.rx(char);
+ t.rx(char, pty.as_fd());
}
}
let i = render::render(&mut t, w.get_size(), ppem);
@@ -238,7 +238,7 @@ fn main() -> Result<()> {
fn tpaxrse() {
println!("-------------------");
let mut x = TerminalInputParser::new();
- for c in "\x1b[?1049h".as_bytes() {
+ for c in "\x1b[6n".as_bytes() {
use ctlfun::TerminalInput::*;
match x.parse_byte(*c) {
Char(x) => {
diff --git a/src/term.rs b/src/term.rs
index aaf1cec..30e77d5 100644
--- a/src/term.rs
+++ b/src/term.rs
@@ -1,5 +1,6 @@
use std::iter::repeat_n;
use std::ops::Not;
+use std::os::fd::BorrowedFd;
mod cells;
use cells::*;
use ctlfun::Parameter::*;
@@ -52,7 +53,7 @@ impl Terminal {
self.cells.cells().fill(Cell::default());
}
#[implicit_fn::implicit_fn]
- pub fn rx(&mut self, x: u8) {
+ pub fn rx(&mut self, x: u8, pty: BorrowedFd<'_>) {
match self.p.parse_byte(x) {
Continue => {}
Char(x) => {
@@ -225,6 +226,19 @@ impl Terminal {
}
Control(ControlFunction {
start: b'[',
+ params: [Value(6)],
+ end: b'n',
+ ..
+ }) => {
+ super::write(
+ pty,
+ format!("\x1b[{};{}R", self.cells.r(), self.cells.c())
+ .as_bytes(),
+ )
+ .unwrap();
+ }
+ Control(ControlFunction {
+ start: b'[',
params: [x],
end: b'X',
..