diff --git a/cwriter/writer_windows.go b/cwriter/writer_windows.go index dd5b10c..7125289 100644 --- a/cwriter/writer_windows.go +++ b/cwriter/writer_windows.go @@ -17,26 +17,22 @@ procFillConsoleOutputAttribute = kernel32.NewProc("FillConsoleOutputAttribute") ) -type short int16 -type dword uint32 -type word uint16 - type coord struct { - x short - y short + x int16 + y int16 } type smallRect struct { - left short - top short - right short - bottom short + left int16 + top int16 + right int16 + bottom int16 } type consoleScreenBufferInfo struct { size coord cursorPosition coord - attributes word + attributes uint16 window smallRect maximumWindowSize coord } @@ -48,17 +44,17 @@ var info consoleScreenBufferInfo procGetConsoleScreenBufferInfo.Call(w.fd, uintptr(unsafe.Pointer(&info))) - for i := 0; i < w.lineCount; i++ { - // move the cursor up - info.cursorPosition.y-- - procSetConsoleCursorPosition.Call(w.fd, uintptr(*(*int32)(unsafe.Pointer(&info.cursorPosition)))) - // clear the line - cursor := coord{ - x: info.window.left, - y: info.window.top + info.cursorPosition.y, - } - var count, dw dword - count = dword(info.size.x) - procFillConsoleOutputCharacter.Call(w.fd, uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&dw))) + info.cursorPosition.y -= int16(w.lineCount) + if info.cursorPosition.y < 0 { + info.cursorPosition.y = 0 } + procSetConsoleCursorPosition.Call(w.fd, uintptr(uint32(uint16(info.cursorPosition.y))<<16|uint32(uint16(info.cursorPosition.x)))) + + // clear the lines + cursor := coord{ + x: info.window.left, + y: info.cursorPosition.y, + } + count := uint32(info.size.x) * uint32(w.lineCount) + procFillConsoleOutputCharacter.Call(w.fd, uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(new(uint32)))) }