mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-03-11 05:33:55 -04:00
resize: don’t reflow text on alt screen
Alt screen applications normally reflow/readjust themselves on a window resize. When we do it too, the result is graphical glitches/flashes since our re-flowed text is rendered in one frame, and the application re-flowed text soon thereafter. We can’t avoid rendering some kind of re-flowed frame, since we don’t know when, or even if, the application will update itself. To avoid glitches, we need to render, as closely as possible, what the application itself will render shortly. This is actually pretty simple; we just need to copy the visible content over from the old grid to the new grid. We don’t bother with text re-flow, but simply truncate long lines. To simplify things, we simply cancel any active selection (since often times, it will be corrupted anyway when the application redraws itself). Since we’re not reflowing text, there’s no need to translate e.g. the cursor position - we just keep the current position (but bounded to the new dimensions). Fun thing: ‘less’ gets corrupted if we don’t leave the cursor at the (new) bottom row. To handle this, we check if the cursor (before resize) is at the bottom row, and if so, we move it to the new bottom row. Closes #221
This commit is contained in:
parent
c2f043f906
commit
9a498038d6
4 changed files with 140 additions and 20 deletions
17
render.c
17
render.c
|
|
@ -2276,23 +2276,22 @@ maybe_resize(struct terminal *term, int width, int height, bool force)
|
|||
goto damage_view;
|
||||
}
|
||||
|
||||
if (term->grid == &term->alt)
|
||||
selection_cancel(term);
|
||||
|
||||
struct coord *const tracking_points[] = {
|
||||
&term->selection.start,
|
||||
&term->selection.end,
|
||||
};
|
||||
|
||||
/* Reflow grids */
|
||||
grid_reflow(
|
||||
/* Resize grids */
|
||||
grid_resize_and_reflow(
|
||||
&term->normal, new_normal_grid_rows, new_cols, old_rows, new_rows,
|
||||
term->grid == &term->normal ? ALEN(tracking_points) : 0,
|
||||
term->grid == &term->normal ? tracking_points : NULL,
|
||||
ALEN(tracking_points), tracking_points,
|
||||
term->composed_count, term->composed);
|
||||
|
||||
grid_reflow(
|
||||
&term->alt, new_alt_grid_rows, new_cols, old_rows, new_rows,
|
||||
term->grid == &term->alt ? ALEN(tracking_points) : 0,
|
||||
term->grid == &term->alt ? tracking_points : NULL,
|
||||
term->composed_count, term->composed);
|
||||
grid_resize_without_reflow(
|
||||
&term->alt, new_alt_grid_rows, new_cols, old_rows, new_rows);
|
||||
|
||||
/* Reset tab stops */
|
||||
tll_free(term->tab_stops);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue