github.com/axw/llgo@v0.0.0-20160805011314-95b5fe4dca20/third_party/liner/output_windows.go (about) 1 package liner 2 3 import ( 4 "unsafe" 5 ) 6 7 type coord struct { 8 x, y int16 9 } 10 type smallRect struct { 11 left, top, right, bottom int16 12 } 13 14 type consoleScreenBufferInfo struct { 15 dwSize coord 16 dwCursorPosition coord 17 wAttributes int16 18 srWindow smallRect 19 dwMaximumWindowSize coord 20 } 21 22 func (s *State) cursorPos(x int) { 23 var sbi consoleScreenBufferInfo 24 procGetConsoleScreenBufferInfo.Call(uintptr(s.hOut), uintptr(unsafe.Pointer(&sbi))) 25 procSetConsoleCursorPosition.Call(uintptr(s.hOut), 26 uintptr(int(x)&0xFFFF|int(sbi.dwCursorPosition.y)<<16)) 27 } 28 29 func (s *State) eraseLine() { 30 var sbi consoleScreenBufferInfo 31 procGetConsoleScreenBufferInfo.Call(uintptr(s.hOut), uintptr(unsafe.Pointer(&sbi))) 32 var numWritten uint32 33 procFillConsoleOutputCharacter.Call(uintptr(s.hOut), uintptr(' '), 34 uintptr(sbi.dwSize.x-sbi.dwCursorPosition.x), 35 uintptr(int(sbi.dwCursorPosition.x)&0xFFFF|int(sbi.dwCursorPosition.y)<<16), 36 uintptr(unsafe.Pointer(&numWritten))) 37 } 38 39 func (s *State) eraseScreen() { 40 var sbi consoleScreenBufferInfo 41 procGetConsoleScreenBufferInfo.Call(uintptr(s.hOut), uintptr(unsafe.Pointer(&sbi))) 42 var numWritten uint32 43 procFillConsoleOutputCharacter.Call(uintptr(s.hOut), uintptr(' '), 44 uintptr(sbi.dwSize.x)*uintptr(sbi.dwSize.y), 45 0, 46 uintptr(unsafe.Pointer(&numWritten))) 47 procSetConsoleCursorPosition.Call(uintptr(s.hOut), 0) 48 } 49 50 func (s *State) moveUp(lines int) { 51 var sbi consoleScreenBufferInfo 52 procGetConsoleScreenBufferInfo.Call(uintptr(s.hOut), uintptr(unsafe.Pointer(&sbi))) 53 procSetConsoleCursorPosition.Call(uintptr(s.hOut), 54 uintptr(int(sbi.dwCursorPosition.x)&0xFFFF|(int(sbi.dwCursorPosition.y)-lines)<<16)) 55 } 56 57 func (s *State) moveDown(lines int) { 58 var sbi consoleScreenBufferInfo 59 procGetConsoleScreenBufferInfo.Call(uintptr(s.hOut), uintptr(unsafe.Pointer(&sbi))) 60 procSetConsoleCursorPosition.Call(uintptr(s.hOut), 61 uintptr(int(sbi.dwCursorPosition.x)&0xFFFF|(int(sbi.dwCursorPosition.y)+lines)<<16)) 62 } 63 64 func (s *State) emitNewLine() { 65 // windows doesn't need to omit a new line 66 } 67 68 func (s *State) getColumns() { 69 var sbi consoleScreenBufferInfo 70 procGetConsoleScreenBufferInfo.Call(uintptr(s.hOut), uintptr(unsafe.Pointer(&sbi))) 71 s.columns = int(sbi.dwSize.x) 72 }