render: sixels: update damage region when rendering sixels

This fixes flickering when foot is forced to double-buffer (e.g when
running under KDE, or smithay based compositors).

Since the damage region isn't updated, the sixel images aren't
included in the memcpy that is done to transfer the last frame's
updated regions to the next frame.

As a result, every other frame will have the sixels, while the others
don't.

Closes #1851
This commit is contained in:
Daniel Eklöf 2024-10-05 08:53:11 +02:00
parent 4afb94687c
commit ce38f5b413
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
2 changed files with 10 additions and 2 deletions

View file

@ -103,9 +103,13 @@
* Occasional visual glitches when selecting text, when foot is running
under a compositor that forces foot to double buffer
(e.g. KDE/KWin) ([#1715][1715]).
* Sixels flickering when foot is running under a compositor that
forces foot to double buffer (e.g. KDE, or Smithay based
compositors) ([#1851][1851]).
[1828]: https://codeberg.org/dnkl/foot/issues/1828
[1715]: https://codeberg.org/dnkl/foot/issues/1715
[1851]: https://codeberg.org/dnkl/foot/issues/1851
### Security

View file

@ -1390,7 +1390,8 @@ grid_render_scroll_reverse(struct terminal *term, struct buffer *buf,
}
static void
render_sixel_chunk(struct terminal *term, pixman_image_t *pix, const struct sixel *sixel,
render_sixel_chunk(struct terminal *term, pixman_image_t *pix,
pixman_region32_t *damage, const struct sixel *sixel,
int term_start_row, int img_start_row, int count)
{
/* Translate row/column to x/y pixel values */
@ -1427,6 +1428,9 @@ render_sixel_chunk(struct terminal *term, pixman_image_t *pix, const struct sixe
x, y,
width, height);
if (damage != NULL)
pixman_region32_union_rect(damage, damage, x, y, width, height);
wl_surface_damage_buffer(term->window->surface.surf, x, y, width, height);
}
@ -1450,7 +1454,7 @@ render_sixel(struct terminal *term, pixman_image_t *pix,
#define maybe_emit_sixel_chunk_then_reset() \
if (chunk_row_count != 0) { \
render_sixel_chunk( \
term, pix, sixel, \
term, pix, damage, sixel, \
chunk_term_start, chunk_img_start, chunk_row_count); \
chunk_term_start = chunk_img_start = -1; \
chunk_row_count = 0; \