1
0
forked from aniani/vim

patch 8.2.2428: FocusGained does not work when 'ttymouse' is empty

Problem:    FocusGained does not work when 'ttymouse' is empty.
Solution:   Don't use the short mouse code if there is a longer matching code.
            (closes #7755)  Add a test.
This commit is contained in:
Bram Moolenaar
2021-01-30 15:39:47 +01:00
parent 3eb6bd9c2b
commit 92e5df8047
3 changed files with 57 additions and 5 deletions

View File

@@ -5339,6 +5339,8 @@ check_termcode(
else else
#endif // FEAT_GUI #endif // FEAT_GUI
{ {
int mouse_index_found = -1;
for (idx = 0; idx < tc_len; ++idx) for (idx = 0; idx < tc_len; ++idx)
{ {
/* /*
@@ -5376,9 +5378,24 @@ check_termcode(
} }
} }
key_name[0] = termcodes[idx].name[0]; // The mouse termcode "ESC [" is also the prefix of
key_name[1] = termcodes[idx].name[1]; // "ESC [ I" (focus gained). Only use it when there is
break; // 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]))
{
if (mouse_index_found < 0)
mouse_index_found = idx;
}
else
{
key_name[0] = termcodes[idx].name[0];
key_name[1] = termcodes[idx].name[1];
break;
}
} }
/* /*
@@ -5389,7 +5406,7 @@ check_termcode(
* When there is a modifier the * matches a number. * When there is a modifier the * matches a number.
* When there is no modifier the ;* or * is omitted. * When there is no modifier the ;* or * is omitted.
*/ */
if (termcodes[idx].modlen > 0) if (termcodes[idx].modlen > 0 && mouse_index_found < 0)
{ {
int at_code; int at_code;
@@ -5442,6 +5459,11 @@ check_termcode(
} }
} }
} }
if (idx == tc_len && mouse_index_found >= 0)
{
key_name[0] = termcodes[mouse_index_found].name[0];
key_name[1] = termcodes[mouse_index_found].name[1];
}
} }
#ifdef FEAT_TERMRESPONSE #ifdef FEAT_TERMRESPONSE

View File

@@ -1868,6 +1868,34 @@ func Test_xx07_xterm_response()
call test_override('term_props', 0) call test_override('term_props', 0)
endfunc endfunc
func Test_focus_events()
let save_term = &term
let save_ttymouse = &ttymouse
set term=xterm ttymouse=xterm2
au FocusGained * let g:focus_gained += 1
au FocusLost * let g:focus_lost += 1
let g:focus_gained = 0
let g:focus_lost = 0
call feedkeys("\<Esc>[O", "Lx!")
call assert_equal(1, g:focus_lost)
call feedkeys("\<Esc>[I", "Lx!")
call assert_equal(1, g:focus_gained)
" still works when 'ttymouse' is empty
set ttymouse=
call feedkeys("\<Esc>[O", "Lx!")
call assert_equal(2, g:focus_lost)
call feedkeys("\<Esc>[I", "Lx!")
call assert_equal(2, g:focus_gained)
au! FocusGained
au! FocusLost
let &term = save_term
let &ttymouse = save_ttymouse
endfunc
func Test_get_termcode() func Test_get_termcode()
try try
let k1 = &t_k1 let k1 = &t_k1
@@ -2261,7 +2289,7 @@ func Test_cmdline_literal()
endfunc endfunc
" Test for translation of special key codes (<xF1>, <xF2>, etc.) " Test for translation of special key codes (<xF1>, <xF2>, etc.)
func Test_Keycode_Tranlsation() func Test_Keycode_Translation()
let keycodes = [ let keycodes = [
\ ["<xUp>", "<Up>"], \ ["<xUp>", "<Up>"],
\ ["<xDown>", "<Down>"], \ ["<xDown>", "<Down>"],

View File

@@ -750,6 +750,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 */
/**/
2428,
/**/ /**/
2427, 2427,
/**/ /**/