From 70cfcf11fb26a1e3954e72550e4c24e0fa43a8b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Thu, 7 Jan 2021 11:46:18 +0100 Subject: [PATCH] config: letter-spacing: make this a relative value 0, the default, means no additional spacing; the cell width is defined by the font metrics. A positive value *adds* to the width from the font metrics, while a negative value *subtracts*. --- config.c | 17 +++++++++++++++-- foot.ini | 2 +- terminal.c | 9 +++++---- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/config.c b/config.c index 6af8803b..8f0b334f 100644 --- a/config.c +++ b/config.c @@ -360,6 +360,19 @@ str_to_bool(const char *s) strtoul(s, NULL, 0) > 0; } +static bool +str_to_long(const char *s, int base, long *res) +{ + if (s == NULL) + return false; + + errno = 0; + char *end = NULL; + + *res = strtol(s, &end, base); + return errno == 0 && *end == '\0'; +} + static bool str_to_ulong(const char *s, int base, unsigned long *res) { @@ -567,8 +580,8 @@ parse_section_main(const char *key, const char *value, struct config *conf, } else if (strcmp(key, "letter-spacing") == 0) { - unsigned long spacing; - if (!str_to_ulong(value, 10, &spacing)) { + long spacing; + if (!str_to_long(value, 10, &spacing)) { LOG_AND_NOTIFY_ERR( "%s:%d: [default]: letter-spacing: expected an integer, got '%s'", path, lineno, value); diff --git a/foot.ini b/foot.ini index ed9e5a72..f13d8e63 100644 --- a/foot.ini +++ b/foot.ini @@ -9,7 +9,7 @@ # font-italic= # font-bold-italic= # line-height= -# letter-spacing= +# letter-spacing=0 # horizontal-letter-offset=0 # vertical-letter-offset=0 # dpi-aware=yes diff --git a/terminal.c b/terminal.c index c7383ae2..c23450fb 100644 --- a/terminal.c +++ b/terminal.c @@ -629,10 +629,11 @@ term_set_fonts(struct terminal *term, struct fcft_font *fonts[static 4]) const int old_cell_width = term->cell_width; const int old_cell_height = term->cell_height; - term->cell_width = term->conf->letter_spacing >= 0 - ? term->conf->letter_spacing - : (term->fonts[0]->space_advance.x > 0 - ? term->fonts[0]->space_advance.x : term->fonts[0]->max_advance.x); + term->cell_width = (term->fonts[0]->space_advance.x > 0 + ? term->fonts[0]->space_advance.x + : term->fonts[0]->max_advance.x) + + term->conf->letter_spacing; + term->cell_height = term->conf->line_height >= 0 ? term->conf->line_height : max(term->fonts[0]->height,