From a42df2434b796f19ff729e194dd6a22f5128b89a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Tue, 29 Oct 2019 21:09:37 +0100 Subject: [PATCH] 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. --- commands.c | 4 ++-- render.c | 29 ++++++++++++++++++----------- terminal.h | 4 +++- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/commands.c b/commands.c index 01e73981..5d20b94b 100644 --- a/commands.c +++ b/commands.c @@ -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); diff --git a/render.c b/render.c index de5c2246..ca127389 100644 --- a/render.c +++ b/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) { diff --git a/terminal.h b/terminal.h index 6f6e1d53..2a014d90 100644 --- a/terminal.h +++ b/terminal.h @@ -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 */