changeset 23774:646ca2893d85 v8.2.2428

patch 8.2.2428: FocusGained does not work when 'ttymouse' is empty Commit: https://github.com/vim/vim/commit/92e5df804719d2e6cb8145c2b098aa8d6f3dd252 Author: Bram Moolenaar <Bram@vim.org> 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.
author Bram Moolenaar <Bram@vim.org>
date Sat, 30 Jan 2021 15:45:06 +0100
parents 6421ad10789a
children 86461330648b
files src/term.c src/testdir/test_termcodes.vim src/version.c
diffstat 3 files changed, 57 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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("\<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()
   try
     let k1 = &t_k1
@@ -2261,7 +2289,7 @@ func Test_cmdline_literal()
 endfunc
 
 " Test for translation of special key codes (<xF1>, <xF2>, etc.)
-func Test_Keycode_Tranlsation()
+func Test_Keycode_Translation()
   let keycodes = [
         \ ["<xUp>", "<Up>"],
         \ ["<xDown>", "<Down>"],
--- 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,