aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/vlib/term/term_nix.c.v
diff options
context:
space:
mode:
Diffstat (limited to 'v_windows/v/vlib/term/term_nix.c.v')
-rw-r--r--v_windows/v/vlib/term/term_nix.c.v105
1 files changed, 105 insertions, 0 deletions
diff --git a/v_windows/v/vlib/term/term_nix.c.v b/v_windows/v/vlib/term/term_nix.c.v
new file mode 100644
index 0000000..45a0a9b
--- /dev/null
+++ b/v_windows/v/vlib/term/term_nix.c.v
@@ -0,0 +1,105 @@
+module term
+
+import os
+
+#include <sys/ioctl.h>
+#include <termios.h> // TIOCGWINSZ
+
+pub struct C.winsize {
+pub:
+ ws_row u16
+ ws_col u16
+ ws_xpixel u16
+ ws_ypixel u16
+}
+
+fn C.ioctl(fd int, request u64, arg voidptr) int
+
+// get_terminal_size returns a number of colums and rows of terminal window.
+pub fn get_terminal_size() (int, int) {
+ if os.is_atty(1) <= 0 || os.getenv('TERM') == 'dumb' {
+ return default_columns_size, default_rows_size
+ }
+ w := C.winsize{}
+ C.ioctl(1, u64(C.TIOCGWINSZ), &w)
+ return int(w.ws_col), int(w.ws_row)
+}
+
+// get_cursor_position returns a Coord containing the current cursor position
+pub fn get_cursor_position() Coord {
+ if os.is_atty(1) <= 0 || os.getenv('TERM') == 'dumb' {
+ return Coord{
+ x: 0
+ y: 0
+ }
+ }
+ // TODO: use termios.h, C.tcgetattr & C.tcsetattr directly,
+ // instead of using `stty`
+ mut oldsettings := os.execute('stty -g')
+ if oldsettings.exit_code < 0 {
+ oldsettings = os.Result{}
+ }
+ os.system('stty -echo -icanon time 0')
+ print('\033[6n')
+ mut ch := int(0)
+ mut i := 0
+ // ESC [ YYY `;` XXX `R`
+ mut reading_x := false
+ mut reading_y := false
+ mut x := 0
+ mut y := 0
+ for {
+ ch = C.getchar()
+ b := byte(ch)
+ i++
+ if i >= 15 {
+ panic('C.getchar() called too many times')
+ }
+ // state management:
+ if b == `R` {
+ break
+ }
+ if b == `[` {
+ reading_y = true
+ reading_x = false
+ continue
+ }
+ if b == `;` {
+ reading_y = false
+ reading_x = true
+ continue
+ }
+ // converting string vals to ints:
+ if reading_x {
+ x *= 10
+ x += (b - byte(`0`))
+ }
+ if reading_y {
+ y *= 10
+ y += (b - byte(`0`))
+ }
+ }
+ // restore the old terminal settings:
+ os.system('stty $oldsettings.output')
+ return Coord{
+ x: x
+ y: y
+ }
+}
+
+// set_terminal_title change the terminal title
+pub fn set_terminal_title(title string) bool {
+ if os.is_atty(1) <= 0 || os.getenv('TERM') == 'dumb' {
+ return true
+ }
+ print('\033]0')
+ print(title)
+ print('\007')
+ return true
+}
+
+// clear clears current terminal screen.
+pub fn clear() {
+ print('\x1b[2J')
+ print('\x1b[H')
+}