erase_helpers.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // +build windows
  2. package winterm
  3. import "github.com/Azure/go-ansiterm"
  4. func (h *windowsAnsiEventHandler) clearRange(attributes uint16, fromCoord COORD, toCoord COORD) error {
  5. // Ignore an invalid (negative area) request
  6. if toCoord.Y < fromCoord.Y {
  7. return nil
  8. }
  9. var err error
  10. var coordStart = COORD{}
  11. var coordEnd = COORD{}
  12. xCurrent, yCurrent := fromCoord.X, fromCoord.Y
  13. xEnd, yEnd := toCoord.X, toCoord.Y
  14. // Clear any partial initial line
  15. if xCurrent > 0 {
  16. coordStart.X, coordStart.Y = xCurrent, yCurrent
  17. coordEnd.X, coordEnd.Y = xEnd, yCurrent
  18. err = h.clearRect(attributes, coordStart, coordEnd)
  19. if err != nil {
  20. return err
  21. }
  22. xCurrent = 0
  23. yCurrent += 1
  24. }
  25. // Clear intervening rectangular section
  26. if yCurrent < yEnd {
  27. coordStart.X, coordStart.Y = xCurrent, yCurrent
  28. coordEnd.X, coordEnd.Y = xEnd, yEnd-1
  29. err = h.clearRect(attributes, coordStart, coordEnd)
  30. if err != nil {
  31. return err
  32. }
  33. xCurrent = 0
  34. yCurrent = yEnd
  35. }
  36. // Clear remaining partial ending line
  37. coordStart.X, coordStart.Y = xCurrent, yCurrent
  38. coordEnd.X, coordEnd.Y = xEnd, yEnd
  39. err = h.clearRect(attributes, coordStart, coordEnd)
  40. if err != nil {
  41. return err
  42. }
  43. return nil
  44. }
  45. func (h *windowsAnsiEventHandler) clearRect(attributes uint16, fromCoord COORD, toCoord COORD) error {
  46. region := SMALL_RECT{Top: fromCoord.Y, Left: fromCoord.X, Bottom: toCoord.Y, Right: toCoord.X}
  47. width := toCoord.X - fromCoord.X + 1
  48. height := toCoord.Y - fromCoord.Y + 1
  49. size := uint32(width) * uint32(height)
  50. if size <= 0 {
  51. return nil
  52. }
  53. buffer := make([]CHAR_INFO, size)
  54. char := CHAR_INFO{ansiterm.FILL_CHARACTER, attributes}
  55. for i := 0; i < int(size); i++ {
  56. buffer[i] = char
  57. }
  58. err := WriteConsoleOutput(h.fd, buffer, COORD{X: width, Y: height}, COORD{X: 0, Y: 0}, &region)
  59. if err != nil {
  60. return err
  61. }
  62. return nil
  63. }