diff options
Diffstat (limited to 'addon-true-color.patch')
-rw-r--r-- | addon-true-color.patch | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/addon-true-color.patch b/addon-true-color.patch new file mode 100644 index 000000000000..d172e6e319b8 --- /dev/null +++ b/addon-true-color.patch @@ -0,0 +1,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", |