Allow sending arbitrary sized escpae codes to children

This commit is contained in:
Kovid Goyal 2018-01-07 17:29:08 +05:30
parent c64fd1760c
commit eff881f4bb
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -387,28 +387,29 @@ write_to_child(Screen *self, const char *data, size_t sz) {
void void
write_escape_code_to_child(Screen *self, unsigned char which, const char *data) { write_escape_code_to_child(Screen *self, unsigned char which, const char *data) {
static char buf[512]; const char *prefix, *suffix = self->modes.eight_bit_controls ? "\x9c" : "\033\\";
size_t sz;
switch(which) { switch(which) {
case DCS: case DCS:
sz = snprintf(buf, sizeof(buf) - 1, "%s%s%s", self->modes.eight_bit_controls ? "\x90" : "\033P", data, self->modes.eight_bit_controls ? "\x9c" : "\033\\"); prefix = self->modes.eight_bit_controls ? "\x90" : "\033P";
break; break;
case CSI: case CSI:
sz = snprintf(buf, sizeof(buf) - 1, "%s%s", self->modes.eight_bit_controls ? "\x9b" : "\033[", data); prefix = self->modes.eight_bit_controls ? "\x9b" : "\033["; suffix = "";
break; break;
case OSC: case OSC:
sz = snprintf(buf, sizeof(buf) - 1, "%s%s%s", self->modes.eight_bit_controls ? "\x9d" : "\033]", data, self->modes.eight_bit_controls ? "\x9c" : "\033\\"); prefix = self->modes.eight_bit_controls ? "\x9d" : "\033]";
break; break;
case PM: case PM:
sz = snprintf(buf, sizeof(buf) - 1, "%s%s%s", self->modes.eight_bit_controls ? "\x9e" : "\033^", data, self->modes.eight_bit_controls ? "\x9c" : "\033\\"); prefix = self->modes.eight_bit_controls ? "\x9e" : "\033^";
break; break;
case APC: case APC:
sz = snprintf(buf, sizeof(buf) - 1, "%s%s%s", self->modes.eight_bit_controls ? "\x9f" : "\033_", data, self->modes.eight_bit_controls ? "\x9c" : "\033\\"); prefix = self->modes.eight_bit_controls ? "\x9f" : "\033_";
break; break;
default: default:
fatal("Unknown escape code to write: %u", which); fatal("Unknown escape code to write: %u", which);
} }
write_to_child(self, buf, sz); write_to_child(self, prefix, strlen(prefix));
write_to_child(self, data, strlen(data));
if (suffix[0]) write_to_child(self, suffix, strlen(suffix));
} }
void void