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.
This commit is contained in:
Daniel Eklöf 2024-03-04 16:18:49 +01:00
parent 5f41eb798b
commit 282c55aa4a
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
2 changed files with 8 additions and 12 deletions

View file

@ -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

16
sixel.c
View file

@ -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);