Skip to content

Commit 28ab4f4

Browse files
authored
fix(renderer): properly reset cursor position to start of line (#1472)
This change uses carriage return (`\r`) instead of moving the cursor backward by the terminal width at the end of rendering in inline mode. With this, we don't need to know the terminal width to reset the cursor position, which avoids issues when the renderer doesn't yet know the terminal width (e.g. the first render where the size message hasn't been sent to the renderer yet). Fixes: #1471
1 parent a81d6f3 commit 28ab4f4

File tree

3 files changed

+11
-11
lines changed

3 files changed

+11
-11
lines changed

examples/simple/testdata/TestApp.golden

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[?25l[?2004hHi. This program will exit in 10 seconds.
22

33
To quit sooner press ctrl-c, or press ctrl-z to suspend...
4-
Hi. This program will exit in 9 seconds.
4+
Hi. This program will exit in 9 seconds.
55

66

7-
[?2004l[?25h[?1002l[?1003l[?1006l
7+
[?2004l[?25h[?1002l[?1003l[?1006l

screen_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ func TestClearMsg(t *testing.T) {
1414
{
1515
name: "clear_screen",
1616
cmds: []Cmd{ClearScreen},
17-
expected: "\x1b[?25l\x1b[?2004h\x1b[2J\x1b[H\rsuccess\x1b[K\r\n\x1b[K\x1b[80D\x1b[2K\r\x1b[?2004l\x1b[?25h\x1b[?1002l\x1b[?1003l\x1b[?1006l",
17+
expected: "\x1b[?25l\x1b[?2004h\x1b[2J\x1b[H\rsuccess\x1b[K\r\n\x1b[K\r\x1b[2K\r\x1b[?2004l\x1b[?25h\x1b[?1002l\x1b[?1003l\x1b[?1006l",
1818
},
1919
{
2020
name: "altscreen",
2121
cmds: []Cmd{EnterAltScreen, ExitAltScreen},
22-
expected: "\x1b[?25l\x1b[?2004h\x1b[?1049h\x1b[2J\x1b[H\x1b[?25l\x1b[?1049l\x1b[?25l\rsuccess\x1b[K\r\n\x1b[K\x1b[80D\x1b[2K\r\x1b[?2004l\x1b[?25h\x1b[?1002l\x1b[?1003l\x1b[?1006l",
22+
expected: "\x1b[?25l\x1b[?2004h\x1b[?1049h\x1b[2J\x1b[H\x1b[?25l\x1b[?1049l\x1b[?25l\rsuccess\x1b[K\r\n\x1b[K\r\x1b[2K\r\x1b[?2004l\x1b[?25h\x1b[?1002l\x1b[?1003l\x1b[?1006l",
2323
},
2424
{
2525
name: "altscreen_autoexit",
@@ -29,32 +29,32 @@ func TestClearMsg(t *testing.T) {
2929
{
3030
name: "mouse_cellmotion",
3131
cmds: []Cmd{EnableMouseCellMotion},
32-
expected: "\x1b[?25l\x1b[?2004h\x1b[?1002h\x1b[?1006h\rsuccess\x1b[K\r\n\x1b[K\x1b[80D\x1b[2K\r\x1b[?2004l\x1b[?25h\x1b[?1002l\x1b[?1003l\x1b[?1006l",
32+
expected: "\x1b[?25l\x1b[?2004h\x1b[?1002h\x1b[?1006h\rsuccess\x1b[K\r\n\x1b[K\r\x1b[2K\r\x1b[?2004l\x1b[?25h\x1b[?1002l\x1b[?1003l\x1b[?1006l",
3333
},
3434
{
3535
name: "mouse_allmotion",
3636
cmds: []Cmd{EnableMouseAllMotion},
37-
expected: "\x1b[?25l\x1b[?2004h\x1b[?1003h\x1b[?1006h\rsuccess\x1b[K\r\n\x1b[K\x1b[80D\x1b[2K\r\x1b[?2004l\x1b[?25h\x1b[?1002l\x1b[?1003l\x1b[?1006l",
37+
expected: "\x1b[?25l\x1b[?2004h\x1b[?1003h\x1b[?1006h\rsuccess\x1b[K\r\n\x1b[K\r\x1b[2K\r\x1b[?2004l\x1b[?25h\x1b[?1002l\x1b[?1003l\x1b[?1006l",
3838
},
3939
{
4040
name: "mouse_disable",
4141
cmds: []Cmd{EnableMouseAllMotion, DisableMouse},
42-
expected: "\x1b[?25l\x1b[?2004h\x1b[?1003h\x1b[?1006h\x1b[?1002l\x1b[?1003l\x1b[?1006l\rsuccess\x1b[K\r\n\x1b[K\x1b[80D\x1b[2K\r\x1b[?2004l\x1b[?25h\x1b[?1002l\x1b[?1003l\x1b[?1006l",
42+
expected: "\x1b[?25l\x1b[?2004h\x1b[?1003h\x1b[?1006h\x1b[?1002l\x1b[?1003l\x1b[?1006l\rsuccess\x1b[K\r\n\x1b[K\r\x1b[2K\r\x1b[?2004l\x1b[?25h\x1b[?1002l\x1b[?1003l\x1b[?1006l",
4343
},
4444
{
4545
name: "cursor_hide",
4646
cmds: []Cmd{HideCursor},
47-
expected: "\x1b[?25l\x1b[?2004h\x1b[?25l\rsuccess\x1b[K\r\n\x1b[K\x1b[80D\x1b[2K\r\x1b[?2004l\x1b[?25h\x1b[?1002l\x1b[?1003l\x1b[?1006l",
47+
expected: "\x1b[?25l\x1b[?2004h\x1b[?25l\rsuccess\x1b[K\r\n\x1b[K\r\x1b[2K\r\x1b[?2004l\x1b[?25h\x1b[?1002l\x1b[?1003l\x1b[?1006l",
4848
},
4949
{
5050
name: "cursor_hideshow",
5151
cmds: []Cmd{HideCursor, ShowCursor},
52-
expected: "\x1b[?25l\x1b[?2004h\x1b[?25l\x1b[?25h\rsuccess\x1b[K\r\n\x1b[K\x1b[80D\x1b[2K\r\x1b[?2004l\x1b[?25h\x1b[?1002l\x1b[?1003l\x1b[?1006l",
52+
expected: "\x1b[?25l\x1b[?2004h\x1b[?25l\x1b[?25h\rsuccess\x1b[K\r\n\x1b[K\r\x1b[2K\r\x1b[?2004l\x1b[?25h\x1b[?1002l\x1b[?1003l\x1b[?1006l",
5353
},
5454
{
5555
name: "bp_stop_start",
5656
cmds: []Cmd{DisableBracketedPaste, EnableBracketedPaste},
57-
expected: "\x1b[?25l\x1b[?2004h\x1b[?2004l\x1b[?2004h\rsuccess\x1b[K\r\n\x1b[K\x1b[80D\x1b[2K\r\x1b[?2004l\x1b[?25h\x1b[?1002l\x1b[?1003l\x1b[?1006l",
57+
expected: "\x1b[?25l\x1b[?2004h\x1b[?2004l\x1b[?2004h\rsuccess\x1b[K\r\n\x1b[K\r\x1b[2K\r\x1b[?2004l\x1b[?25h\x1b[?1002l\x1b[?1003l\x1b[?1006l",
5858
},
5959
}
6060

standard_renderer.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ func (r *standardRenderer) flush() {
277277
// using the full terminal window.
278278
buf.WriteString(ansi.CursorPosition(0, len(newLines)))
279279
} else {
280-
buf.WriteString(ansi.CursorBackward(r.width))
280+
buf.WriteByte('\r')
281281
}
282282

283283
_, _ = r.out.Write(buf.Bytes())

0 commit comments

Comments
 (0)