forked from aniani/vim
patch 8.2.3727: in a gnome terminal keys are recognized as mouse events
Problem: In a gnome terminal keys are recognized as mouse events. Solution: Only recognize DEC mouse events when four numbers are following. (closes #9256)
This commit is contained in:
47
src/term.c
47
src/term.c
@@ -5412,6 +5412,8 @@ check_termcode(
|
|||||||
if (STRNCMP(termcodes[idx].code, tp,
|
if (STRNCMP(termcodes[idx].code, tp,
|
||||||
(size_t)(slen > len ? len : slen)) == 0)
|
(size_t)(slen > len ? len : slen)) == 0)
|
||||||
{
|
{
|
||||||
|
int looks_like_mouse_start = FALSE;
|
||||||
|
|
||||||
if (len < slen) // got a partial sequence
|
if (len < slen) // got a partial sequence
|
||||||
return -1; // need to get more chars
|
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
|
if (slen == 2 && len > 2
|
||||||
&& termcodes[idx].code[0] == ESC
|
&& termcodes[idx].code[0] == ESC
|
||||||
&& termcodes[idx].code[1] == '['
|
&& termcodes[idx].code[1] == '[')
|
||||||
&& !isdigit(tp[2]))
|
|
||||||
{
|
{
|
||||||
|
// 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)
|
if (mouse_index_found < 0)
|
||||||
mouse_index_found = idx;
|
mouse_index_found = idx;
|
||||||
}
|
}
|
||||||
|
@@ -2039,6 +2039,28 @@ func Test_modifyOtherKeys_no_mapping()
|
|||||||
set timeoutlen&
|
set timeoutlen&
|
||||||
endfunc
|
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)
|
func RunTest_mapping_shift(key, func)
|
||||||
call setline(1, '')
|
call setline(1, '')
|
||||||
if a:key == '|'
|
if a:key == '|'
|
||||||
|
@@ -753,6 +753,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
3727,
|
||||||
/**/
|
/**/
|
||||||
3726,
|
3726,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user