mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-04 04:06:06 -05:00
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:
parent
3004c650ef
commit
4a169f5643
4 changed files with 17 additions and 4 deletions
5
render.c
5
render.c
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
4
vt.c
|
|
@ -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':
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue