# HG changeset patch # User Bram Moolenaar # Date 1612017906 -3600 # Node ID 646ca2893d857e938a365ccd3965c0564f975c00 # Parent 6421ad10789a33970b0ad06d2f171afcc10050ac patch 8.2.2428: FocusGained does not work when 'ttymouse' is empty Commit: https://github.com/vim/vim/commit/92e5df804719d2e6cb8145c2b098aa8d6f3dd252 Author: Bram Moolenaar Date: Sat Jan 30 15:39:47 2021 +0100 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. diff --git a/src/term.c b/src/term.c --- a/src/term.c +++ b/src/term.c @@ -5339,6 +5339,8 @@ check_termcode( else #endif // FEAT_GUI { + int mouse_index_found = -1; + for (idx = 0; idx < tc_len; ++idx) { /* @@ -5376,9 +5378,24 @@ check_termcode( } } - key_name[0] = termcodes[idx].name[0]; - key_name[1] = termcodes[idx].name[1]; - break; + // 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])) + { + 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 no modifier the ;* or * is omitted. */ - if (termcodes[idx].modlen > 0) + if (termcodes[idx].modlen > 0 && mouse_index_found < 0) { 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 diff --git a/src/testdir/test_termcodes.vim b/src/testdir/test_termcodes.vim --- a/src/testdir/test_termcodes.vim +++ b/src/testdir/test_termcodes.vim @@ -1868,6 +1868,34 @@ func Test_xx07_xterm_response() call test_override('term_props', 0) 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("\[O", "Lx!") + call assert_equal(1, g:focus_lost) + call feedkeys("\[I", "Lx!") + call assert_equal(1, g:focus_gained) + + " still works when 'ttymouse' is empty + set ttymouse= + call feedkeys("\[O", "Lx!") + call assert_equal(2, g:focus_lost) + call feedkeys("\[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() try let k1 = &t_k1 @@ -2261,7 +2289,7 @@ func Test_cmdline_literal() endfunc " Test for translation of special key codes (, , etc.) -func Test_Keycode_Tranlsation() +func Test_Keycode_Translation() let keycodes = [ \ ["", ""], \ ["", ""], diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2428, +/**/ 2427, /**/ 2426,