From 118f020d9a6d84b52cd533cfe5b02feae7e5bdde Mon Sep 17 00:00:00 2001 From: Heinrich Schuchardt Date: Sat, 10 Nov 2018 19:55:48 +0100 Subject: [PATCH] dm: video: correctly set the cursor position The terminal escape sequence ESC [ ; 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 Reviewed-by: Simon Glass --- drivers/video/vidconsole-uclass.c | 8 ++++++++ test/dm/video.c | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/drivers/video/vidconsole-uclass.c b/drivers/video/vidconsole-uclass.c index 1874887f2f..db40a1396b 100644 --- a/drivers/video/vidconsole-uclass.c +++ b/drivers/video/vidconsole-uclass.c @@ -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; diff --git a/test/dm/video.c b/test/dm/video.c index 7def338058..5d1faac19c 100644 --- a/test/dm/video.c +++ b/test/dm/video.c @@ -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; } -- 2.39.5