mirror of
https://github.com/vlang/v.git
synced 2025-08-03 17:57:59 -04:00
term.ui: fix panic from missing cursor pos response (#24468)
This commit is contained in:
parent
81b238e6f7
commit
0b7a20d938
@ -168,6 +168,9 @@ fn get_cursor_position() (int, int) {
|
|||||||
buf[len] = 0
|
buf[len] = 0
|
||||||
s = tos(buf, len)
|
s = tos(buf, len)
|
||||||
}
|
}
|
||||||
|
if s.len == 0 {
|
||||||
|
return -1, -1
|
||||||
|
}
|
||||||
a := s[2..].split(';')
|
a := s[2..].split(';')
|
||||||
if a.len != 2 {
|
if a.len != 2 {
|
||||||
return -1, -1
|
return -1, -1
|
||||||
|
63
vlib/term/ui/termios_nix_test.v
Normal file
63
vlib/term/ui/termios_nix_test.v
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
module ui
|
||||||
|
|
||||||
|
fn test_get_cursor_position_reads_valid_row_column_data() ! {
|
||||||
|
mut pipeset := [0, 0]
|
||||||
|
mut original_stdin_fd := -1
|
||||||
|
unsafe {
|
||||||
|
if C.pipe(&pipeset[0]) == -1 {
|
||||||
|
return error('unable to create pipe: ${C.strerror(C.errno)}')
|
||||||
|
}
|
||||||
|
|
||||||
|
fake_cursor_pos_data := '\033[45;70R'
|
||||||
|
written_bytes := C.write(pipeset[1], fake_cursor_pos_data.str, fake_cursor_pos_data.len)
|
||||||
|
if written_bytes == -1 {
|
||||||
|
C.close(pipeset[0])
|
||||||
|
C.close(pipeset[1])
|
||||||
|
return error('error writing into pipe: ${C.strerror(C.errno)}')
|
||||||
|
}
|
||||||
|
|
||||||
|
C.close(pipeset[1])
|
||||||
|
|
||||||
|
if C.dup2(pipeset[0], C.STDIN_FILENO) == -1 {
|
||||||
|
C.close(pipeset[0])
|
||||||
|
return error('error redirecting stdin with dup2: ${C.strerror(C.errno)}')
|
||||||
|
}
|
||||||
|
|
||||||
|
C.close(pipeset[0])
|
||||||
|
|
||||||
|
cursor_pos_x, cursor_pos_y := get_cursor_position()
|
||||||
|
assert cursor_pos_x == 45
|
||||||
|
assert cursor_pos_y == 70
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_get_cursor_position_reads_empty_position_data() ! {
|
||||||
|
mut pipeset := [0, 0]
|
||||||
|
mut original_stdin_fd := -1
|
||||||
|
unsafe {
|
||||||
|
if C.pipe(&pipeset[0]) == -1 {
|
||||||
|
return error('unable to create pipe: ${C.strerror(C.errno)}')
|
||||||
|
}
|
||||||
|
|
||||||
|
fake_cursor_pos_data := ''
|
||||||
|
written_bytes := C.write(pipeset[1], fake_cursor_pos_data.str, fake_cursor_pos_data.len)
|
||||||
|
if written_bytes == -1 {
|
||||||
|
C.close(pipeset[0])
|
||||||
|
C.close(pipeset[1])
|
||||||
|
return error('error writing into pipe: ${C.strerror(C.errno)}')
|
||||||
|
}
|
||||||
|
|
||||||
|
C.close(pipeset[1])
|
||||||
|
|
||||||
|
if C.dup2(pipeset[0], C.STDIN_FILENO) == -1 {
|
||||||
|
C.close(pipeset[0])
|
||||||
|
return error('error redirecting stdin with dup2: ${C.strerror(C.errno)}')
|
||||||
|
}
|
||||||
|
|
||||||
|
C.close(pipeset[0])
|
||||||
|
|
||||||
|
cursor_pos_x, cursor_pos_y := get_cursor_position()
|
||||||
|
assert cursor_pos_x == -1
|
||||||
|
assert cursor_pos_y == -1
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user