changeset 20927:9328feafbbf5 v8.2.1015

patch 8.2.1015: popup filter gets key with modifier prepended Commit: https://github.com/vim/vim/commit/20298ce679dbf21c07c8fe2161724a12424f1e69 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Jun 19 21:46:52 2020 +0200 patch 8.2.1015: popup filter gets key with modifier prepended Problem: Popup filter gets key with modifier prepended when using modifyOtherKeys. Solution: Remove the shift modifier when it is included in the key, also when the Alt or Meta modifier is used.
author Bram Moolenaar <Bram@vim.org>
date Fri, 19 Jun 2020 22:00:04 +0200
parents 6ef0f635ce16
children 75950e88ec4f
files src/misc2.c src/term.c src/testdir/test_popupwin.vim src/version.c
diffstat 4 files changed, 19 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -2929,9 +2929,11 @@ extract_modifiers(int key, int *modp, in
     if ((modifiers & MOD_MASK_SHIFT) && ASCII_ISALPHA(key))
     {
 	key = TOUPPER_ASC(key);
-	// With <C-S-a> and <A-S-a> we keep the shift modifier.
-	// With <S-a> and <S-A> we don't keep the shift modifier.
-	if (simplify || modifiers == MOD_MASK_SHIFT)
+	// With <C-S-a> we keep the shift modifier.
+	// With <S-a>, <A-S-a> and <S-A> we don't keep the shift modifier.
+	if (simplify || modifiers == MOD_MASK_SHIFT
+		|| modifiers == (MOD_MASK_SHIFT | MOD_MASK_ALT)
+		|| modifiers == (MOD_MASK_SHIFT | MOD_MASK_META))
 	    modifiers &= ~MOD_MASK_SHIFT;
     }
 
--- a/src/term.c
+++ b/src/term.c
@@ -4772,11 +4772,14 @@ handle_key_with_modifier(
     // Some keys already have Shift included, pass them as
     // normal keys.  Not when Ctrl is also used, because <C-H>
     // and <C-S-H> are different.
-    if (modifiers == MOD_MASK_SHIFT
+    // Also for <A-S-a> and <M-S-a>.
+    if ((modifiers == MOD_MASK_SHIFT
+		|| modifiers == (MOD_MASK_SHIFT | MOD_MASK_ALT)
+		|| modifiers == (MOD_MASK_SHIFT | MOD_MASK_META))
 	    && ((key >= '@' && key <= 'Z')
 		|| key == '^' || key == '_'
 		|| (key >= '{' && key <= '~')))
-	modifiers = 0;
+	modifiers &= ~MOD_MASK_SHIFT;
 
     // When used with Ctrl we always make a letter upper case,
     // so that mapping <C-H> and <C-h> are the same.  Typing
--- a/src/testdir/test_popupwin.vim
+++ b/src/testdir/test_popupwin.vim
@@ -2079,9 +2079,9 @@ func Test_popup_scrollbar()
   " check size with wrapping lines
   call term_sendkeys(buf, "j")
   call VerifyScreenDump(buf, 'Test_popupwin_scroll_12', {})
-  call term_sendkeys(buf, "x")
 
   " clean up
+  call term_sendkeys(buf, "x")
   call StopVimInTerminal(buf)
   call delete('XtestPopupScroll')
 endfunc
@@ -3347,6 +3347,12 @@ func Test_popupwin_filter_input_multibyt
   call feedkeys("\u301b", 'xt')
   call assert_equal([0xe3, 0x80, 0x9b], g:bytes)
 
+  if has('unix')
+    " with modifyOtherKeys <M-S-a> does not include a modifier sequence
+    call feedkeys("\<Esc>[27;4;65~", 'Lx!')
+    call assert_equal([0xc3, 0x81], g:bytes)
+  endif
+
   call popup_clear()
   delfunc MyPopupFilter
   unlet g:bytes
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1015,
+/**/
     1014,
 /**/
     1013,