From 8f5e6e85e0401a0071814c6dac7f16adb3b0b6e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Mon, 29 Jun 2020 21:53:29 +0200 Subject: [PATCH] sixel: destroy all sixels when font size is decreased If changing the font size causes the cell size to decrease, either horizontally or vertically (or both), then delete all sixels since the grid space they allocated no longer is enough to hold the images. --- CHANGELOG.md | 1 + sixel.c | 11 +++++++++++ sixel.h | 1 + terminal.c | 25 ++++++++++++++++++++++++- 4 files changed, 37 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ad5522b..6ba2ef59 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,7 @@ scrollback. * Mouse cursor from `hand2` to `left_ptr` when client is capturing the mouse. +* Sixel images are now removed when the font size is **decreased**. ### Deprecated diff --git a/sixel.c b/sixel.c index a4b27416..80ac3843 100644 --- a/sixel.c +++ b/sixel.c @@ -66,6 +66,17 @@ sixel_destroy(struct sixel *sixel) sixel->data = NULL; } +void +sixel_destroy_all(struct terminal *term) +{ + tll_foreach(term->normal.sixel_images, it) + sixel_destroy(&it->item); + tll_foreach(term->alt.sixel_images, it) + sixel_destroy(&it->item); + tll_free(term->normal.sixel_images); + tll_free(term->alt.sixel_images); +} + static void sixel_erase(struct terminal *term, struct sixel *sixel) { diff --git a/sixel.h b/sixel.h index bb3eb730..fc59d6e9 100644 --- a/sixel.h +++ b/sixel.h @@ -11,6 +11,7 @@ void sixel_put(struct terminal *term, uint8_t c); void sixel_unhook(struct terminal *term); void sixel_destroy(struct sixel *sixel); +void sixel_destroy_all(struct terminal *term); /* * Deletes all sixels that are touched by the specified row(s). Used diff --git a/terminal.c b/terminal.c index b7a49375..c3a36b45 100644 --- a/terminal.c +++ b/terminal.c @@ -1423,7 +1423,30 @@ term_font_size_adjust(struct terminal *term, double amount) return false; } - term_set_fonts(term, (struct fcft_font *[]){data[0].font_out, data[1].font_out, data[2].font_out, data[3].font_out}); + const int old_cell_width = term->cell_width; + const int old_cell_height = term->cell_height; + + if (!term_set_fonts(term, (struct fcft_font *[]){data[0].font_out, data[1].font_out, data[2].font_out, data[3].font_out})) + return false; + + if (term->cell_width < old_cell_width || + term->cell_height < old_cell_height) + { + /* + * The cell size has decreased. + * + * This means sixels, which we cannot resize, no longer fit + * into their "allocated" grid space. + * + * To be able to fit them, we would have to change the grid + * content. Inserting empty lines _might_ seem acceptable, but + * we'd also need to insert empty columns, which would break + * existing layout completely. + * + * So we delete them. + */ + sixel_destroy_all(term); + } return true; }