Signed-off-by: Brendan Dixon <brendand@microsoft.com>
| ... | ... |
@@ -410,25 +410,25 @@ func getNumberOfChars(fromCoord COORD, toCoord COORD, screenSize COORD) uint32 {
|
| 410 | 410 |
|
| 411 | 411 |
var buffer []CHAR_INFO |
| 412 | 412 |
|
| 413 |
-func clearDisplayRect(handle uintptr, fillChar rune, attributes WORD, fromCoord COORD, toCoord COORD, windowSize COORD) (uint32, error) {
|
|
| 413 |
+func clearDisplayRect(handle uintptr, attributes WORD, fromCoord COORD, toCoord COORD) (uint32, error) {
|
|
| 414 | 414 |
var writeRegion SMALL_RECT |
| 415 |
- writeRegion.Top = fromCoord.Y |
|
| 416 | 415 |
writeRegion.Left = fromCoord.X |
| 416 |
+ writeRegion.Top = fromCoord.Y |
|
| 417 | 417 |
writeRegion.Right = toCoord.X |
| 418 | 418 |
writeRegion.Bottom = toCoord.Y |
| 419 | 419 |
|
| 420 | 420 |
// allocate and initialize buffer |
| 421 | 421 |
width := toCoord.X - fromCoord.X + 1 |
| 422 | 422 |
height := toCoord.Y - fromCoord.Y + 1 |
| 423 |
- size := width * height |
|
| 423 |
+ size := uint32(width) * uint32(height) |
|
| 424 | 424 |
if size > 0 {
|
| 425 |
- for i := 0; i < int(size); i++ {
|
|
| 426 |
- buffer[i].UnicodeChar = WCHAR(fillChar) |
|
| 427 |
- buffer[i].Attributes = attributes |
|
| 425 |
+ buffer := make([]CHAR_INFO, size) |
|
| 426 |
+ for i := range buffer {
|
|
| 427 |
+ buffer[i] = CHAR_INFO{WCHAR(' '), attributes}
|
|
| 428 | 428 |
} |
| 429 | 429 |
|
| 430 | 430 |
// Write to buffer |
| 431 |
- r, err := writeConsoleOutput(handle, buffer[:size], windowSize, COORD{X: 0, Y: 0}, &writeRegion)
|
|
| 431 |
+ r, err := writeConsoleOutput(handle, buffer, COORD{X: width, Y: height}, COORD{X: 0, Y: 0}, &writeRegion)
|
|
| 432 | 432 |
if !r {
|
| 433 | 433 |
if err != nil {
|
| 434 | 434 |
return 0, err |
| ... | ... |
@@ -439,18 +439,18 @@ func clearDisplayRect(handle uintptr, fillChar rune, attributes WORD, fromCoord |
| 439 | 439 |
return uint32(size), nil |
| 440 | 440 |
} |
| 441 | 441 |
|
| 442 |
-func clearDisplayRange(handle uintptr, fillChar rune, attributes WORD, fromCoord COORD, toCoord COORD, windowSize COORD) (uint32, error) {
|
|
| 442 |
+func clearDisplayRange(handle uintptr, attributes WORD, fromCoord COORD, toCoord COORD) (uint32, error) {
|
|
| 443 | 443 |
nw := uint32(0) |
| 444 | 444 |
// start and end on same line |
| 445 | 445 |
if fromCoord.Y == toCoord.Y {
|
| 446 |
- return clearDisplayRect(handle, fillChar, attributes, fromCoord, toCoord, windowSize) |
|
| 446 |
+ return clearDisplayRect(handle, attributes, fromCoord, toCoord) |
|
| 447 | 447 |
} |
| 448 | 448 |
// TODO(azlinux): if full screen, optimize |
| 449 | 449 |
|
| 450 | 450 |
// spans more than one line |
| 451 | 451 |
if fromCoord.Y < toCoord.Y {
|
| 452 | 452 |
// from start position till end of line for first line |
| 453 |
- n, err := clearDisplayRect(handle, fillChar, attributes, fromCoord, COORD{X: windowSize.X - 1, Y: fromCoord.Y}, windowSize)
|
|
| 453 |
+ n, err := clearDisplayRect(handle, attributes, fromCoord, COORD{X: toCoord.X, Y: fromCoord.Y})
|
|
| 454 | 454 |
if err != nil {
|
| 455 | 455 |
return nw, err |
| 456 | 456 |
} |
| ... | ... |
@@ -458,14 +458,14 @@ func clearDisplayRange(handle uintptr, fillChar rune, attributes WORD, fromCoord |
| 458 | 458 |
// lines between |
| 459 | 459 |
linesBetween := toCoord.Y - fromCoord.Y - 1 |
| 460 | 460 |
if linesBetween > 0 {
|
| 461 |
- n, err = clearDisplayRect(handle, fillChar, attributes, COORD{X: 0, Y: fromCoord.Y + 1}, COORD{X: windowSize.X - 1, Y: toCoord.Y - 1}, windowSize)
|
|
| 461 |
+ n, err = clearDisplayRect(handle, attributes, COORD{X: 0, Y: fromCoord.Y + 1}, COORD{X: toCoord.X, Y: toCoord.Y - 1})
|
|
| 462 | 462 |
if err != nil {
|
| 463 | 463 |
return nw, err |
| 464 | 464 |
} |
| 465 | 465 |
nw += n |
| 466 | 466 |
} |
| 467 | 467 |
// lines at end |
| 468 |
- n, err = clearDisplayRect(handle, fillChar, attributes, COORD{X: 0, Y: toCoord.Y}, toCoord, windowSize)
|
|
| 468 |
+ n, err = clearDisplayRect(handle, attributes, COORD{X: 0, Y: toCoord.Y}, toCoord)
|
|
| 469 | 469 |
if err != nil {
|
| 470 | 470 |
return nw, err |
| 471 | 471 |
} |
| ... | ... |
@@ -715,9 +715,9 @@ func (term *WindowsTerminal) HandleOutputCommand(handle uintptr, command []byte) |
| 715 | 715 |
switch value {
|
| 716 | 716 |
case 0: |
| 717 | 717 |
start = screenBufferInfo.CursorPosition |
| 718 |
- // end of the screen |
|
| 719 |
- end.X = screenBufferInfo.MaximumWindowSize.X - 1 |
|
| 720 |
- end.Y = screenBufferInfo.MaximumWindowSize.Y - 1 |
|
| 718 |
+ // end of the buffer |
|
| 719 |
+ end.X = screenBufferInfo.Size.X - 1 |
|
| 720 |
+ end.Y = screenBufferInfo.Size.Y - 1 |
|
| 721 | 721 |
// cursor |
| 722 | 722 |
cursor = screenBufferInfo.CursorPosition |
| 723 | 723 |
case 1: |
| ... | ... |
@@ -733,20 +733,21 @@ func (term *WindowsTerminal) HandleOutputCommand(handle uintptr, command []byte) |
| 733 | 733 |
// start of the screen |
| 734 | 734 |
start.X = 0 |
| 735 | 735 |
start.Y = 0 |
| 736 |
- // end of the screen |
|
| 737 |
- end.X = screenBufferInfo.MaximumWindowSize.X - 1 |
|
| 738 |
- end.Y = screenBufferInfo.MaximumWindowSize.Y - 1 |
|
| 736 |
+ // end of the buffer |
|
| 737 |
+ end.X = screenBufferInfo.Size.X - 1 |
|
| 738 |
+ end.Y = screenBufferInfo.Size.Y - 1 |
|
| 739 | 739 |
// cursor |
| 740 | 740 |
cursor.X = 0 |
| 741 | 741 |
cursor.Y = 0 |
| 742 | 742 |
} |
| 743 |
- if _, err := clearDisplayRange(uintptr(handle), ' ', term.screenBufferInfo.Attributes, start, end, screenBufferInfo.MaximumWindowSize); err != nil {
|
|
| 743 |
+ if _, err := clearDisplayRange(uintptr(handle), term.screenBufferInfo.Attributes, start, end); err != nil {
|
|
| 744 | 744 |
return n, err |
| 745 | 745 |
} |
| 746 | 746 |
// remember the the cursor position is 1 based |
| 747 | 747 |
if err := setConsoleCursorPosition(handle, false, int16(cursor.X), int16(cursor.Y)); err != nil {
|
| 748 | 748 |
return n, err |
| 749 | 749 |
} |
| 750 |
+ |
|
| 750 | 751 |
case "K": |
| 751 | 752 |
// [K |
| 752 | 753 |
// Clears all characters from the cursor position to the end of the line (including the character at the cursor position). |
| ... | ... |
@@ -766,7 +767,7 @@ func (term *WindowsTerminal) HandleOutputCommand(handle uintptr, command []byte) |
| 766 | 766 |
// start is where cursor is |
| 767 | 767 |
start = screenBufferInfo.CursorPosition |
| 768 | 768 |
// end of line |
| 769 |
- end.X = screenBufferInfo.MaximumWindowSize.X - 1 |
|
| 769 |
+ end.X = screenBufferInfo.Size.X - 1 |
|
| 770 | 770 |
end.Y = screenBufferInfo.CursorPosition.Y |
| 771 | 771 |
// cursor remains the same |
| 772 | 772 |
cursor = screenBufferInfo.CursorPosition |
| ... | ... |
@@ -782,15 +783,15 @@ func (term *WindowsTerminal) HandleOutputCommand(handle uintptr, command []byte) |
| 782 | 782 |
case 2: |
| 783 | 783 |
// start of the line |
| 784 | 784 |
start.X = 0 |
| 785 |
- start.Y = screenBufferInfo.MaximumWindowSize.Y - 1 |
|
| 785 |
+ start.Y = screenBufferInfo.CursorPosition.Y - 1 |
|
| 786 | 786 |
// end of the line |
| 787 |
- end.X = screenBufferInfo.MaximumWindowSize.X - 1 |
|
| 788 |
- end.Y = screenBufferInfo.MaximumWindowSize.Y - 1 |
|
| 787 |
+ end.X = screenBufferInfo.Size.X - 1 |
|
| 788 |
+ end.Y = screenBufferInfo.CursorPosition.Y - 1 |
|
| 789 | 789 |
// cursor |
| 790 | 790 |
cursor.X = 0 |
| 791 |
- cursor.Y = screenBufferInfo.MaximumWindowSize.Y - 1 |
|
| 791 |
+ cursor.Y = screenBufferInfo.CursorPosition.Y - 1 |
|
| 792 | 792 |
} |
| 793 |
- if _, err := clearDisplayRange(uintptr(handle), ' ', term.screenBufferInfo.Attributes, start, end, screenBufferInfo.MaximumWindowSize); err != nil {
|
|
| 793 |
+ if _, err := clearDisplayRange(uintptr(handle), term.screenBufferInfo.Attributes, start, end); err != nil {
|
|
| 794 | 794 |
return n, err |
| 795 | 795 |
} |
| 796 | 796 |
// remember the the cursor position is 1 based |