85 lines
1.8 KiB
Go
85 lines
1.8 KiB
Go
|
// +build windows
|
||
|
|
||
|
package winterm
|
||
|
|
||
|
import "github.com/Azure/go-ansiterm"
|
||
|
|
||
|
func (h *windowsAnsiEventHandler) clearRange(attributes uint16, fromCoord COORD, toCoord COORD) error {
|
||
|
// Ignore an invalid (negative area) request
|
||
|
if toCoord.Y < fromCoord.Y {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
var err error
|
||
|
|
||
|
var coordStart = COORD{}
|
||
|
var coordEnd = COORD{}
|
||
|
|
||
|
xCurrent, yCurrent := fromCoord.X, fromCoord.Y
|
||
|
xEnd, yEnd := toCoord.X, toCoord.Y
|
||
|
|
||
|
// Clear any partial initial line
|
||
|
if xCurrent > 0 {
|
||
|
coordStart.X, coordStart.Y = xCurrent, yCurrent
|
||
|
coordEnd.X, coordEnd.Y = xEnd, yCurrent
|
||
|
|
||
|
err = h.clearRect(attributes, coordStart, coordEnd)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
xCurrent = 0
|
||
|
yCurrent += 1
|
||
|
}
|
||
|
|
||
|
// Clear intervening rectangular section
|
||
|
if yCurrent < yEnd {
|
||
|
coordStart.X, coordStart.Y = xCurrent, yCurrent
|
||
|
coordEnd.X, coordEnd.Y = xEnd, yEnd-1
|
||
|
|
||
|
err = h.clearRect(attributes, coordStart, coordEnd)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
xCurrent = 0
|
||
|
yCurrent = yEnd
|
||
|
}
|
||
|
|
||
|
// Clear remaining partial ending line
|
||
|
coordStart.X, coordStart.Y = xCurrent, yCurrent
|
||
|
coordEnd.X, coordEnd.Y = xEnd, yEnd
|
||
|
|
||
|
err = h.clearRect(attributes, coordStart, coordEnd)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (h *windowsAnsiEventHandler) clearRect(attributes uint16, fromCoord COORD, toCoord COORD) error {
|
||
|
region := SMALL_RECT{Top: fromCoord.Y, Left: fromCoord.X, Bottom: toCoord.Y, Right: toCoord.X}
|
||
|
width := toCoord.X - fromCoord.X + 1
|
||
|
height := toCoord.Y - fromCoord.Y + 1
|
||
|
size := uint32(width) * uint32(height)
|
||
|
|
||
|
if size <= 0 {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
buffer := make([]CHAR_INFO, size)
|
||
|
|
||
|
char := CHAR_INFO{ansiterm.FILL_CHARACTER, attributes}
|
||
|
for i := 0; i < int(size); i++ {
|
||
|
buffer[i] = char
|
||
|
}
|
||
|
|
||
|
err := WriteConsoleOutput(h.fd, buffer, COORD{X: width, Y: height}, COORD{X: 0, Y: 0}, ®ion)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|