From 282c55aa4ac9a082392ee13107958fd0b84e7767 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Mon, 4 Mar 2024 16:18:49 +0100 Subject: [PATCH] sixel: place cursor on the last character row touched by the sixel After emitting a sixel, place the cursor on the character row touched by the last sixel. The last sixel _may_ not be a multiple of 6 pixels, *if* the sixel had an explicit width/height set via raster attributes. This is an intended deviation from the DEC cursor placement algorithm, where the cursor is placed on the character row touched by the last sixel's *upper* pixel. The adjusted algorithm implemented here makes it much easier for applications to handle text-after-sixels, since they can now simply assume a single text newline is required to move the cursor to a character row not touched by the sixel. --- CHANGELOG.md | 4 ++++ sixel.c | 16 ++++------------ 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 53d0bf39..7d3a1662 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -109,6 +109,9 @@ determining whether a key combination produces text or not. * CSI-t queries now report pixel values **unscaled**, instead of **scaled** ([#1643][1643]). +* Sixel: text cursor is now placed on the last text row touched by the + sixel, instead of the text row touched by the _upper_ pixel of the + last sixel ([#chafa-192][chafa-192]). [1526]: https://codeberg.org/dnkl/foot/issues/1526 [1528]: https://codeberg.org/dnkl/foot/issues/1528 @@ -116,6 +119,7 @@ [kitty-6913]: https://github.com/kovidgoyal/kitty/issues/6913 [1584]: https://codeberg.org/dnkl/foot/issues/1584 [1643]: https://codeberg.org/dnkl/foot/issues/1643 +[chafa-192]: https://github.com/hpjansson/chafa/issues/192 ### Deprecated diff --git a/sixel.c b/sixel.c index 0cb089ed..586eaf2e 100644 --- a/sixel.c +++ b/sixel.c @@ -1230,19 +1230,11 @@ sixel_unhook(struct terminal *term) int row = term->grid->cursor.point.row; /* - * Position the text cursor based on the **upper** - * pixel, of the last sixel. - * - * In most cases, that'll end up being the very last - * row of the sixel (which we're already at, thanks to - * the linefeeds). But for some combinations of font - * and image sizes, the final cursor position is - * higher up. + * Position the text cursor based on the text row + * touched by the last sixel */ - const int sixel_row_height = 6 * term->sixel.pan; - const int sixel_rows = (image.original.height + sixel_row_height - 1) / sixel_row_height; - const int upper_pixel_last_sixel = (sixel_rows - 1) * sixel_row_height; - const int term_rows = (upper_pixel_last_sixel + term->cell_height - 1) / term->cell_height; + const int term_rows = + (image.original.height + term->cell_height - 1) / term->cell_height; xassert(term_rows <= image.rows);