From: Yu Watanabe Date: Wed, 13 Mar 2024 04:23:15 +0000 (+0900) Subject: ptyfwd: do not erase line after NL X-Git-Tag: v256-rc1~485^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0d1606df0b4ea16cb77ff50391b047946f61a8ce;p=thirdparty%2Fsystemd.git ptyfwd: do not erase line after NL Otherwise, moving upwards in 'less' does not work. Follow-up for d0aa368c85adf2efa29c363a6671927fe7e8e76f. --- diff --git a/src/shared/ptyfwd.c b/src/shared/ptyfwd.c index a514428ef2c..38b89418cde 100644 --- a/src/shared/ptyfwd.c +++ b/src/shared/ptyfwd.c @@ -266,7 +266,7 @@ static int insert_string(PTYForward *f, size_t offset, const char *s) { return (int) l; } -static int insert_newline_color_erase(PTYForward *f, size_t offset) { +static int insert_background_color(PTYForward *f, size_t offset) { _cleanup_free_ char *s = NULL; assert(f); @@ -274,29 +274,6 @@ static int insert_newline_color_erase(PTYForward *f, size_t offset) { if (!f->background_color) return 0; - /* When we see a newline (ASCII 10) then this sets the background color to the desired one, and erase the rest - * of the line with it */ - - s = background_color_sequence(f); - if (!s) - return -ENOMEM; - - if (!strextend(&s, ANSI_ERASE_TO_END_OF_LINE)) - return -ENOMEM; - - return insert_string(f, offset, s); -} - -static int insert_carriage_return_color(PTYForward *f, size_t offset) { - _cleanup_free_ char *s = NULL; - - assert(f); - - if (!f->background_color) - return 0; - - /* When we see a carriage return (ASCII 13) then this sets only the background */ - s = background_color_sequence(f); if (!s) return -ENOMEM; @@ -430,27 +407,17 @@ static int pty_forward_ansi_process(PTYForward *f, size_t offset) { case ANSI_COLOR_STATE_TEXT: break; - case ANSI_COLOR_STATE_NEWLINE: { - /* Immediately after a newline insert an ANSI sequence to erase the line with a background color */ + case ANSI_COLOR_STATE_NEWLINE: + case ANSI_COLOR_STATE_CARRIAGE_RETURN: + /* Immediately after a newline (ASCII 10) or carriage return (ASCII 13) insert an + * ANSI sequence set the background color back. */ - r = insert_newline_color_erase(f, i); + r = insert_background_color(f, i); if (r < 0) return r; i += r; break; - } - - case ANSI_COLOR_STATE_CARRIAGE_RETURN: { - /* Immediately after a carriage return insert an ANSI sequence set the background color back */ - - r = insert_carriage_return_color(f, i); - if (r < 0) - return r; - - i += r; - break; - } case ANSI_COLOR_STATE_ESC: {