dm: video: correctly set the cursor position

The terminal escape sequence ESC [ <x> ; <y> H is used to set the cursor
position. According to the ECMA 48 standard the upper left corner in the
escape sequences is [1, 1]. The video uclass uses [0, 0] as upper left
corner.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Heinrich Schuchardt 2018-11-10 19:55:48 +01:00 committed by Anatolij Gustschin
parent 1d6edcbfed
commit 118f020d9a
2 changed files with 10 additions and 2 deletions

View File

@ -272,6 +272,14 @@ static void vidconsole_escape_char(struct udevice *dev, char ch)
s++; /* ; */
s = parsenum(s, &col);
/*
* Video origin is [0, 0], terminal origin is [1, 1].
*/
if (row)
--row;
if (col)
--col;
set_cursor_position(priv, row, col);
break;

View File

@ -178,12 +178,12 @@ static int dm_test_video_ansi(struct unit_test_state *uts)
/* test set-cursor: [%d;%df */
vidconsole_put_string(con, "abc"ANSI_ESC"[2;2fab"ANSI_ESC"[4;4fcd");
ut_asserteq(142, compress_frame_buffer(dev));
ut_asserteq(143, compress_frame_buffer(dev));
/* test colors (30-37 fg color, 40-47 bg color) */
vidconsole_put_string(con, ANSI_ESC"[30;41mfoo"); /* black on red */
vidconsole_put_string(con, ANSI_ESC"[33;44mbar"); /* yellow on blue */
ut_asserteq(265, compress_frame_buffer(dev));
ut_asserteq(272, compress_frame_buffer(dev));
return 0;
}