diff options
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); +   | 
