From a0942f950df3b8826db4b1a3f149b7d0ed45adcf Mon Sep 17 00:00:00 2001 From: Yorick Peterse Date: Fri, 19 Aug 2022 02:54:49 +0200 Subject: [PATCH] config: add setting for underline thickness This adds an "underline-thickness" setting to the "main" section, similar to the existing "underline-offset" setting. This setting is used to specify a custom height for regular (= non-cursor) underlines. Fixes #1136 --- CHANGELOG.md | 6 ++++++ config.c | 4 ++++ config.h | 1 + doc/foot.ini.5.scd | 12 ++++++++++++ foot.ini | 1 + render.c | 5 ++++- tests/test-config.c | 1 + 7 files changed, 29 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5fa35a63..f0bf2624 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,12 @@ ## Unreleased ### Added + +* Support for adjusting the thickness of regular underlines ([#1136][1136]). + +[1136]: https://codeberg.org/dnkl/foot/issues/1136 + + ### Changed * Window is now dimmed while in Unicode input mode. diff --git a/config.c b/config.c index fbeab3e6..0ee01373 100644 --- a/config.c +++ b/config.c @@ -904,6 +904,9 @@ parse_section_main(struct context *ctx) return true; } + else if (strcmp(key, "underline-thickness") == 0) + return value_to_pt_or_px(ctx, &conf->underline_thickness); + else if (strcmp(key, "dpi-aware") == 0) { if (strcmp(value, "auto") == 0) conf->dpi_aware = DPI_AWARE_AUTO; @@ -2833,6 +2836,7 @@ config_load(struct config *conf, const char *conf_path, .vertical_letter_offset = {.pt = 0, .px = 0}, .use_custom_underline_offset = false, .box_drawings_uses_font_glyphs = false, + .underline_thickness = {.pt = 0., .px = -1}, .dpi_aware = DPI_AWARE_AUTO, /* DPI-aware when scaling-factor == 1 */ .bell = { .urgent = false, diff --git a/config.h b/config.h index 70e182e3..f98e4d35 100644 --- a/config.h +++ b/config.h @@ -150,6 +150,7 @@ struct config { bool use_custom_underline_offset; struct pt_or_px underline_offset; + struct pt_or_px underline_thickness; bool box_drawings_uses_font_glyphs; bool can_shape_grapheme; diff --git a/doc/foot.ini.5.scd b/doc/foot.ini.5.scd index 995a7e33..0bc21786 100644 --- a/doc/foot.ini.5.scd +++ b/doc/foot.ini.5.scd @@ -132,6 +132,18 @@ commented out will usually be installed to */etc/xdg/foot/foot.ini*. Default: _unset_. +*underline-thickness* + Use a custom thickness (height) for underlines. The thickness is, by + default, in _points_. + + To specify a thickness in _pixels_, append *px*: + *underline-thickness=1px*. + + If left unset (the default), the thickness specified in the font is + used. + + Default: _unset_ + *box-drawings-uses-font-glyphs* Boolean. When disabled, foot generates box/line drawing characters itself. The are several advantages to doing this instead of using font glyphs: diff --git a/foot.ini b/foot.ini index 4c857296..0c19951e 100644 --- a/foot.ini +++ b/foot.ini @@ -17,6 +17,7 @@ # horizontal-letter-offset=0 # vertical-letter-offset=0 # underline-offset= +# underline-thickness= # box-drawings-uses-font-glyphs=no # dpi-aware=auto diff --git a/render.c b/render.c index 82c9bd13..ef698911 100644 --- a/render.c +++ b/render.c @@ -372,7 +372,10 @@ draw_underline(const struct terminal *term, pixman_image_t *pix, const struct fcft_font *font, const pixman_color_t *color, int x, int y, int cols) { - const int thickness = font->underline.thickness; + const int thickness = term->conf->underline_thickness.px >= 0 + ? term_pt_or_px_as_pixels( + term, &term->conf->underline_thickness) + : font->underline.thickness; /* Make sure the line isn't positioned below the cell */ const int y_ofs = min(underline_offset(term, font), diff --git a/tests/test-config.c b/tests/test-config.c index 930be6bf..837c5106 100644 --- a/tests/test-config.c +++ b/tests/test-config.c @@ -470,6 +470,7 @@ test_section_main(void) test_pt_or_px(&ctx, &parse_section_main, "letter-spacing", &conf.letter_spacing); test_pt_or_px(&ctx, &parse_section_main, "horizontal-letter-offset", &conf.horizontal_letter_offset); test_pt_or_px(&ctx, &parse_section_main, "vertical-letter-offset", &conf.vertical_letter_offset); + test_pt_or_px(&ctx, &parse_section_main, "underline-thickness", &conf.underline_thickness); test_uint16(&ctx, &parse_section_main, "resize-delay-ms", &conf.resize_delay_ms); test_uint16(&ctx, &parse_section_main, "workers", &conf.render_worker_count);