selection: update: don't dirty cells that don't change state

Previously when updating a selection, we would unmark *all* cells in
the old selection, and then mark all cells in the new selection.

This caused *all* cells to be dirtied and thus re-rendered.

Avoid this, by adding a temporary state to the cells' selected state.

Before unmarking the old selection, pre-mark the new selection using a
temporary state.

When unmarking the old selection, ignore cells in this temporary state.
When marking the new selection, ignore cells in this temporary
state (except clearing the temporary state).
This commit is contained in:
Daniel Eklöf 2020-01-06 11:56:18 +01:00
parent 6833abf33c
commit 457eb573c4
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
3 changed files with 51 additions and 22 deletions

View file

@ -385,7 +385,7 @@ render_cell(struct terminal *term, pixman_image_t *pix,
int x = term->x_margin + col * width;
int y = term->y_margin + row * height;
//bool is_selected = coord_is_selected(term, col, row);
assert(cell->attrs.selected == 0 || cell->attrs.selected == 1);
bool is_selected = cell->attrs.selected;
uint32_t _fg = 0;