diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a26a22a..5a5fe627 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,7 +25,7 @@ * Background transparency to only be used with the default background color. -* Copy to clipboard/primary selection to insert a line break if either +* Copy-to-clipboard/primary-selection to insert a line break if either the last cell on the previous line or the first cell on the next line is empty. * Number of lines to scroll is now always clamped to the number of @@ -36,6 +36,9 @@ debug logging has been enabled. * OSC 4 (_Set Color_) now updates already rendered cells, excluding 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 @@ -43,7 +46,7 @@ ### Fixed * Do not stop an ongoing selection when `shift` is released. When the - client application is capturing mouse events, one must hold down + client application is capturing the mouse, one must hold down `shift` to start a selection. This selection is now finalized only when the mouse button is released - not as soon as `shift` is released. @@ -51,12 +54,12 @@ * Rare crash when scrolling and the new viewport ended up **exactly** on the wrap around. * Selection handling when viewport wrapped around. -* Restore signal mask in the slave process. +* Restore signal mask in the client process. * Set `IUTF8`. * Selection of double-width characters. It is no longer possible to select half of a double-width character. * Draw hollow block cursor on top of character. -* Set an initial `TIOCSWINSZ`. This ensures clients never reads a +* Set an initial `TIOCSWINSZ`. This ensures clients never read a `0x0` terminal size (https://codeberg.org/dnkl/foot/issues/20). * Glyphs overflowing into surrounding cells (https://codeberg.org/dnkl/foot/issues/21). diff --git a/sixel.c b/sixel.c index 5973e097..0a28defd 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 3154e27d..666b8c40 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); void sixel_scroll_up(struct terminal *term, int rows); void sixel_scroll_down(struct terminal *term, int rows); diff --git a/terminal.c b/terminal.c index 2497dde5..c5960c90 100644 --- a/terminal.c +++ b/terminal.c @@ -36,7 +36,7 @@ static const char *const XCURSOR_LEFT_PTR = "left_ptr"; static const char *const XCURSOR_TEXT = "text"; -static const char *const XCURSOR_HAND2 = "hand2"; +//static const char *const XCURSOR_HAND2 = "hand2"; bool term_to_slave(struct terminal *term, const void *_data, size_t len) @@ -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; } @@ -2206,9 +2229,9 @@ void term_xcursor_update(struct terminal *term) { term->xcursor = - term->is_searching ? XCURSOR_LEFT_PTR : + term->is_searching ? XCURSOR_LEFT_PTR : /* TODO: something different? */ selection_enabled(term) ? XCURSOR_TEXT : - XCURSOR_HAND2; + XCURSOR_LEFT_PTR; render_xcursor_set(term); }