mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-05 04:06:08 -05:00
dcs: decrqss: refactor: append_sgr_attr_n() is now a proper function
This commit is contained in:
parent
f048e08f10
commit
b292e735bb
1 changed files with 28 additions and 27 deletions
55
dcs.c
55
dcs.c
|
|
@ -213,6 +213,16 @@ xtgettcap_unhook(struct terminal *term)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void NOINLINE
|
||||||
|
append_sgr_attr_n(char **reply, size_t *len, const char *attr, size_t n)
|
||||||
|
{
|
||||||
|
size_t new_len = *len + n + 1;
|
||||||
|
*reply = xrealloc(*reply, new_len);
|
||||||
|
memcpy(&(*reply)[*len], attr, n);
|
||||||
|
(*reply)[new_len - 1] = ';';
|
||||||
|
*len = new_len;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
decrqss(struct terminal *term)
|
decrqss(struct terminal *term)
|
||||||
{
|
{
|
||||||
|
|
@ -244,39 +254,31 @@ decrqss(struct terminal *term)
|
||||||
char *reply = NULL;
|
char *reply = NULL;
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
|
|
||||||
#define append_attr_n(str, l) do { \
|
#define append_sgr_attr(num_as_str) \
|
||||||
size_t new_len = len + l + 1; \
|
append_sgr_attr_n(&reply, &len, num_as_str, sizeof(num_as_str) - 1)
|
||||||
reply = xrealloc(reply, new_len); \
|
|
||||||
memcpy(&reply[len], str, l); \
|
|
||||||
reply[new_len - 1] = ';'; \
|
|
||||||
len = new_len; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define append_attr(num_as_str) \
|
|
||||||
append_attr_n(num_as_str, sizeof(num_as_str) - 1)
|
|
||||||
|
|
||||||
/* Always present, both in the example from the VT510 manual
|
/* Always present, both in the example from the VT510 manual
|
||||||
* (https://vt100.net/docs/vt510-rm/DECRPSS), and in XTerm and
|
* (https://vt100.net/docs/vt510-rm/DECRPSS), and in XTerm and
|
||||||
* mlterm */
|
* mlterm */
|
||||||
append_attr("0");
|
append_sgr_attr("0");
|
||||||
|
|
||||||
struct attributes *a = &term->vt.attrs;
|
struct attributes *a = &term->vt.attrs;
|
||||||
if (a->bold)
|
if (a->bold)
|
||||||
append_attr("1");
|
append_sgr_attr("1");
|
||||||
if (a->dim)
|
if (a->dim)
|
||||||
append_attr("2");
|
append_sgr_attr("2");
|
||||||
if (a->italic)
|
if (a->italic)
|
||||||
append_attr("3");
|
append_sgr_attr("3");
|
||||||
if (a->underline)
|
if (a->underline)
|
||||||
append_attr("4");
|
append_sgr_attr("4");
|
||||||
if (a->blink)
|
if (a->blink)
|
||||||
append_attr("5");
|
append_sgr_attr("5");
|
||||||
if (a->reverse)
|
if (a->reverse)
|
||||||
append_attr("7");
|
append_sgr_attr("7");
|
||||||
if (a->conceal)
|
if (a->conceal)
|
||||||
append_attr("8");
|
append_sgr_attr("8");
|
||||||
if (a->strikethrough)
|
if (a->strikethrough)
|
||||||
append_attr("9");
|
append_sgr_attr("9");
|
||||||
|
|
||||||
switch (a->fg_src) {
|
switch (a->fg_src) {
|
||||||
case COLOR_DEFAULT:
|
case COLOR_DEFAULT:
|
||||||
|
|
@ -287,14 +289,14 @@ decrqss(struct terminal *term)
|
||||||
int val_len = snprintf(
|
int val_len = snprintf(
|
||||||
value, sizeof(value), "%u",
|
value, sizeof(value), "%u",
|
||||||
a->fg >= 8 ? a->fg - 8 + 90 : a->fg + 30);
|
a->fg >= 8 ? a->fg - 8 + 90 : a->fg + 30);
|
||||||
append_attr_n(value, val_len);
|
append_sgr_attr_n(&reply, &len, value, val_len);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case COLOR_BASE256: {
|
case COLOR_BASE256: {
|
||||||
char value[16];
|
char value[16];
|
||||||
int val_len = snprintf(value, sizeof(value), "38:5:%u", a->fg);
|
int val_len = snprintf(value, sizeof(value), "38:5:%u", a->fg);
|
||||||
append_attr_n(value, val_len);
|
append_sgr_attr_n(&reply, &len, value, val_len);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -306,7 +308,7 @@ decrqss(struct terminal *term)
|
||||||
char value[32];
|
char value[32];
|
||||||
int val_len = snprintf(
|
int val_len = snprintf(
|
||||||
value, sizeof(value), "38:2::%hhu:%hhu:%hhu", r, g, b);
|
value, sizeof(value), "38:2::%hhu:%hhu:%hhu", r, g, b);
|
||||||
append_attr_n(value, val_len);
|
append_sgr_attr_n(&reply, &len, value, val_len);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -320,14 +322,14 @@ decrqss(struct terminal *term)
|
||||||
int val_len = snprintf(
|
int val_len = snprintf(
|
||||||
value, sizeof(value), "%u",
|
value, sizeof(value), "%u",
|
||||||
a->bg >= 8 ? a->bg - 8 + 100 : a->bg + 40);
|
a->bg >= 8 ? a->bg - 8 + 100 : a->bg + 40);
|
||||||
append_attr_n(value, val_len);
|
append_sgr_attr_n(&reply, &len, value, val_len);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case COLOR_BASE256: {
|
case COLOR_BASE256: {
|
||||||
char value[16];
|
char value[16];
|
||||||
int val_len = snprintf(value, sizeof(value), "48:5:%u", a->bg);
|
int val_len = snprintf(value, sizeof(value), "48:5:%u", a->bg);
|
||||||
append_attr_n(value, val_len);
|
append_sgr_attr_n(&reply, &len, value, val_len);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -339,13 +341,12 @@ decrqss(struct terminal *term)
|
||||||
char value[32];
|
char value[32];
|
||||||
int val_len = snprintf(
|
int val_len = snprintf(
|
||||||
value, sizeof(value), "48:2::%hhu:%hhu:%hhu", r, g, b);
|
value, sizeof(value), "48:2::%hhu:%hhu:%hhu", r, g, b);
|
||||||
append_attr_n(value, val_len);
|
append_sgr_attr_n(&reply, &len, value, val_len);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef append_attr
|
#undef append_sgr_attr_n
|
||||||
#undef append_attr_n
|
|
||||||
|
|
||||||
reply[len - 1] = 'm';
|
reply[len - 1] = 'm';
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue