diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-12-03 13:20:29 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-12-03 13:20:29 +0000 |
commit | c14b57c0795671bafca14433bc376acfe6135a3a (patch) | |
tree | b3ae6ef9955b0707f6c159623bc15f72cc22011f | |
parent | c903695be54189fd7199121e9cd669e722fbc9c2 (diff) | |
download | vim-git-c14b57c0795671bafca14433bc376acfe6135a3a.tar.gz |
patch 8.2.3727: in a gnome terminal keys are recognized as mouse eventsv8.2.3727
Problem: In a gnome terminal keys are recognized as mouse events.
Solution: Only recognize DEC mouse events when four numbers are following.
(closes #9256)
-rw-r--r-- | src/term.c | 47 | ||||
-rw-r--r-- | src/testdir/test_termcodes.vim | 22 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 65 insertions, 6 deletions
diff --git a/src/term.c b/src/term.c index eb4dffaac..c20da0c33 100644 --- a/src/term.c +++ b/src/term.c @@ -5412,6 +5412,8 @@ check_termcode( if (STRNCMP(termcodes[idx].code, tp, (size_t)(slen > len ? len : slen)) == 0) { + int looks_like_mouse_start = FALSE; + if (len < slen) // got a partial sequence return -1; // need to get more chars @@ -5434,15 +5436,48 @@ check_termcode( } } - // The mouse termcode "ESC [" is also the prefix of - // "ESC [ I" (focus gained). Only use it when there is - // no other match. Do use it when a digit is following to - // avoid waiting for more bytes. if (slen == 2 && len > 2 && termcodes[idx].code[0] == ESC - && termcodes[idx].code[1] == '[' - && !isdigit(tp[2])) + && termcodes[idx].code[1] == '[') + { + // The mouse termcode "ESC [" is also the prefix of + // "ESC [ I" (focus gained) and other keys. Check some + // more bytes to find out. + if (!isdigit(tp[2])) + { + // ESC [ without number following: Only use it when + // there is no other match. + looks_like_mouse_start = TRUE; + } + else if (termcodes[idx].name[0] == KS_DEC_MOUSE) + { + char_u *nr = tp + 2; + int count = 0; + + // If a digit is following it could be a key with + // modifier, e.g., ESC [ 1;2P. Can be confused + // with DEC_MOUSE, which requires four numbers + // following. If not then it can't be a DEC_MOUSE + // code. + for (;;) + { + ++count; + (void)getdigits(&nr); + if (nr >= tp + len) + return -1; // partial sequence + if (*nr != ';') + break; + ++nr; + if (nr >= tp + len) + return -1; // partial sequence + } + if (count < 4) + continue; // no match + } + } + if (looks_like_mouse_start) { + // Only use it when there is no other match. if (mouse_index_found < 0) mouse_index_found = idx; } diff --git a/src/testdir/test_termcodes.vim b/src/testdir/test_termcodes.vim index ba0258457..887093c80 100644 --- a/src/testdir/test_termcodes.vim +++ b/src/testdir/test_termcodes.vim @@ -2039,6 +2039,28 @@ func Test_modifyOtherKeys_no_mapping() set timeoutlen& endfunc +" Check that when DEC mouse codes are recognized a special key is handled. +func Test_ignore_dec_mouse() + + new + let save_mouse = &mouse + let save_term = &term + let save_ttymouse = &ttymouse + call test_override('no_query_mouse', 1) + set mouse=a term=gnome ttymouse= + + execute "set <xF1>=\<Esc>[1;*P" + nnoremap <S-F1> agot it<Esc> + call feedkeys("\<Esc>[1;2P", 'Lx!') + call assert_equal('got it', getline(1)) + + let &mouse = save_mouse + let &term = save_term + let &ttymouse = save_ttymouse + call test_override('no_query_mouse', 0) + bwipe! +endfunc + func RunTest_mapping_shift(key, func) call setline(1, '') if a:key == '|' diff --git a/src/version.c b/src/version.c index 942393992..184b3772a 100644 --- a/src/version.c +++ b/src/version.c @@ -754,6 +754,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3727, +/**/ 3726, /**/ 3725, |