diff --git a/sixel.c b/sixel.c index 7d31dea4..db87844e 100644 --- a/sixel.c +++ b/sixel.c @@ -39,6 +39,8 @@ sixel_init(struct terminal *term) count = 0; + sixel_purge_at_cursor(term); + /* TODO: default palette */ } @@ -52,6 +54,22 @@ sixel_destroy(struct sixel *sixel) sixel->data = NULL; } +void +sixel_purge_at_cursor(struct terminal *term) +{ + const int row = term->grid->offset + term->cursor.point.row; + + tll_foreach(term->sixel_images, it) { + const int start = it->item.pos.row; + const int end = start + it->item.rows; + + if (row >= start && row < end) { + sixel_destroy(&it->item); + tll_remove(term->sixel_images, it); + } + } +} + void sixel_unhook(struct terminal *term) { @@ -74,13 +92,6 @@ sixel_unhook(struct terminal *term) term->sixel.image.data, term->sixel.image.width * sizeof(uint32_t)); - tll_foreach(term->sixel_images, it) { - if (it->item.pos.row == image.pos.row) { - sixel_destroy(&it->item); - tll_remove(term->sixel_images, it); - } - } - tll_push_back(term->sixel_images, image); term->sixel.image.data = NULL; diff --git a/sixel.h b/sixel.h index dbce21c5..c5c489af 100644 --- a/sixel.h +++ b/sixel.h @@ -9,6 +9,7 @@ void sixel_put(struct terminal *term, uint8_t c); void sixel_unhook(struct terminal *term); void sixel_destroy(struct sixel *sixel); +void sixel_purge_at_cursor(struct terminal *term); void sixel_colors_report_current(struct terminal *term); void sixel_colors_reset(struct terminal *term); diff --git a/terminal.c b/terminal.c index 493a8ada..5c7b94e5 100644 --- a/terminal.c +++ b/terminal.c @@ -2128,6 +2128,8 @@ term_print(struct terminal *term, wchar_t wc, int width) print_linewrap(term); print_insert(term, width); + sixel_purge_at_cursor(term); + /* *Must* get current cell *after* linewrap+insert */ struct row *row = term->grid->cur_row; struct cell *cell = &row->cells[term->cursor.point.col];