mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-11 04:27:49 -05:00
scrollback: regression: fix rendering of scrollback diffs less than a screen
When doing "small" scrolls (typically done via mouse wheel or
similar), we render the scrolling by emitting a "scroll damage".
A recent commit changed how scroll damage is rendered; only when the
view is at the bottom ("following" the screen output) do we render the
damage.
To fix this, add a new type of scroll damage,
SCROLL_DAMAGE_IN_VIEW and SCROLL_DAMAGE_REVERSE_IN_VIEW.
These signal to the renderer that it should always render the damage.
This commit is contained in:
parent
89cec15920
commit
a42df2434b
3 changed files with 23 additions and 14 deletions
|
|
@ -72,7 +72,7 @@ cmd_scrollback_up(struct terminal *term, int rows)
|
|||
term->grid->view = new_view;
|
||||
|
||||
if (diff >= 0 && diff < term->rows) {
|
||||
term_damage_scroll(term, DAMAGE_SCROLL_REVERSE, (struct scroll_region){0, term->rows}, diff);
|
||||
term_damage_scroll(term, DAMAGE_SCROLL_REVERSE_IN_VIEW, (struct scroll_region){0, term->rows}, diff);
|
||||
term_damage_rows_in_view(term, 0, diff - 1);
|
||||
} else
|
||||
term_damage_view(term);
|
||||
|
|
@ -142,7 +142,7 @@ cmd_scrollback_down(struct terminal *term, int rows)
|
|||
term->grid->view = new_view;
|
||||
|
||||
if (diff >= 0 && diff < term->rows) {
|
||||
term_damage_scroll(term, DAMAGE_SCROLL, (struct scroll_region){0, term->rows}, diff);
|
||||
term_damage_scroll(term, DAMAGE_SCROLL_IN_VIEW, (struct scroll_region){0, term->rows}, diff);
|
||||
term_damage_rows_in_view(term, term->rows - diff, term->rows - 1);
|
||||
} else
|
||||
term_damage_view(term);
|
||||
|
|
|
|||
29
render.c
29
render.c
|
|
@ -530,22 +530,29 @@ grid_render(struct terminal *term)
|
|||
}
|
||||
}
|
||||
|
||||
if (term->grid->view == term->grid->offset) {
|
||||
tll_foreach(term->grid->scroll_damage, it) {
|
||||
switch (it->item.type) {
|
||||
case DAMAGE_SCROLL:
|
||||
tll_foreach(term->grid->scroll_damage, it) {
|
||||
switch (it->item.type) {
|
||||
case DAMAGE_SCROLL:
|
||||
if (term->grid->view == term->grid->offset)
|
||||
grid_render_scroll(term, buf, &it->item);
|
||||
break;
|
||||
break;
|
||||
|
||||
case DAMAGE_SCROLL_REVERSE:
|
||||
case DAMAGE_SCROLL_REVERSE:
|
||||
if (term->grid->view == term->grid->offset)
|
||||
grid_render_scroll_reverse(term, buf, &it->item);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
tll_remove(term->grid->scroll_damage, it);
|
||||
case DAMAGE_SCROLL_IN_VIEW:
|
||||
grid_render_scroll(term, buf, &it->item);
|
||||
break;
|
||||
|
||||
case DAMAGE_SCROLL_REVERSE_IN_VIEW:
|
||||
grid_render_scroll_reverse(term, buf, &it->item);
|
||||
break;
|
||||
}
|
||||
} else
|
||||
tll_free(term->grid->scroll_damage);
|
||||
|
||||
tll_remove(term->grid->scroll_damage, it);
|
||||
}
|
||||
|
||||
if (term->render.workers.count > 0) {
|
||||
|
||||
|
|
|
|||
|
|
@ -129,7 +129,9 @@ struct coord {
|
|||
int row;
|
||||
};
|
||||
|
||||
enum damage_type {DAMAGE_SCROLL, DAMAGE_SCROLL_REVERSE};
|
||||
enum damage_type {DAMAGE_SCROLL, DAMAGE_SCROLL_REVERSE,
|
||||
DAMAGE_SCROLL_IN_VIEW, DAMAGE_SCROLL_REVERSE_IN_VIEW};
|
||||
|
||||
struct damage {
|
||||
enum damage_type type;
|
||||
/* DAMAGE_SCROLL, DAMAGE_SCROLL_REVERSE */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue