changeset 30641:1207b6d6cf9e v9.0.0655

patch 9.0.0655: passing modifier codes to a shell running in the GUI Commit: https://github.com/vim/vim/commit/2f7e1b8b40dbc97752b8b816560f752f16e0207a Author: Bram Moolenaar <Bram@vim.org> Date: Tue Oct 4 13:17:31 2022 +0100 patch 9.0.0655: passing modifier codes to a shell running in the GUI Problem: passing modifier codes to a shell running in the GUI. (Gary Johnson) Solution: Include modifier codes into the key and drop the modifiers.
author Bram Moolenaar <Bram@vim.org>
date Tue, 04 Oct 2022 14:30:05 +0200
parents 37f2c54fd5fe
children 9f3422ba87ca
files src/os_unix.c src/os_win32.c src/proto/term.pro src/term.c src/version.c
diffstat 5 files changed, 23 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -5106,7 +5106,8 @@ mch_call_shell_fork(
 			    }
 			}
 
-			len = term_replace_bs_del_keycode(ta_buf, ta_len, len);
+			// Remove Vim-specific codes from the input.
+			len = term_replace_keycodes(ta_buf, ta_len, len);
 
 			/*
 			 * For pipes: echo the typed characters.
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -4531,7 +4531,7 @@ mch_system_piped(char *cmd, int options)
 			}
 		    }
 
-		    len = term_replace_bs_del_keycode(ta_buf, ta_len, len);
+		    len = term_replace_keycodes(ta_buf, ta_len, len);
 
 		    /*
 		     * For pipes: echo the typed characters.  For a pty this
--- a/src/proto/term.pro
+++ b/src/proto/term.pro
@@ -86,5 +86,5 @@ void update_tcap(int attr);
 void swap_tcap(void);
 void ansi_color2rgb(int nr, char_u *r, char_u *g, char_u *b, char_u *ansi_idx);
 void cterm_color2rgb(int nr, char_u *r, char_u *g, char_u *b, char_u *ansi_idx);
-int term_replace_bs_del_keycode(char_u *ta_buf, int ta_len, int len_arg);
+int term_replace_keycodes(char_u *ta_buf, int ta_len, int len_arg);
 /* vim: set ft=c : */
--- a/src/term.c
+++ b/src/term.c
@@ -6734,10 +6734,11 @@ cterm_color2rgb(int nr, char_u *r, char_
 
 /*
  * Replace K_BS by <BS> and K_DEL by <DEL>.
+ * Include any modifiers into the key and drop them.
  * Returns "len" adjusted for replaced codes.
  */
     int
-term_replace_bs_del_keycode(char_u *ta_buf, int ta_len, int len_arg)
+term_replace_keycodes(char_u *ta_buf, int ta_len, int len_arg)
 {
     int		len = len_arg;
     int		i;
@@ -6745,13 +6746,26 @@ term_replace_bs_del_keycode(char_u *ta_b
 
     for (i = ta_len; i < ta_len + len; ++i)
     {
-	if (ta_buf[i] == CSI && len - i > 2)
+	if (ta_buf[i] == CSI && len - i > 3 && ta_buf[i + 1] == KS_MODIFIER)
+	{
+	    int modifiers = ta_buf[i + 2];
+	    int key = ta_buf[i + 3];
+
+	    // Try to use the modifier to modify the key.  In any case drop the
+	    // modifier.
+	    mch_memmove(ta_buf + i + 1, ta_buf + i + 4, (size_t)(len - i - 3));
+	    len -= 3;
+	    if (key < 0x80)
+		key = merge_modifyOtherKeys(key, &modifiers);
+	    ta_buf[i] = key;
+	}
+	else if (ta_buf[i] == CSI && len - i > 2)
 	{
 	    c = TERMCAP2KEY(ta_buf[i + 1], ta_buf[i + 2]);
 	    if (c == K_DEL || c == K_KDEL || c == K_BS)
 	    {
 		mch_memmove(ta_buf + i + 1, ta_buf + i + 3,
-			(size_t)(len - i - 2));
+							(size_t)(len - i - 2));
 		if (c == K_DEL || c == K_KDEL)
 		    ta_buf[i] = DEL;
 		else
--- a/src/version.c
+++ b/src/version.c
@@ -700,6 +700,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    655,
+/**/
     654,
 /**/
     653,