1use std::sync::Arc;
2
3use vt100::Parser;
4
5pub(crate) fn check_for_terminal_queries(
9 data: &[u8],
10 parser: &Arc<std::sync::RwLock<Parser>>,
11) -> Vec<Vec<u8>> {
12 let mut responses = Vec::new();
13
14 if data.windows(4).any(|w| w == b"\x1b[6n")
16 && let Ok(p) = parser.read()
17 {
18 let (row, col) = p.screen().cursor_position();
19 let response = format!("\x1b[{};{}R", row + 1, col + 1);
20 responses.push(response.into_bytes());
21 }
22
23 if data.windows(5).any(|w| w == b"\x1b[?6n")
25 && let Ok(p) = parser.read()
26 {
27 let (row, col) = p.screen().cursor_position();
28 let response = format!("\x1b[?{};{}R", row + 1, col + 1);
29 responses.push(response.into_bytes());
30 }
31
32 if data.windows(4).any(|w| w == b"\x1b[5n") {
34 responses.push(b"\x1b[0n".to_vec());
35 }
36
37 if data.windows(3).any(|w| w == b"\x1b[c") || data.windows(4).any(|w| w == b"\x1b[0c") {
39 responses.push(b"\x1b[?62;22c".to_vec());
40 }
41
42 if data.windows(4).any(|w| w == b"\x1b>c") || data.windows(5).any(|w| w == b"\x1b>0c") {
44 responses.push(b"\x1b[>0;0;0c".to_vec());
45 }
46
47 responses
48}