mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-04-01 07:15:32 -04:00
search: find_next(): proper check for scrollback wrap around
Besides disallowing matches that crosses the scrollback wrap-around, this also fixes a crash when the trying to search beyond the last output, when the scrollback history hasn’t yet been completely filled.
This commit is contained in:
parent
f87a13bbd2
commit
e415f85829
2 changed files with 15 additions and 5 deletions
|
|
@ -153,6 +153,7 @@
|
||||||
* PTY not being drained when the client application terminates.
|
* PTY not being drained when the client application terminates.
|
||||||
* `auto_left_margin` not being limited to `cub1`
|
* `auto_left_margin` not being limited to `cub1`
|
||||||
(https://codeberg.org/dnkl/foot/issues/441).
|
(https://codeberg.org/dnkl/foot/issues/441).
|
||||||
|
* Crash in scrollback search mode when searching beyond the last output.
|
||||||
|
|
||||||
|
|
||||||
### Contributors
|
### Contributors
|
||||||
|
|
|
||||||
19
search.c
19
search.c
|
|
@ -77,6 +77,16 @@ search_ensure_size(struct terminal *term, size_t wanted_size)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
has_wrapped_around(const struct terminal *term, int abs_row_no)
|
||||||
|
{
|
||||||
|
int scrollback_start = term->grid->offset + term->rows;
|
||||||
|
int rebased_row = abs_row_no - scrollback_start + term->grid->num_rows;
|
||||||
|
rebased_row &= term->grid->num_rows - 1;
|
||||||
|
|
||||||
|
return rebased_row == 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
search_cancel_keep_selection(struct terminal *term)
|
search_cancel_keep_selection(struct terminal *term)
|
||||||
{
|
{
|
||||||
|
|
@ -327,13 +337,12 @@ search_find_next(struct terminal *term)
|
||||||
|
|
||||||
for (size_t i = 0; i < term->search.len;) {
|
for (size_t i = 0; i < term->search.len;) {
|
||||||
if (end_col >= term->cols) {
|
if (end_col >= term->cols) {
|
||||||
if (end_row + 1 > grid_row_absolute(term->grid, term->grid->offset + term->rows - 1)) {
|
|
||||||
/* Don't continue past end of the world */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
end_row++;
|
end_row++;
|
||||||
end_col = 0;
|
end_col = 0;
|
||||||
|
|
||||||
|
if (has_wrapped_around(term, end_row))
|
||||||
|
break;
|
||||||
|
|
||||||
row = term->grid->rows[end_row];
|
row = term->grid->rows[end_row];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue