diff --git a/terminal.c b/terminal.c index 537df250..45392ec3 100644 --- a/terminal.c +++ b/terminal.c @@ -1735,6 +1735,12 @@ term_scroll_partial(struct terminal *term, struct scroll_region region, int rows } #endif + const int begin_scrolled_in = max(region.end - rows, region.start); + const int end_scrolled_in = region.end; + + if (selection_on_rows_in_view(term, begin_scrolled_in, end_scrolled_in - 1)) + selection_cancel(term); + bool view_follows = term->grid->view == term->grid->offset; term->grid->offset += rows; term->grid->offset &= term->grid->num_rows - 1; @@ -1750,15 +1756,10 @@ term_scroll_partial(struct terminal *term, struct scroll_region region, int rows for (int i = term->rows - 1; i >= region.end; i--) grid_swap_row(term->grid, i - rows, i, false); - const int begin_scrolled_in = max(region.end - rows, region.start); - /* Erase scrolled in lines */ - for (int r = begin_scrolled_in; r < region.end; r++) + for (int r = begin_scrolled_in; r < end_scrolled_in; r++) erase_line(term, grid_row_and_alloc(term->grid, r)); - if (selection_on_rows_in_view(term, begin_scrolled_in, region.end - 1)) - selection_cancel(term); - sixel_delete_in_range(term, max(region.end - rows, region.start), region.end - 1); term_damage_scroll(term, DAMAGE_SCROLL, region, rows); term->grid->cur_row = grid_row(term->grid, term->grid->cursor.point.row); @@ -1784,6 +1785,13 @@ term_scroll_reverse_partial(struct terminal *term, } #endif + /* Row numbers of "new" lines scrolled in */ + const int start_scrolled_in = region.start; + const int end_scrolled_in = min(region.start + rows, region.end); + + if (selection_on_rows_in_view(term, start_scrolled_in, end_scrolled_in - 1)) + selection_cancel(term); + bool view_follows = term->grid->view == term->grid->offset; term->grid->offset -= rows; while (term->grid->offset < 0) @@ -1804,15 +1812,10 @@ term_scroll_reverse_partial(struct terminal *term, for (int i = 0 + rows; i < region.start + rows; i++) grid_swap_row(term->grid, i, i - rows, false); - const int end_scrolled_in = min(region.start + rows, region.end); - /* Erase scrolled in lines */ - for (int r = region.start; r < end_scrolled_in; r++) + for (int r = start_scrolled_in; r < end_scrolled_in; r++) erase_line(term, grid_row_and_alloc(term->grid, r)); - if (selection_on_rows_in_view(term, region.start, end_scrolled_in - 1)) - selection_cancel(term); - sixel_delete_in_range(term, region.start, min(region.start + rows, region.end) - 1); term_damage_scroll(term, DAMAGE_SCROLL_REVERSE, region, rows); term->grid->cur_row = grid_row(term->grid, term->grid->cursor.point.row);