From c788b4b56ac86c71b2bad246150364d6d6dbdfff Mon Sep 17 00:00:00 2001 From: Andrew Savchenko Date: Sun, 15 Feb 2026 11:17:36 +1100 Subject: [PATCH] config: add curly-underline-height --- config.c | 16 ++++++++++++++++ config.h | 1 + doc/foot.ini.5.scd | 13 +++++++++++++ render.c | 4 ++-- 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/config.c b/config.c index 4449d9c2..0ec010c5 100644 --- a/config.c +++ b/config.c @@ -1070,6 +1070,21 @@ parse_section_main(struct context *ctx) else if (streq(key, "underline-thickness")) return value_to_pt_or_px(ctx, &conf->underline_thickness); + else if (streq(key, "curly-underline-height")) { + float value; + if (!value_to_float(ctx, &value)) + return false; + + if (value < 0.5 || value > 5.0) { + LOG_CONTEXTUAL_WARN( + "curly-underline-height should be between 0.5 and 5.0, clamping"); + value = value < 0.5 ? 0.5 : 5.0; + } + + conf->curly_underline_height_multiplier = value; + return true; + } + else if (streq(key, "strikeout-thickness")) return value_to_pt_or_px(ctx, &conf->strikeout_thickness); @@ -3399,6 +3414,7 @@ config_load(struct config *conf, const char *conf_path, .use_custom_underline_offset = false, .box_drawings_uses_font_glyphs = false, .underline_thickness = {.pt = 0., .px = -1}, + .curly_underline_height_multiplier = 3.0, .strikeout_thickness = {.pt = 0., .px = -1}, .dpi_aware = false, .gamma_correct = false, diff --git a/config.h b/config.h index 37b3259f..7e5071d0 100644 --- a/config.h +++ b/config.h @@ -267,6 +267,7 @@ struct config { bool use_custom_underline_offset; struct pt_or_px underline_offset; struct pt_or_px underline_thickness; + float curly_underline_height_multiplier; struct pt_or_px strikeout_thickness; diff --git a/doc/foot.ini.5.scd b/doc/foot.ini.5.scd index 8697add2..5f36de98 100644 --- a/doc/foot.ini.5.scd +++ b/doc/foot.ini.5.scd @@ -186,6 +186,19 @@ empty string to be set, but it must be quoted: *KEY=""*) Default: _unset_ +*curly-underline-height* + Height multiplier for curly underlines (undercurl). This is a unitless + multiplier applied to the underline thickness to determine the vertical + amplitude of the curly wave. + + For example, a value of *3.0* means the curly underline will extend + 3 times the underline thickness vertically. Higher values make taller + waves, lower values make flatter waves. + + Valid range: *0.5* to *5.0*. Values outside this range will be clamped. + + Default: *3.0* + *strikeout-thickness* Use a custom thickness (height) for strikeouts. The thickness is, by default, in _points_. diff --git a/render.c b/render.c index 1d0f08af..c070c0fa 100644 --- a/render.c +++ b/render.c @@ -445,7 +445,7 @@ draw_styled_underline(const struct terminal *term, pixman_image_t *pix, case UNDERLINE_DOUBLE: case UNDERLINE_CURLY: y_ofs = min(underline_offset(term, font), - term->cell_height - thickness * 3); + term->cell_height - thickness * term->conf->curly_underline_height_multiplier); break; case UNDERLINE_DASHED: @@ -525,7 +525,7 @@ draw_styled_underline(const struct terminal *term, pixman_image_t *pix, case UNDERLINE_CURLY: { const int top = y + y_ofs; - const int bot = top + thickness * 3; + const int bot = top + thickness * term->conf->curly_underline_height_multiplier; const int half_x = x + ceil_w / 2.0, full_x = x + ceil_w; const double bt_2 = (bot - top) * (bot - top);