mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-04 04:06:06 -05:00
term: scrolling: hopefully fix all selection/scrolling related crashes
When scrolling, there are a couple of cases where an existing selection must be canceled because we cannot meaningfully represent it after scrolling. These are when the selection is (partly) inside: * The top scrolling region * The bottom scrolling region * The new lines scrolled in. I.e. re-used lines For the scrolling regions, the real problem is when the selection crosses the scrolling region boundary; a selection that is completely inside a scrolling regions _might_ be possible to keep, but we would need to translate the selection coordinates to the new scrolling region lines. For simplicity, we cancel the selection if it touches the scrolling region. Period. The last item, newly scrolled in lines is when the selection covers very old lines and we're now wrapping around the scrollback history. Then there's a fourth problem case: when the user has started a selection, but hasn't yet moved the cursor. In this case, we have no end point. What's more problematic is that when the user (after scrolling) moves the cursor, we try to create a huge selection that covers mostly empty (NULL) rows, causing us to crash. This can happen e.g. when reverse scrolling in such a way that we wrap around the scrollback history. The actual viewport in this case is something like `-n - m`. But the selection we'll end up trying to create will be `m - (rows - n)`. This range may very well contain NULL rows. To deal with this, we simply cancel the selection.
This commit is contained in:
parent
5d643e63fe
commit
96a4f1b993
4 changed files with 89 additions and 17 deletions
|
|
@ -17,7 +17,7 @@ void selection_dirty_cells(struct terminal *term);
|
|||
void selection_cancel(struct terminal *term);
|
||||
void selection_extend(struct terminal *term, int col, int row, uint32_t serial);
|
||||
|
||||
bool selection_on_rows_in_view(const struct terminal *term, int start, int end);
|
||||
bool selection_on_rows(const struct terminal *term, int start, int end);
|
||||
|
||||
void selection_mark_word(struct terminal *term, int col, int row,
|
||||
bool spaces_only, uint32_t serial);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue