mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-03-16 05:34:00 -04:00
multi-cursor: refactor: add function for dirtying/damaging all multi-cursors
This commit is contained in:
parent
4f89c461b1
commit
265c93c4c4
3 changed files with 32 additions and 47 deletions
55
render.c
55
render.c
|
|
@ -3417,28 +3417,6 @@ dirty_cursor(struct terminal *term)
|
||||||
struct cell *cell = &row->cells[cursor->col];
|
struct cell *cell = &row->cells[cursor->col];
|
||||||
cell->attrs.clean = 0;
|
cell->attrs.clean = 0;
|
||||||
row->dirty = true;
|
row->dirty = true;
|
||||||
|
|
||||||
|
|
||||||
/* TODO: move to separate function */
|
|
||||||
if (likely(term->multi_cursor.shapes == NULL))
|
|
||||||
return;
|
|
||||||
|
|
||||||
int rect_count = 0;
|
|
||||||
const pixman_box32_t *boxes = pixman_region32_rectangles(&term->multi_cursor.active, &rect_count);
|
|
||||||
|
|
||||||
for (int i = 0; i < rect_count; i++) {
|
|
||||||
const pixman_box32_t *box = &boxes[i];
|
|
||||||
|
|
||||||
for (int r = box->y1; r < box->y2; r++) {
|
|
||||||
struct row *row = grid_row(term->grid, r);
|
|
||||||
xassert(row != NULL);
|
|
||||||
|
|
||||||
row->dirty = true;
|
|
||||||
|
|
||||||
for (int c = box->x1; c < box->x2; c++)
|
|
||||||
row->cells[c].attrs.clean = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
@ -3464,6 +3442,7 @@ grid_render(struct terminal *term)
|
||||||
/* Dirty old and current cursor cell, to ensure they're repainted */
|
/* Dirty old and current cursor cell, to ensure they're repainted */
|
||||||
dirty_old_cursor(term);
|
dirty_old_cursor(term);
|
||||||
dirty_cursor(term);
|
dirty_cursor(term);
|
||||||
|
term_damage_all_multi_cursors(term);
|
||||||
|
|
||||||
if (term->render.last_buf == NULL ||
|
if (term->render.last_buf == NULL ||
|
||||||
term->render.last_buf->width != buf->width ||
|
term->render.last_buf->width != buf->width ||
|
||||||
|
|
@ -3703,31 +3682,13 @@ grid_render(struct terminal *term)
|
||||||
|
|
||||||
pixman_region32_fini(&damage);
|
pixman_region32_fini(&damage);
|
||||||
|
|
||||||
if (unlikely(term->multi_cursor.shapes != NULL)) {
|
/*
|
||||||
/*
|
* WIP: dirty all multi-cursors again, to ensure they're
|
||||||
* WIP: dirty all multi-cursors again, to ensure they're
|
* re-rendered the next frame. This is needed to properly _erase_
|
||||||
* re-rendered the next frame. This is needed to properly
|
* multi-cursors that have been scrolled (the cursors don't scroll
|
||||||
* _erase_ multi-cursors that have been scrolled (the cursors
|
* with the content, but stay fixed)
|
||||||
* don't scroll with the content, but stay fixed)
|
*/
|
||||||
*/
|
term_damage_all_multi_cursors(term);
|
||||||
|
|
||||||
int rect_count = 0;
|
|
||||||
const pixman_box32_t *boxes = pixman_region32_rectangles(&term->multi_cursor.active, &rect_count);
|
|
||||||
|
|
||||||
for (int i = 0; i < rect_count; i++) {
|
|
||||||
const pixman_box32_t *box = &boxes[i];
|
|
||||||
|
|
||||||
for (int r = box->y1; r < box->y2; r++) {
|
|
||||||
struct row *row = grid_row(term->grid, r);
|
|
||||||
xassert(row != NULL);
|
|
||||||
|
|
||||||
row->dirty = true;
|
|
||||||
|
|
||||||
for (int c = box->x1; c < box->x2; c++)
|
|
||||||
row->cells[c].attrs.clean = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
render_overlay(term);
|
render_overlay(term);
|
||||||
render_ime_preedit(term, buf);
|
render_ime_preedit(term, buf);
|
||||||
|
|
|
||||||
23
terminal.c
23
terminal.c
|
|
@ -2567,6 +2567,29 @@ term_damage_cursor(struct terminal *term)
|
||||||
term->grid->cur_row->dirty = true;
|
term->grid->cur_row->dirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
term_damage_all_multi_cursors(struct terminal *term)
|
||||||
|
{
|
||||||
|
if (likely(term->multi_cursor.shapes == NULL))
|
||||||
|
return;
|
||||||
|
|
||||||
|
int rect_count = 0;
|
||||||
|
const pixman_box32_t *boxes =
|
||||||
|
pixman_region32_rectangles(&term->multi_cursor.active, &rect_count);
|
||||||
|
|
||||||
|
for (const pixman_box32_t *box = boxes; box < &boxes[rect_count]; box++) {
|
||||||
|
for (int r = box->y1; r < box->y2; r++) {
|
||||||
|
struct row *row = grid_row(term->grid, r);
|
||||||
|
xassert(row != NULL);
|
||||||
|
|
||||||
|
row->dirty = true;
|
||||||
|
|
||||||
|
for (struct cell *c = &row->cells[box->x1]; c < &row->cells[box->x2]; c++)
|
||||||
|
c->attrs.clean = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
term_damage_margins(struct terminal *term)
|
term_damage_margins(struct terminal *term)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1021,6 +1021,7 @@ void term_theme_switch_to_2(struct terminal *term);
|
||||||
void term_theme_toggle(struct terminal *term);
|
void term_theme_toggle(struct terminal *term);
|
||||||
|
|
||||||
void term_remove_all_multi_cursors(struct terminal *term);
|
void term_remove_all_multi_cursors(struct terminal *term);
|
||||||
|
void term_damage_all_multi_cursors(struct terminal *term);
|
||||||
|
|
||||||
static inline void term_reset_grapheme_state(struct terminal *term)
|
static inline void term_reset_grapheme_state(struct terminal *term)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue