vt: tag cells that were form-feed:ed, to allow correct text reflow

To handle text reflow correctly when a line has a printable character
in the last column, but was still line breaked, we need to track the
fact that the slave inserted a line break here.

Otherwise, when the window width is increased, we'll end up pulling up
the next line, when we really should have inserted a line break.
This commit is contained in:
Daniel Eklöf 2020-02-10 21:52:14 +01:00
parent 3004c650ef
commit 4a169f5643
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
4 changed files with 17 additions and 4 deletions

View file

@ -1055,7 +1055,10 @@ reflow(struct terminal *term, struct row **new_grid, int new_cols, int new_rows,
* *entire* old line was empty.
*/
if (empty_count < old_cols && old_row->cells[old_cols - 1].wc == 0) {
if (empty_count < old_cols &&
(old_row->cells[old_cols - 1].wc == 0 ||
old_row->cells[old_cols - 1].attrs.linefeed))
{
new_col_idx = 0;
new_row_idx = (new_row_idx + 1) & (new_rows - 1);

View file

@ -1494,6 +1494,14 @@ term_scroll_reverse(struct terminal *term, int rows)
term_scroll_reverse_partial(term, term->scroll_region, rows);
}
void
term_formfeed(struct terminal *term)
{
if (term->cursor.point.col > 0)
term->grid->cur_row->cells[term->cursor.point.col - 1].attrs.linefeed = 1;
term_cursor_left(term, term->cursor.point.col);
}
void
term_linefeed(struct terminal *term)
{

View file

@ -42,7 +42,8 @@ struct attributes {
uint32_t have_fg:1;
uint32_t have_bg:1;
uint32_t selected:2;
uint32_t reserved:3;
uint32_t linefeed:1;
uint32_t reserved:2;
uint32_t bg:24;
};
static_assert(sizeof(struct attributes) == 8, "bad size");
@ -403,6 +404,7 @@ void term_scroll_partial(
void term_scroll_reverse_partial(
struct terminal *term, struct scroll_region region, int rows);
void term_formfeed(struct terminal *term);
void term_linefeed(struct terminal *term);
void term_reverse_index(struct terminal *term);

4
vt.c
View file

@ -128,7 +128,7 @@ action_execute(struct terminal *term, uint8_t c)
case '\r':
/* FF - form feed */
term_cursor_left(term, term->cursor.point.col);
term_formfeed(term);
break;
case '\b':
@ -361,8 +361,8 @@ action_esc_dispatch(struct terminal *term, uint8_t final)
break;
case 'E':
term_formfeed(term);
term_linefeed(term);
term_cursor_left(term, term->cursor.point.col);
break;
case 'H':