mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-11 04:27:49 -05:00
selection/render: sync cells' 'selected' bit before rendering
For performance reasons, we track whether a cell is selected or not using a bit in a cell's attributes. This makes it easy for the renderer to determine if the cells should be rendered as selected or not - it just have to look at the 'selected' bit instead of doing a complex range check against the current selection. This works nicely in most cases. But, if the cell is updated, the 'selected' bit is cleared. This results in the renderer rendering the cell normally, i.e. _not_ selected. Checking for this, and re-setting the 'selected' bit when the cell is updated (printed to) is way too expensive as it is in the hot path. Instead, sync the 'selected' bits just before rendering. This isn't so bad as it may sound; if there is no selection this is a no-op. Even if there is a selection, only those cells whose 'selected' bit have been cleared are dirtied (and thus re-rendered) - these cells would have been re-rendered anyway.
This commit is contained in:
parent
a1c95562fb
commit
1a8ccb0ffa
4 changed files with 31 additions and 0 deletions
10
selection.c
10
selection.c
|
|
@ -403,6 +403,16 @@ selection_update(struct terminal *term, int col, int row)
|
|||
selection_modify(term, term->selection.start, new_end);
|
||||
}
|
||||
|
||||
void
|
||||
selection_dirty_cells(struct terminal *term)
|
||||
{
|
||||
if (term->selection.start.row == -1 || term->selection.end.row == -1)
|
||||
return;
|
||||
|
||||
foreach_selected(
|
||||
term, term->selection.start, term->selection.end, &mark_selected, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
selection_extend_normal(struct terminal *term, int col, int row, uint32_t serial)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue