From 64e7f2512481d33fb46b1cd3eff4b4854d634a2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Mon, 1 Jul 2024 16:25:45 +0200 Subject: [PATCH] dcs: DECRQSS: styled+colored underlines --- dcs.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 46 insertions(+), 12 deletions(-) diff --git a/dcs.c b/dcs.c index 4dccbdee..7856d79c 100644 --- a/dcs.c +++ b/dcs.c @@ -9,6 +9,7 @@ #include "util.h" #include "vt.h" #include "xmalloc.h" +#include "xsnprintf.h" static bool ensure_size(struct terminal *term, size_t required_size) @@ -270,9 +271,9 @@ decrqss_unhook(struct terminal *term) if (n == 1 && query[0] == 'r') { /* DECSTBM - Set Top and Bottom Margins */ char reply[64]; - int len = snprintf(reply, sizeof(reply), "\033P1$r%d;%dr\033\\", - term->scroll_region.start + 1, - term->scroll_region.end); + int len = xsnprintf(reply, sizeof(reply), "\033P1$r%d;%dr\033\\", + term->scroll_region.start + 1, + term->scroll_region.end); term_to_slave(term, reply, len); } @@ -296,8 +297,15 @@ decrqss_unhook(struct terminal *term) append_sgr_attr("2"); if (a->italic) append_sgr_attr("3"); - if (a->underline) - append_sgr_attr("4"); + if (a->underline) { + if (term->vt.curly.style > CURLY_SINGLE) { + char value[4]; + int val_len = + xsnprintf(value, sizeof(value), "4:%d", term->vt.curly.style); + append_sgr_attr_n(&reply, &len, value, val_len); + } else + append_sgr_attr("4"); + } if (a->blink) append_sgr_attr("5"); if (a->reverse) @@ -313,7 +321,7 @@ decrqss_unhook(struct terminal *term) case COLOR_BASE16: { char value[4]; - int val_len = snprintf( + int val_len = xsnprintf( value, sizeof(value), "%u", a->fg >= 8 ? a->fg - 8 + 90 : a->fg + 30); append_sgr_attr_n(&reply, &len, value, val_len); @@ -322,7 +330,7 @@ decrqss_unhook(struct terminal *term) case COLOR_BASE256: { char value[16]; - int val_len = snprintf(value, sizeof(value), "38:5:%u", a->fg); + int val_len = xsnprintf(value, sizeof(value), "38:5:%u", a->fg); append_sgr_attr_n(&reply, &len, value, val_len); break; } @@ -333,7 +341,7 @@ decrqss_unhook(struct terminal *term) uint8_t b = a->fg >> 0; char value[32]; - int val_len = snprintf( + int val_len = xsnprintf( value, sizeof(value), "38:2::%hhu:%hhu:%hhu", r, g, b); append_sgr_attr_n(&reply, &len, value, val_len); break; @@ -346,7 +354,7 @@ decrqss_unhook(struct terminal *term) case COLOR_BASE16: { char value[4]; - int val_len = snprintf( + int val_len = xsnprintf( value, sizeof(value), "%u", a->bg >= 8 ? a->bg - 8 + 100 : a->bg + 40); append_sgr_attr_n(&reply, &len, value, val_len); @@ -355,7 +363,7 @@ decrqss_unhook(struct terminal *term) case COLOR_BASE256: { char value[16]; - int val_len = snprintf(value, sizeof(value), "48:5:%u", a->bg); + int val_len = xsnprintf(value, sizeof(value), "48:5:%u", a->bg); append_sgr_attr_n(&reply, &len, value, val_len); break; } @@ -366,13 +374,39 @@ decrqss_unhook(struct terminal *term) uint8_t b = a->bg >> 0; char value[32]; - int val_len = snprintf( + int val_len = xsnprintf( value, sizeof(value), "48:2::%hhu:%hhu:%hhu", r, g, b); append_sgr_attr_n(&reply, &len, value, val_len); break; } } + switch (term->vt.curly.color_src) { + case COLOR_DEFAULT: + case COLOR_BASE16: + break; + + case COLOR_BASE256: { + char value[16]; + int val_len = xsnprintf( + value, sizeof(value), "58:5:%u", term->vt.curly.color); + append_sgr_attr_n(&reply, &len, value, val_len); + break; + } + + case COLOR_RGB: { + uint8_t r = term->vt.curly.color >> 16; + uint8_t g = term->vt.curly.color >> 8; + uint8_t b = term->vt.curly.color >> 0; + + char value[32]; + int val_len = xsnprintf( + value, sizeof(value), "58:2::%hhu:%hhu:%hhu", r, g, b); + append_sgr_attr_n(&reply, &len, value, val_len); + break; + } + } + #undef append_sgr_attr_n reply[len - 1] = 'm'; @@ -398,7 +432,7 @@ decrqss_unhook(struct terminal *term) mode--; char reply[16]; - int len = snprintf(reply, sizeof(reply), "\033P1$r%d q\033\\", mode); + int len = xsnprintf(reply, sizeof(reply), "\033P1$r%d q\033\\", mode); term_to_slave(term, reply, len); }