term: cancel selection when scrolling wraps

If we scroll enough, we'll eventually end up wrapping around the
entire scrollback buffer. At this point, a selection is no longer
valid, so cancel it.

Note: this was very obvious when scrolling in the alt screen, since
its scrollback buffer is what you see on the screen (i.e. it has no
scrollback).
This commit is contained in:
Daniel Eklöf 2019-08-05 20:16:17 +02:00
parent 1e08d93528
commit c06f141189
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
3 changed files with 23 additions and 2 deletions

View file

@ -282,8 +282,11 @@ term_scroll_partial(struct terminal *term, struct scroll_region region, int rows
grid_swap_row(term->grid, i - rows, i);
/* Erase scrolled in lines */
for (int r = max(region.end - rows, 0); r < region.end; r++)
for (int r = max(region.end - rows, 0); r < region.end; r++) {
erase_line(term, grid_row(term->grid, r));
if (selection_on_row_in_view(term, r))
selection_cancel(term);
}
term_damage_scroll(term, DAMAGE_SCROLL, region, rows);
term->grid->cur_row = grid_row(term->grid, term->cursor.row);
@ -325,8 +328,11 @@ term_scroll_reverse_partial(struct terminal *term,
grid_swap_row(term->grid, i, i - rows);
/* Erase scrolled in lines */
for (int r = region.start; r < min(region.start + rows, region.end); r++)
for (int r = region.start; r < min(region.start + rows, region.end); r++) {
erase_line(term, grid_row(term->grid, r));
if (selection_on_row_in_view(term, r))
selection_cancel(term);
}
term_damage_scroll(term, DAMAGE_SCROLL_REVERSE, region, rows);
term->grid->cur_row = grid_row(term->grid, term->cursor.row);