aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorb-r-o-c-k <brockmammen@gmail.com>2018-05-18 15:08:10 -0500
committerJustin M. Keyes <justinkz@gmail.com>2018-06-03 22:31:02 +0200
commita80f73f04317a161306d503a605bca2c1a7f73a0 (patch)
treeaebb7ea980c25346a9a959c4db885df6f3da3ed4
parent90f9f8af6ccd9621f57c3a73857529835be6af14 (diff)
downloadrneovim-a80f73f04317a161306d503a605bca2c1a7f73a0.tar.gz
rneovim-a80f73f04317a161306d503a605bca2c1a7f73a0.tar.bz2
rneovim-a80f73f04317a161306d503a605bca2c1a7f73a0.zip
deps: Fix libvterm and libtermkey escape sequences for MSVC
The escape sequence `\e` is non-standard and not supported by MSVC. It caused the terminal emulator to incorrectly interpret certain keys.
-rw-r--r--third-party/cmake/BuildLibtermkey.cmake1
-rw-r--r--third-party/cmake/BuildLibvterm.cmake3
-rw-r--r--third-party/patches/libtermkey-Fix-escape-sequences-for-MSVC.patch189
-rw-r--r--third-party/patches/libvterm-Fix-escape-sequences-for-MSVC.patch53
4 files changed, 245 insertions, 1 deletions
diff --git a/third-party/cmake/BuildLibtermkey.cmake b/third-party/cmake/BuildLibtermkey.cmake
index 8147c47e1e..0b56674ad2 100644
--- a/third-party/cmake/BuildLibtermkey.cmake
+++ b/third-party/cmake/BuildLibtermkey.cmake
@@ -14,6 +14,7 @@ ExternalProject_Add(libtermkey
PATCH_COMMAND ${GIT_EXECUTABLE} -C ${DEPS_BUILD_DIR}/src/libtermkey init
COMMAND ${GIT_EXECUTABLE} -C ${DEPS_BUILD_DIR}/src/libtermkey apply --ignore-whitespace
${CMAKE_CURRENT_SOURCE_DIR}/patches/libtermkey-Add-support-for-Windows.patch
+ ${CMAKE_CURRENT_SOURCE_DIR}/patches/libtermkey-Fix-escape-sequences-for-MSVC.patch
CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_CURRENT_SOURCE_DIR}/cmake/libtermkeyCMakeLists.txt
${DEPS_BUILD_DIR}/src/libtermkey/CMakeLists.txt
diff --git a/third-party/cmake/BuildLibvterm.cmake b/third-party/cmake/BuildLibvterm.cmake
index e4649986af..4720581e52 100644
--- a/third-party/cmake/BuildLibvterm.cmake
+++ b/third-party/cmake/BuildLibvterm.cmake
@@ -39,7 +39,8 @@ if(WIN32)
set(LIBVTERM_PATCH_COMMAND
${GIT_EXECUTABLE} -C ${DEPS_BUILD_DIR}/src/libvterm init
COMMAND ${GIT_EXECUTABLE} -C ${DEPS_BUILD_DIR}/src/libvterm apply --ignore-whitespace
- ${CMAKE_CURRENT_SOURCE_DIR}/patches/libvterm-Remove-VLAs-for-MSVC.patch)
+ ${CMAKE_CURRENT_SOURCE_DIR}/patches/libvterm-Remove-VLAs-for-MSVC.patch
+ ${CMAKE_CURRENT_SOURCE_DIR}/patches/libvterm-Fix-escape-sequences-for-MSVC.patch)
endif()
set(LIBVTERM_CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_CURRENT_SOURCE_DIR}/cmake/LibvtermCMakeLists.txt
diff --git a/third-party/patches/libtermkey-Fix-escape-sequences-for-MSVC.patch b/third-party/patches/libtermkey-Fix-escape-sequences-for-MSVC.patch
new file mode 100644
index 0000000000..c1099bd3c4
--- /dev/null
+++ b/third-party/patches/libtermkey-Fix-escape-sequences-for-MSVC.patch
@@ -0,0 +1,189 @@
+diff --git a/t/30mouse.c b/t/30mouse.c
+--- a/t/30mouse.c
++++ b/t/30mouse.c
+@@ -14,7 +14,7 @@ int main(int argc, char *argv[])
+
+ tk = termkey_new_abstract("vt100", 0);
+
+- termkey_push_bytes(tk, "\e[M !!", 6);
++ termkey_push_bytes(tk, "\x1b[M !!", 6);
+
+ key.type = -1;
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for mouse press");
+@@ -38,7 +38,7 @@ int main(int argc, char *argv[])
+ is_int(len, 21, "string length for press");
+ is_str(buffer, "MousePress(1) @ (1,1)", "string buffer for press");
+
+- termkey_push_bytes(tk, "\e[M@\"!", 6);
++ termkey_push_bytes(tk, "\x1b[M@\"!", 6);
+
+ key.type = -1;
+ ev = -1; button = -1; line = -1; col = -1;
+@@ -51,7 +51,7 @@ int main(int argc, char *argv[])
+ is_int(col, 2, "mouse column for drag");
+ is_int(key.modifiers, 0, "modifiers for press");
+
+- termkey_push_bytes(tk, "\e[M##!", 6);
++ termkey_push_bytes(tk, "\x1b[M##!", 6);
+
+ key.type = -1;
+ ev = -1; button = -1; line = -1; col = -1;
+@@ -63,7 +63,7 @@ int main(int argc, char *argv[])
+ is_int(col, 3, "mouse column for release");
+ is_int(key.modifiers, 0, "modifiers for press");
+
+- termkey_push_bytes(tk, "\e[M0++", 6);
++ termkey_push_bytes(tk, "\x1b[M0++", 6);
+
+ key.type = -1;
+ ev = -1; button = -1; line = -1; col = -1;
+@@ -81,7 +81,7 @@ int main(int argc, char *argv[])
+ is_str(buffer, "C-MousePress(1)", "string buffer for Ctrl-press");
+
+ // rxvt protocol
+- termkey_push_bytes(tk, "\e[0;20;20M", 10);
++ termkey_push_bytes(tk, "\x1b[0;20;20M", 10);
+
+ key.type = -1;
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for mouse press rxvt protocol");
+@@ -96,7 +96,7 @@ int main(int argc, char *argv[])
+ is_int(col, 20, "mouse column for press rxvt protocol");
+ is_int(key.modifiers, 0, "modifiers for press rxvt protocol");
+
+- termkey_push_bytes(tk, "\e[3;20;20M", 10);
++ termkey_push_bytes(tk, "\x1b[3;20;20M", 10);
+
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for mouse release rxvt protocol");
+
+@@ -111,7 +111,7 @@ int main(int argc, char *argv[])
+ is_int(key.modifiers, 0, "modifiers for release rxvt protocol");
+
+ // SGR protocol
+- termkey_push_bytes(tk, "\e[<0;30;30M", 11);
++ termkey_push_bytes(tk, "\x1b[<0;30;30M", 11);
+
+ key.type = -1;
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for mouse press SGR encoding");
+@@ -127,7 +127,7 @@ int main(int argc, char *argv[])
+ is_int(col, 30, "mouse column for press SGR");
+ is_int(key.modifiers, 0, "modifiers for press SGR");
+
+- termkey_push_bytes(tk, "\e[<0;30;30m", 11);
++ termkey_push_bytes(tk, "\x1b[<0;30;30m", 11);
+
+ key.type = -1;
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for mouse release SGR encoding");
+@@ -139,7 +139,7 @@ int main(int argc, char *argv[])
+
+ is_int(ev, TERMKEY_MOUSE_RELEASE, "mouse event for release SGR");
+
+- termkey_push_bytes(tk, "\e[<0;500;300M", 13);
++ termkey_push_bytes(tk, "\x1b[<0;500;300M", 13);
+
+ key.type = -1;
+ ev = -1; button = -1; line = -1; col = -1;
+diff --git a/t/31position.c b/t/31position.c
+index 1748211..86ad1bc 100644
+--- a/t/31position.c
++++ b/t/31position.c
+@@ -11,7 +11,7 @@ int main(int argc, char *argv[])
+
+ tk = termkey_new_abstract("vt100", 0);
+
+- termkey_push_bytes(tk, "\e[?15;7R", 8);
++ termkey_push_bytes(tk, "\x1b[?15;7R", 8);
+
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for position report");
+
+@@ -25,7 +25,7 @@ int main(int argc, char *argv[])
+ /* A plain CSI R is likely to be <F3> though.
+ * This is tricky :/
+ */
+- termkey_push_bytes(tk, "\e[R", 3);
++ termkey_push_bytes(tk, "\x1b[R", 3);
+
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for <F3>");
+
+diff --git a/t/32modereport.c b/t/32modereport.c
+index 31de400..5e49705 100644
+--- a/t/32modereport.c
++++ b/t/32modereport.c
+@@ -11,7 +11,7 @@ int main(int argc, char *argv[])
+
+ tk = termkey_new_abstract("vt100", 0);
+
+- termkey_push_bytes(tk, "\e[?1;2$y", 8);
++ termkey_push_bytes(tk, "\x1b[?1;2$y", 8);
+
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for mode report");
+
+@@ -23,7 +23,7 @@ int main(int argc, char *argv[])
+ is_int(mode, 1, "mode number from mode report");
+ is_int(value, 2, "mode value from mode report");
+
+- termkey_push_bytes(tk, "\e[4;1$y", 7);
++ termkey_push_bytes(tk, "\x1b[4;1$y", 7);
+
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for mode report");
+
+diff --git a/t/38csi.c b/t/38csi.c
+index 9d186f6..fd592d5 100644
+--- a/t/38csi.c
++++ b/t/38csi.c
+@@ -13,7 +13,7 @@ int main(int argc, char *argv[])
+
+ tk = termkey_new_abstract("vt100", 0);
+
+- termkey_push_bytes(tk, "\e[5;25v", 7);
++ termkey_push_bytes(tk, "\x1b[5;25v", 7);
+
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for CSI v");
+
+@@ -26,14 +26,14 @@ int main(int argc, char *argv[])
+ is_int(args[1], 25, "args[1] for unknown CSI");
+ is_int(command, 'v', "command for unknown CSI");
+
+- termkey_push_bytes(tk, "\e[?w", 4);
++ termkey_push_bytes(tk, "\x1b[?w", 4);
+
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for CSI ? w");
+ is_int(key.type, TERMKEY_TYPE_UNKNOWN_CSI, "key.type for unknown CSI");
+ is_int(termkey_interpret_csi(tk, &key, args, &nargs, &command), TERMKEY_RES_KEY, "interpret_csi yields RES_KEY");
+ is_int(command, '?'<<8 | 'w', "command for unknown CSI");
+
+- termkey_push_bytes(tk, "\e[?$x", 5);
++ termkey_push_bytes(tk, "\x1b[?$x", 5);
+
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for CSI ? $x");
+ is_int(key.type, TERMKEY_TYPE_UNKNOWN_CSI, "key.type for unknown CSI");
+diff --git a/t/39dcs.c b/t/39dcs.c
+index c517411..f065477 100644
+--- a/t/39dcs.c
++++ b/t/39dcs.c
+@@ -12,7 +12,7 @@ int main(int argc, char *argv[])
+ tk = termkey_new_abstract("xterm", 0);
+
+ // 7bit DCS
+- termkey_push_bytes(tk, "\eP1$r1 q\e\\", 10);
++ termkey_push_bytes(tk, "\x1bP1$r1 q\x1b\\", 10);
+
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for DCS");
+
+@@ -38,7 +38,7 @@ int main(int argc, char *argv[])
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_NONE, "getkey again yields RES_NONE");
+
+ // 7bit OSC
+- termkey_push_bytes(tk, "\e]15;abc\e\\", 10);
++ termkey_push_bytes(tk, "\x1b]15;abc\x1b\\", 10);
+
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for OSC");
+
+@@ -51,7 +51,7 @@ int main(int argc, char *argv[])
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_NONE, "getkey again yields RES_NONE");
+
+ // False alarm
+- termkey_push_bytes(tk, "\eP", 2);
++ termkey_push_bytes(tk, "\x1bP", 2);
+
+ is_int(termkey_getkey(tk, &key), TERMKEY_RES_AGAIN, "getkey yields RES_AGAIN for false alarm");
+
diff --git a/third-party/patches/libvterm-Fix-escape-sequences-for-MSVC.patch b/third-party/patches/libvterm-Fix-escape-sequences-for-MSVC.patch
new file mode 100644
index 0000000000..b2f0809544
--- /dev/null
+++ b/third-party/patches/libvterm-Fix-escape-sequences-for-MSVC.patch
@@ -0,0 +1,53 @@
+diff --git a/src/keyboard.c b/src/keyboard.c
+index bc1299b..5f368f4 100644
+--- a/src/keyboard.c
++++ b/src/keyboard.c
+@@ -48,7 +48,7 @@ void vterm_keyboard_unichar(VTerm *vt, uint32_t c, VTermModifier mod)
+ if(mod & VTERM_MOD_CTRL)
+ c &= 0x1f;
+
+- vterm_push_output_sprintf(vt, "%s%c", mod & VTERM_MOD_ALT ? "\e" : "", c);
++ vterm_push_output_sprintf(vt, "%s%c", mod & VTERM_MOD_ALT ? "\x1b" : "", c);
+ }
+
+ typedef struct {
+@@ -73,7 +73,7 @@ static keycodes_s keycodes[] = {
+ { KEYCODE_ENTER, '\r' }, // ENTER
+ { KEYCODE_TAB, '\t' }, // TAB
+ { KEYCODE_LITERAL, '\x7f' }, // BACKSPACE == ASCII DEL
+- { KEYCODE_LITERAL, '\e' }, // ESCAPE
++ { KEYCODE_LITERAL, '\x1b' }, // ESCAPE
+
+ { KEYCODE_CSI_CURSOR, 'A' }, // UP
+ { KEYCODE_CSI_CURSOR, 'B' }, // DOWN
+@@ -173,7 +173,7 @@ void vterm_keyboard_key(VTerm *vt, VTermKey key, VTermModifier mod)
+ if(mod & (VTERM_MOD_SHIFT|VTERM_MOD_CTRL))
+ vterm_push_output_sprintf_ctrl(vt, C1_CSI, "%d;%du", k.literal, mod+1);
+ else
+- vterm_push_output_sprintf(vt, mod & VTERM_MOD_ALT ? "\e%c" : "%c", k.literal);
++ vterm_push_output_sprintf(vt, mod & VTERM_MOD_ALT ? "\x1b%c" : "%c", k.literal);
+ break;
+
+ case KEYCODE_SS3: case_SS3:
+diff --git a/src/vterm.c b/src/vterm.c
+index 826df93..262b3fc 100644
+--- a/src/vterm.c
++++ b/src/vterm.c
+@@ -158,7 +158,7 @@ INTERNAL void vterm_push_output_sprintf_ctrl(VTerm *vt, unsigned char ctrl, cons
+ size_t orig_cur = vt->outbuffer_cur;
+
+ if(ctrl >= 0x80 && !vt->mode.ctrl8bit)
+- vterm_push_output_sprintf(vt, "\e%c", ctrl - 0x40);
++ vterm_push_output_sprintf(vt, "\x1b%c", ctrl - 0x40);
+ else
+ vterm_push_output_sprintf(vt, "%c", ctrl);
+
+@@ -176,7 +176,7 @@ INTERNAL void vterm_push_output_sprintf_dcs(VTerm *vt, const char *fmt, ...)
+ size_t orig_cur = vt->outbuffer_cur;
+
+ if(!vt->mode.ctrl8bit)
+- vterm_push_output_sprintf(vt, "\e%c", C1_DCS - 0x40);
++ vterm_push_output_sprintf(vt, "\x1b%c", C1_DCS - 0x40);
+ else
+ vterm_push_output_sprintf(vt, "%c", C1_DCS);
+