mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-05 04:06:08 -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.
|
* *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_col_idx = 0;
|
||||||
new_row_idx = (new_row_idx + 1) & (new_rows - 1);
|
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);
|
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
|
void
|
||||||
term_linefeed(struct terminal *term)
|
term_linefeed(struct terminal *term)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,8 @@ struct attributes {
|
||||||
uint32_t have_fg:1;
|
uint32_t have_fg:1;
|
||||||
uint32_t have_bg:1;
|
uint32_t have_bg:1;
|
||||||
uint32_t selected:2;
|
uint32_t selected:2;
|
||||||
uint32_t reserved:3;
|
uint32_t linefeed:1;
|
||||||
|
uint32_t reserved:2;
|
||||||
uint32_t bg:24;
|
uint32_t bg:24;
|
||||||
};
|
};
|
||||||
static_assert(sizeof(struct attributes) == 8, "bad size");
|
static_assert(sizeof(struct attributes) == 8, "bad size");
|
||||||
|
|
@ -403,6 +404,7 @@ void term_scroll_partial(
|
||||||
void term_scroll_reverse_partial(
|
void term_scroll_reverse_partial(
|
||||||
struct terminal *term, struct scroll_region region, int rows);
|
struct terminal *term, struct scroll_region region, int rows);
|
||||||
|
|
||||||
|
void term_formfeed(struct terminal *term);
|
||||||
void term_linefeed(struct terminal *term);
|
void term_linefeed(struct terminal *term);
|
||||||
void term_reverse_index(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':
|
case '\r':
|
||||||
/* FF - form feed */
|
/* FF - form feed */
|
||||||
term_cursor_left(term, term->cursor.point.col);
|
term_formfeed(term);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '\b':
|
case '\b':
|
||||||
|
|
@ -361,8 +361,8 @@ action_esc_dispatch(struct terminal *term, uint8_t final)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'E':
|
case 'E':
|
||||||
|
term_formfeed(term);
|
||||||
term_linefeed(term);
|
term_linefeed(term);
|
||||||
term_cursor_left(term, term->cursor.point.col);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'H':
|
case 'H':
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue