cursor_windows.go raw
1 package ansi
2
3 import (
4 "os"
5 "syscall"
6 "unsafe"
7 )
8
9 func CursorUp(n int) {
10 cursorMove(0, -n)
11 }
12
13 func CursorDown(n int) {
14 cursorMove(0, n)
15 }
16
17 func CursorForward(n int) {
18 cursorMove(n, 0)
19 }
20
21 func CursorBack(n int) {
22 cursorMove(-n, 0)
23 }
24
25 func cursorMove(x int, y int) {
26 handle := syscall.Handle(os.Stdout.Fd())
27
28 var csbi consoleScreenBufferInfo
29 procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi)))
30
31 var cursor coord
32 cursor.x = csbi.cursorPosition.x + short(x)
33 cursor.y = csbi.cursorPosition.y + short(y)
34
35 procSetConsoleCursorPosition.Call(uintptr(handle), uintptr(*(*int32)(unsafe.Pointer(&cursor))))
36 }
37
38 func CursorNextLine(n int) {
39 CursorUp(n)
40 CursorHorizontalAbsolute(0)
41 }
42
43 func CursorPreviousLine(n int) {
44 CursorDown(n)
45 CursorHorizontalAbsolute(0)
46 }
47
48 func CursorHorizontalAbsolute(x int) {
49 handle := syscall.Handle(os.Stdout.Fd())
50
51 var csbi consoleScreenBufferInfo
52 procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi)))
53
54 var cursor coord
55 cursor.x = short(x)
56 cursor.y = csbi.cursorPosition.y
57
58 if csbi.size.x < cursor.x {
59 cursor.x = csbi.size.x
60 }
61
62 procSetConsoleCursorPosition.Call(uintptr(handle), uintptr(*(*int32)(unsafe.Pointer(&cursor))))
63 }
64
65 func CursorShow() {
66 handle := syscall.Handle(os.Stdout.Fd())
67
68 var cci consoleCursorInfo
69 procGetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&cci)))
70 cci.visible = 1
71
72 procSetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&cci)))
73 }
74
75 func CursorHide() {
76 handle := syscall.Handle(os.Stdout.Fd())
77
78 var cci consoleCursorInfo
79 procGetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&cci)))
80 cci.visible = 0
81
82 procSetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&cci)))
83 }
84