summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-06-19 21:46:52 +0200
committerBram Moolenaar <Bram@vim.org>2020-06-19 21:46:52 +0200
commit20298ce679dbf21c07c8fe2161724a12424f1e69 (patch)
treed14bbcf9f30749d23b71ea0273963c51c34a99e9
parent1e0b7b11db61bd906266d3174fee0bbaf20a101f (diff)
patch 8.2.1015: popup filter gets key with modifier prependedv8.2.1015
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.
-rw-r--r--src/misc2.c8
-rw-r--r--src/term.c7
-rw-r--r--src/testdir/test_popupwin.vim8
-rw-r--r--src/version.c2
4 files changed, 19 insertions, 6 deletions
diff --git a/src/misc2.c b/src/misc2.c
index 41b9f711e7..649cb65c9b 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -2929,9 +2929,11 @@ extract_modifiers(int key, int *modp, int simplify, int *did_simplify)
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 c4ca33e32d..1556c2eecc 100644
--- 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
diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim
index 2188c2c6a9..b6f718c842 100644
--- 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_multibyte()
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 3ccf1dd094..8b5ad4e483 100644
--- 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,