Commit: patch 9.1.0788: <CSI>27;<mod>u is not decoded to literal Escape in kitty/foot

2 views
Skip to first unread message

Christian Brabandt

unread,
Oct 16, 2024, 11:45:18 AM10/16/24
to vim...@googlegroups.com
patch 9.1.0788: <CSI>27;<mod>u is not decoded to literal Escape in kitty/foot

Commit: https://github.com/vim/vim/commit/a2834e17d18a3e7211da6f792cc6d86dac5e8c3b
Author: Christian Fillion <con...@cfillion.ca>
Date: Wed Oct 16 17:28:38 2024 +0200

patch 9.1.0788: <CSI>27;<mod>u is not decoded to literal Escape in kitty/foot

Problem: <CSI>27;<mod>u is not decoded to literal Escape in kitty/foot
Solution: disable XTerm modifyOtherKeys form 1 when the kitty protocol is enabled
(Christian Fillion)

References:
- https://invisible-island.net/xterm/modified-keys.html
- https://sw.kovidgoyal.net/kitty/keyboard-protocol/
- https://codeberg.org/dnkl/foot/src/commit/e891abdd6a6652bd46b28c1988700a7f30931210/kitty-keymap.h
- https://github.com/kovidgoyal/kitty/blob/d31459b0926f2afddc317d76314e4afd0d07d473/kitty/key_encoding.c#L193

fixes: #15868
closes: #15881

Signed-off-by: Christian Fillion <con...@cfillion.ca>
Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/src/edit.c b/src/edit.c
index e1f30c7c2..f4c5edfc4 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -1625,7 +1625,8 @@ decodeModifyOtherKeys(int c)
if (typebuf.tb_len >= 4 && (c == CSI || (c == ESC && *p == '[')))
{
idx = (*p == '[');
- if (p[idx] == '2' && p[idx + 1] == '7' && p[idx + 2] == ';')
+ if (p[idx] == '2' && p[idx + 1] == '7' && p[idx + 2] == ';' &&
+ kitty_protocol_state != KKPS_ENABLED)
{
form = 1;
idx += 3;
@@ -1640,9 +1641,10 @@ decodeModifyOtherKeys(int c)
break;
++idx;
}
+ int kitty_no_mods = argidx == 0 && kitty_protocol_state == KKPS_ENABLED;
if (idx < typebuf.tb_len
&& p[idx] == (form == 1 ? '~' : 'u')
- && argidx == 1)
+ && (argidx == 1 || kitty_no_mods))
{
// Match, consume the code.
typebuf.tb_off += idx + 1;
@@ -1652,7 +1654,7 @@ decodeModifyOtherKeys(int c)
typebuf_was_filled = FALSE;
#endif

- mod_mask = decode_modifiers(arg[!form]);
+ mod_mask = kitty_no_mods ? 0 : decode_modifiers(arg[!form]);
c = merge_modifyOtherKeys(arg[form], &mod_mask);
}
}
diff --git a/src/testdir/test_termcodes.vim b/src/testdir/test_termcodes.vim
index 507753c21..2b44b1553 100644
--- a/src/testdir/test_termcodes.vim
+++ b/src/testdir/test_termcodes.vim
@@ -2001,6 +2001,12 @@ func Test_xx08_kitty_response()
\ kitty: 'y',
\ }, terminalprops())

+ call feedkeys("\<Esc>[?1u") " simulate the kitty keyboard protocol is enabled
+ call feedkeys(':' .. GetEscCodeCSIu('V', '5') .. GetEscCodeCSIuWithoutModifier("\<Esc>") .. "\<C-B>\"\<CR>", 'Lx!')
+ call assert_equal("\"\<Esc>", @:)
+ call feedkeys(':' .. GetEscCodeCSIu('V', '5') .. GetEscCodeCSIu("\<Esc>", '129') .. "\<C-B>\"\<CR>", 'Lx!')
+ call assert_equal("\"\<Esc>", @:)
+
set t_RV=
call test_override('term_props', 0)
endfunc
diff --git a/src/version.c b/src/version.c
index b8852e39b..b3cc9ce55 100644
--- a/src/version.c
+++ b/src/version.c
@@ -704,6 +704,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 788,
/**/
787,
/**/
Reply all
Reply to author
Forward
0 new messages