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
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).

11
sixel.c
View file

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

View file

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

View file

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