diff options
author | Thiago de Arruda <tpadilha84@gmail.com> | 2015-02-18 13:16:30 -0300 |
---|---|---|
committer | Thiago de Arruda <tpadilha84@gmail.com> | 2015-02-18 13:16:30 -0300 |
commit | e7c945ab597aff7af2611ca9bffa4a11e18c0a87 (patch) | |
tree | 45e87e5fb1755ce2cdbc5a47e85c43fd40704395 /src | |
parent | 25ceadab37edba13f5afa78d8b4723da03ef35f0 (diff) | |
download | rneovim-e7c945ab597aff7af2611ca9bffa4a11e18c0a87.tar.gz rneovim-e7c945ab597aff7af2611ca9bffa4a11e18c0a87.tar.bz2 rneovim-e7c945ab597aff7af2611ca9bffa4a11e18c0a87.zip |
input: Escape utf8 sequences that contain CSI/K_SPECIAL
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/os/input.c | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/src/nvim/os/input.c b/src/nvim/os/input.c index 2c2b0fc871..00efa28161 100644 --- a/src/nvim/os/input.c +++ b/src/nvim/os/input.c @@ -148,22 +148,34 @@ size_t input_enqueue(String keys) uint8_t buf[6] = {0}; unsigned int new_size = trans_special((uint8_t **)&ptr, buf, true); - if (!new_size) { - if (*ptr == '<') { - // Invalid key sequence, skip until the next '>' or until *end - do { - ptr++; - } while (ptr < end && *ptr != '>'); + if (new_size) { + new_size = handle_mouse_event(&ptr, buf, new_size); + rbuffer_write(input_buffer, (char *)buf, new_size); + continue; + } + + if (*ptr == '<') { + // Invalid key sequence, skip until the next '>' or until *end + do { ptr++; - continue; - } - // copy the character unmodified - *buf = (uint8_t)*ptr++; - new_size = 1; + } while (ptr < end && *ptr != '>'); + ptr++; + continue; } - new_size = handle_mouse_event(&ptr, buf, new_size); - rbuffer_write(input_buffer, (char *)buf, new_size); + // copy the character, escaping CSI and K_SPECIAL + if ((uint8_t)*ptr == CSI) { + rbuffer_write(input_buffer, (char *)&(uint8_t){K_SPECIAL}, 1); + rbuffer_write(input_buffer, (char *)&(uint8_t){KS_EXTRA}, 1); + rbuffer_write(input_buffer, (char *)&(uint8_t){KE_CSI}, 1); + } else if ((uint8_t)*ptr == K_SPECIAL) { + rbuffer_write(input_buffer, (char *)&(uint8_t){K_SPECIAL}, 1); + rbuffer_write(input_buffer, (char *)&(uint8_t){KS_SPECIAL}, 1); + rbuffer_write(input_buffer, (char *)&(uint8_t){KE_FILLER}, 1); + } else { + rbuffer_write(input_buffer, ptr, 1); + } + ptr++; } size_t rv = (size_t)(ptr - keys.data); |