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