From 7609fbba472a767849a34ca68b21ceaeccee9565 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 20 Mar 2021 15:32:31 +0100 Subject: [PATCH] term: increase/decrease custom line-height with font size changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When the user has set a custom line-height, we now adjust it when increasing/decreasing (“zooming”) the font size at run-time. Previously, the line-height was fixed at the size specified in foot.ini. --- CHANGELOG.md | 2 ++ config.h | 6 ------ terminal.c | 15 +++++++++++++-- terminal.h | 7 +++++++ 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 266d9b77..0e065995 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,8 @@ * Logic that repairs invalid key bindings ended up breaking valid key bindings instead (https://codeberg.org/dnkl/foot/issues/407). +* Custom `line-height` settings now scale when increasing or + decreasing the font size at run-time. ### Security diff --git a/config.h b/config.h index 1fe82257..f8c7aaf0 100644 --- a/config.h +++ b/config.h @@ -53,12 +53,6 @@ struct config_mouse_binding { struct config_binding_pipe pipe; }; -/* If px != 0 then px is valid, otherwise pt is valid */ -struct pt_or_px { - int16_t px; - float pt; -}; - struct config_spawn_template { char *raw_cmd; char **argv; diff --git a/terminal.c b/terminal.c index 68a7a138..cf0e1d13 100644 --- a/terminal.c +++ b/terminal.c @@ -649,8 +649,8 @@ term_set_fonts(struct terminal *term, struct fcft_font *fonts[static 4]) : term->fonts[0]->max_advance.x) + pt_or_px_as_pixels(term, &conf->letter_spacing); - term->cell_height = conf->line_height.px >= 0 - ? pt_or_px_as_pixels(term, &conf->line_height) + term->cell_height = term->font_line_height.px >= 0 + ? pt_or_px_as_pixels(term, &term->font_line_height) : max(term->fonts[0]->height, term->fonts[0]->ascent + term->fonts[0]->descent); @@ -979,6 +979,7 @@ load_fonts_from_conf(struct terminal *term) } } + term->font_line_height = term->conf->line_height; return reload_fonts(term); } @@ -1196,6 +1197,7 @@ term_init(const struct config *conf, struct fdm *fdm, struct reaper *reaper, .pt_size = it->item.pt_size, .px_size = it->item.px_size}; } } + term->font_line_height = conf->line_height; /* Start the slave/client */ if ((term->slave = slave_spawn( @@ -1780,6 +1782,15 @@ term_font_size_adjust(struct terminal *term, double amount) } } + if (term->font_line_height.px >= 0) { + double old_pt_size = term->font_line_height.px > 0 + ? term->font_line_height.px * 72. / term->font_dpi + : term->font_line_height.pt; + + term->font_line_height.px = 0; + term->font_line_height.pt = fmax(old_pt_size + amount, 0); + } + return reload_fonts(term); } diff --git a/terminal.h b/terminal.h index 044fc581..6cf52522 100644 --- a/terminal.h +++ b/terminal.h @@ -261,6 +261,12 @@ struct url { }; typedef tll(struct url) url_list_t; +/* If px != 0 then px is valid, otherwise pt is valid */ +struct pt_or_px { + int16_t px; + float pt; +}; + struct terminal { struct fdm *fdm; struct reaper *reaper; @@ -312,6 +318,7 @@ struct terminal { struct fcft_font *fonts[4]; struct config_font *font_sizes[4]; + struct pt_or_px font_line_height; float font_dpi; int font_scale; int16_t font_x_ofs;