1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
diff --git a/src/tsm/tsm-vte.c b/src/tsm/tsm-vte.c
index abadd51..e773ebb 100644
--- a/src/tsm/tsm-vte.c
+++ b/src/tsm/tsm-vte.c
@@ -1056,7 +1056,8 @@ static void do_esc(struct tsm_vte *vte, uint32_t data)
static void csi_attribute(struct tsm_vte *vte)
{
static const uint8_t bval[6] = { 0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff };
- unsigned int i, code;
+ unsigned int i, code, val;
+ uint8_t cr, cg, cb;
if (vte->csi_argc <= 1 && vte->csi_argv[0] == -1) {
vte->csi_argc = 1;
@@ -1204,53 +1205,61 @@ static void csi_attribute(struct tsm_vte *vte)
case 38:
/* fallthrough */
case 48:
- if (i + 2 >= vte->csi_argc ||
- vte->csi_argv[i + 1] != 5 ||
- vte->csi_argv[i + 2] < 0) {
- llog_debug(vte, "invalid 256color SGR");
- break;
- }
-
- code = vte->csi_argv[i + 2];
- if (vte->csi_argv[i] == 38) {
- if (code < 16) {
- vte->cattr.fccode = code;
- } else if (code < 232) {
- vte->cattr.fccode = -1;
- code -= 16;
- vte->cattr.fb = bval[code % 6];
- code /= 6;
- vte->cattr.fg = bval[code % 6];
- code /= 6;
- vte->cattr.fr = bval[code % 6];
- } else {
- vte->cattr.fccode = -1;
- code = (code - 232) * 10 + 8;
- vte->cattr.fr = code;
- vte->cattr.fg = code;
- vte->cattr.fb = code;
+ val = vte->csi_argv[i];
+ if (vte->csi_argv[i + 1] == 5) { // 256color mode
+ if (i + 2 >= vte->csi_argc ||
+ vte->csi_argv[i + 2] < 0) {
+ llog_debug(vte, "invalid 256color SGR");
+ break;
}
- } else {
+ code = vte->csi_argv[i + 2];
if (code < 16) {
- vte->cattr.bccode = code;
+ //nochange
} else if (code < 232) {
- vte->cattr.bccode = -1;
code -= 16;
- vte->cattr.bb = bval[code % 6];
+ cb = bval[code % 6];
code /= 6;
- vte->cattr.bg = bval[code % 6];
+ cg = bval[code % 6];
code /= 6;
- vte->cattr.br = bval[code % 6];
+ cr = bval[code % 6];
+ code = -1;
} else {
- vte->cattr.bccode = -1;
code = (code - 232) * 10 + 8;
- vte->cattr.br = code;
- vte->cattr.bg = code;
- vte->cattr.bb = code;
+ cr = code;
+ cg = code;
+ cb = code;
+ code = -1;
}
+ i += 2;
+ } else if (vte->csi_argv[i + 1] == 2) { // true color mode
+ if (i + 4 >= vte->csi_argc ||
+ vte->csi_argv[i + 2] < 0 ||
+ vte->csi_argv[i + 3] < 0 ||
+ vte->csi_argv[i + 4] < 0) {
+ llog_debug(vte, "invalid true color SGR");
+ break;
+ }
+ cr = vte->csi_argv[i + 2];
+ cg = vte->csi_argv[i + 3];
+ cb = vte->csi_argv[i + 4];
+ code = -1;
+ i += 4;
+ } else {
+ llog_debug(vte, "invalid SGR");
+ break;
+ }
+ if (val == 38) {
+ vte->cattr.fccode = code;
+ vte->cattr.fr = cr;
+ vte->cattr.fg = cg;
+ vte->cattr.fb = cb;
+ } else {
+ vte->cattr.bccode = code;
+ vte->cattr.br = cr;
+ vte->cattr.bg = cg;
+ vte->cattr.bb = cb;
}
- i += 2;
break;
default:
llog_debug(vte, "unhandled SGR attr %i",
|