dcs: DECRQSS: styled+colored underlines

This commit is contained in:
Daniel Eklöf 2024-07-01 16:25:45 +02:00
parent 7341ba5ee3
commit 64e7f25124
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F

58
dcs.c
View file

@ -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);
}