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.
diff --git a/src/misc2.c b/src/misc2.c
index 41b9f71..649cb65 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -2929,9 +2929,11 @@
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;
}
diff --git a/src/term.c b/src/term.c
index c4ca33e..1556c2e 100644
--- a/src/term.c
+++ b/src/term.c
@@ -4772,11 +4772,14 @@
// 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
diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim
index 2188c2c..b6f718c 100644
--- a/src/testdir/test_popupwin.vim
+++ b/src/testdir/test_popupwin.vim
@@ -2079,9 +2079,9 @@
" 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 @@
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
diff --git a/src/version.c b/src/version.c
index 3ccf1dd..8b5ad4e 100644
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1015,
+/**/
1014,
/**/
1013,