Merge branch 'master' into sixel-performance

This commit is contained in:
Daniel Eklöf 2020-06-29 22:03:26 +02:00
commit fad5838dba
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
4 changed files with 46 additions and 8 deletions

View file

@ -25,7 +25,7 @@
* Background transparency to only be used with the default background * Background transparency to only be used with the default background
color. 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 the last cell on the previous line or the first cell on the next
line is empty. line is empty.
* Number of lines to scroll is now always clamped to the number of * Number of lines to scroll is now always clamped to the number of
@ -36,6 +36,9 @@
debug logging has been enabled. debug logging has been enabled.
* OSC 4 (_Set Color_) now updates already rendered cells, excluding * OSC 4 (_Set Color_) now updates already rendered cells, excluding
scrollback. 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 ### Deprecated
@ -43,7 +46,7 @@
### Fixed ### Fixed
* Do not stop an ongoing selection when `shift` is released. When the * 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 `shift` to start a selection. This selection is now finalized only
when the mouse button is released - not as soon as `shift` is when the mouse button is released - not as soon as `shift` is
released. released.
@ -51,12 +54,12 @@
* Rare crash when scrolling and the new viewport ended up **exactly** * Rare crash when scrolling and the new viewport ended up **exactly**
on the wrap around. on the wrap around.
* Selection handling when viewport wrapped around. * Selection handling when viewport wrapped around.
* Restore signal mask in the slave process. * Restore signal mask in the client process.
* Set `IUTF8`. * Set `IUTF8`.
* Selection of double-width characters. It is no longer possible to * Selection of double-width characters. It is no longer possible to
select half of a double-width character. select half of a double-width character.
* Draw hollow block cursor on top of 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). `0x0` terminal size (https://codeberg.org/dnkl/foot/issues/20).
* Glyphs overflowing into surrounding cells * Glyphs overflowing into surrounding cells
(https://codeberg.org/dnkl/foot/issues/21). (https://codeberg.org/dnkl/foot/issues/21).

11
sixel.c
View file

@ -66,6 +66,17 @@ sixel_destroy(struct sixel *sixel)
sixel->data = NULL; 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 static void
sixel_erase(struct terminal *term, struct sixel *sixel) sixel_erase(struct terminal *term, struct sixel *sixel)
{ {

View file

@ -11,6 +11,7 @@ void sixel_put(struct terminal *term, uint8_t c);
void sixel_unhook(struct terminal *term); void sixel_unhook(struct terminal *term);
void sixel_destroy(struct sixel *sixel); 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_up(struct terminal *term, int rows);
void sixel_scroll_down(struct terminal *term, int rows); void sixel_scroll_down(struct terminal *term, int rows);

View file

@ -36,7 +36,7 @@
static const char *const XCURSOR_LEFT_PTR = "left_ptr"; static const char *const XCURSOR_LEFT_PTR = "left_ptr";
static const char *const XCURSOR_TEXT = "text"; static const char *const XCURSOR_TEXT = "text";
static const char *const XCURSOR_HAND2 = "hand2"; //static const char *const XCURSOR_HAND2 = "hand2";
bool bool
term_to_slave(struct terminal *term, const void *_data, size_t len) 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; 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; return true;
} }
@ -2206,9 +2229,9 @@ void
term_xcursor_update(struct terminal *term) term_xcursor_update(struct terminal *term)
{ {
term->xcursor = term->xcursor =
term->is_searching ? XCURSOR_LEFT_PTR : term->is_searching ? XCURSOR_LEFT_PTR : /* TODO: something different? */
selection_enabled(term) ? XCURSOR_TEXT : selection_enabled(term) ? XCURSOR_TEXT :
XCURSOR_HAND2; XCURSOR_LEFT_PTR;
render_xcursor_set(term); render_xcursor_set(term);
} }