diff --git a/CHANGELOG.md b/CHANGELOG.md index fa87ff4b..f276e493 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ # Changelog +* [Unreleased](#unreleased) * [1.16.0](#1-16-0) * [1.15.3](#1-15-3) * [1.15.2](#1-15-2) @@ -46,13 +47,31 @@ * [1.2.0](#1-2-0) +## Unreleased +### Added +### Changed +### Deprecated +### Removed +### Fixed + +* Foot not starting on linux kernels before 6.3 ([#1514][1514]). +* Cells underneath erased sixels not being repainted ([#1515][1515]). + +[1514]: https://codeberg.org/dnkl/foot/issues/1514 +[1515]: https://codeberg.org/dnkl/foot/issues/1515 + + +### Security +### Contributors + + ## 1.16.0 ### Added * Support for building with _wayland-protocols_ as a subproject. * Mouse wheel scrolls can now be used in `mouse-bindings` - ([#1077](1077)). + ([#1077][1077]). * New mouse bindings: `scrollback-up-mouse` and `scrollback-down-mouse`, bound to `BTN_BACK` and `BTN_FORWARD` respectively. diff --git a/render.c b/render.c index 81e9a0a4..11d323d5 100644 --- a/render.c +++ b/render.c @@ -1199,7 +1199,8 @@ render_sixel_chunk(struct terminal *term, pixman_image_t *pix, const struct sixe static void render_sixel(struct terminal *term, pixman_image_t *pix, - const struct coord *cursor, const struct sixel *sixel) + pixman_region32_t *damage, const struct coord *cursor, + const struct sixel *sixel) { xassert(sixel->pix != NULL); xassert(sixel->width >= 0); @@ -1293,8 +1294,7 @@ render_sixel(struct terminal *term, pixman_image_t *pix, */ if (!sixel->opaque) { /* TODO: multithreading */ - int cursor_col = cursor->row == term_row_no ? cursor->col : -1; - render_row(term, pix, NULL, row, term_row_no, cursor_col); + render_row(term, pix, damage, row, term_row_no, cursor_col); } else { for (int col = sixel->pos.col; col < min(sixel->pos.col + sixel->cols, term->cols); @@ -1309,7 +1309,7 @@ render_sixel(struct terminal *term, pixman_image_t *pix, if ((last_row_needs_erase && last_row) || (last_col_needs_erase && last_col)) { - render_cell(term, pix, NULL, row, term_row_no, col, cursor_col == col); + render_cell(term, pix, damage, row, term_row_no, col, cursor_col); } else { cell->attrs.clean = 1; cell->attrs.confined = 1; @@ -1333,6 +1333,7 @@ render_sixel(struct terminal *term, pixman_image_t *pix, static void render_sixel_images(struct terminal *term, pixman_image_t *pix, + pixman_region32_t *damage, const struct coord *cursor) { if (likely(tll_length(term->grid->sixel_images)) == 0) @@ -1370,7 +1371,7 @@ render_sixel_images(struct terminal *term, pixman_image_t *pix, } sixel_sync_cache(term, &it->item); - render_sixel(term, pix, cursor, &it->item); + render_sixel(term, pix, damage, cursor, &it->item); } } @@ -2974,7 +2975,10 @@ grid_render(struct terminal *term) } } - render_sixel_images(term, buf->pix[0], &cursor); + pixman_region32_t damage; + pixman_region32_init(&damage); + + render_sixel_images(term, buf->pix[0], &damage, &cursor); if (term->render.workers.count > 0) { mtx_lock(&term->render.workers.lock); @@ -2985,9 +2989,6 @@ grid_render(struct terminal *term) xassert(tll_length(term->render.workers.queue) == 0); } - pixman_region32_t damage; - pixman_region32_init(&damage); - for (int r = 0; r < term->rows; r++) { struct row *row = grid_row_in_view(term->grid, r); diff --git a/shm.c b/shm.c index 8ca0ead0..171459f6 100644 --- a/shm.c +++ b/shm.c @@ -27,10 +27,8 @@ #define MAP_UNINITIALIZED 0 #endif -#if defined(MFD_NOEXEC_SEAL) - #define FOOT_MFD_FLAGS (MFD_CLOEXEC | MFD_ALLOW_SEALING | MFD_NOEXEC_SEAL) -#else - #define FOOT_MFD_FLAGS (MFD_CLOEXEC | MFD_ALLOW_SEALING) +#if !defined(MFD_NOEXEC_SEAL) + #define MFD_NOEXEC_SEAL 0 #endif #define TIME_SCROLL 0 @@ -339,7 +337,20 @@ get_new_buffers(struct buffer_chain *chain, size_t count, /* Backing memory for SHM */ #if defined(MEMFD_CREATE) - pool_fd = memfd_create("foot-wayland-shm-buffer-pool", FOOT_MFD_FLAGS); + /* + * Older kernels reject MFD_NOEXEC_SEAL with EINVAL. Try first + * *with* it, and if that fails, try again *without* it. + */ + errno = 0; + pool_fd = memfd_create( + "foot-wayland-shm-buffer-pool", + MFD_CLOEXEC | MFD_ALLOW_SEALING | MFD_NOEXEC_SEAL); + + if (pool_fd < 0 && errno == EINVAL) { + pool_fd = memfd_create( + "foot-wayland-shm-buffer-pool", MFD_CLOEXEC | MFD_ALLOW_SEALING); + } + #elif defined(__FreeBSD__) // memfd_create on FreeBSD 13 is SHM_ANON without sealing support pool_fd = shm_open(SHM_ANON, O_RDWR | O_CLOEXEC, 0600); diff --git a/sixel.c b/sixel.c index bd2ebe1d..8a0b130f 100644 --- a/sixel.c +++ b/sixel.c @@ -180,7 +180,7 @@ sixel_erase(struct terminal *term, struct sixel *sixel) row->dirty = true; - for (int c = sixel->pos.col; c < min(sixel->cols, term->cols); c++) + for (int c = sixel->pos.col; c < min(sixel->pos.col + sixel->cols, term->cols); c++) row->cells[c].attrs.clean = 0; }