mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-04 04:06:06 -05:00
dcs: DECRQSS: styled+colored underlines
This commit is contained in:
parent
7341ba5ee3
commit
64e7f25124
1 changed files with 46 additions and 12 deletions
58
dcs.c
58
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);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue