summarylogtreecommitdiffstats
path: root/addon-true-color.patch
blob: d172e6e319b89de0ee11a750d7e011e4c73c7bf0 (plain)
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",