csi: erase scrollback: cancel selection if it touches the scrollback

This breaks out the scrollback erasing logic for \E[3J from csi.c, and
moves it to the new function term_erase_scrollback(), and changes the
logic to calculate the start and end row (absolute) numbers of the
scrollback, and only iterate those, instead of iterating *all* rows,
filtering out those that are on-screen.

It also adds an intersection range check of the selection range, and
cancels the selection if it touches any of the deleted scrollback
rows.

This fixes a crash when trying to render the next frame, since the
selection now references rows that have been freed.

Closes #633
This commit is contained in:
Daniel Eklöf 2021-07-16 16:45:36 +02:00
parent 34de799f90
commit 5f0ceb72f1
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
4 changed files with 66 additions and 23 deletions

View file

@ -69,10 +69,8 @@ selection_on_rows(const struct terminal *term, int row_start, int row_end)
end = tmp;
}
if (row_start >= start->row && row_end <= end->row) {
LOG_INFO("ON ROWS");
if (row_start >= start->row && row_end <= end->row)
return true;
}
return false;
}