grid: enable rows to have ‘extra’ data associated with them

This patch adds an ‘extra’ member to the row struct. It is a pointer
to a struct containing extra data to be associated with this row.

Initially, this struct contains a list of URL ranges. These
define (OSC-8) URLs on this row.

The ‘extra’ data is allocated on-demand. I.e. the pointer is NULL by
default; it is *not* allocated by grid_row_alloc().
This commit is contained in:
Daniel Eklöf 2021-02-13 12:31:55 +01:00
parent 3339915d20
commit fd87bca102
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
3 changed files with 44 additions and 4 deletions

View file

@ -2154,8 +2154,18 @@ 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 = region.end - rows; r < region.end; r++)
erase_line(term, grid_row_and_alloc(term->grid, r));
for (int r = region.end - rows; r < region.end; r++) {
struct row *row = grid_row_and_alloc(term->grid, r);
if (unlikely(row->extra != NULL)) {
tll_foreach(row->extra->uri_ranges, it) {
free(it->item.uri);
tll_remove(row->extra->uri_ranges, it);
}
free(row->extra);
row->extra = NULL;
}
erase_line(term, row);
}
term_damage_scroll(term, DAMAGE_SCROLL, region, rows);
term->grid->cur_row = grid_row(term->grid, term->grid->cursor.point.row);
@ -2222,8 +2232,18 @@ 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 < region.start + rows; r++)
erase_line(term, grid_row_and_alloc(term->grid, r));
for (int r = region.start; r < region.start + rows; r++) {
struct row *row = grid_row_and_alloc(term->grid, r);
if (unlikely(row->extra != NULL)) {
tll_foreach(row->extra->uri_ranges, it) {
free(it->item.uri);
tll_remove(row->extra->uri_ranges, it);
}
free(row->extra);
row->extra = NULL;
}
erase_line(term, row);
}
term_damage_scroll(term, DAMAGE_SCROLL_REVERSE, region, rows);
term->grid->cur_row = grid_row(term->grid, term->grid->cursor.point.row);