]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.1957: termcap options should change when setting keyprotocol v9.0.1957
authorGregory Anders <greg@gpanders.com>
Fri, 29 Sep 2023 18:17:20 +0000 (20:17 +0200)
committerChristian Brabandt <cb@256bit.org>
Fri, 29 Sep 2023 18:17:20 +0000 (20:17 +0200)
Problem:  termcap options should change on keyprotocol setting
Solution: Apply termcap entries when 'keyprotocol' changes

When the 'keyprotocol' option was set after startup (including in a
user's .vimrc) the termcap entries associated with the matching protocol
were not applied. Thus, setting the option has no affect.

When 'keyprotocol' is changed it should also update the termcap entries.

closes: #13211

Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: Gregory Anders <greg@gpanders.com>
src/optionstr.c
src/proto/term.pro
src/term.c
src/testdir/test_options.vim
src/version.c

index 5fceb85737b0ca483a4bc631bf86e8023789d0b1..9b4464d85c41f8ec4dc65541481c7bbf3ae857ad 100644 (file)
@@ -1945,9 +1945,13 @@ did_set_keymodel(optset_T *args UNUSED)
     char *
 did_set_keyprotocol(optset_T *args UNUSED)
 {
-    if (match_keyprotocol(NULL) == KEYPROTOCOL_FAIL)
+    char_u *term = T_NAME;
+    keyprot_T kpc = match_keyprotocol(term);
+    if (kpc == KEYPROTOCOL_FAIL)
        return e_invalid_argument;
 
+    apply_keyprotocol(term, kpc);
+
     return NULL;
 }
 
index 4150cbe000a804209387fc0308cfa3010d90e4a8..e95befef5cc35b69f3ccb99aee0966332293e4b6 100644 (file)
@@ -5,6 +5,7 @@ void init_term_props(int all);
 void f_terminalprops(typval_T *argvars, typval_T *rettv);
 void set_color_count(int nr);
 keyprot_T match_keyprotocol(char_u *term);
+void apply_keyprotocol(char_u *term, keyprot_T prot);
 int set_termname(char_u *term);
 void free_cur_term(void);
 void getlinecol(long *cp, long *rp);
index 2dbfdad7d48f33db8679a9d33dc806d4867e8b23..43f5fe5db3a00a077ad450d1fc91ead1aa7f8009 100644 (file)
@@ -1607,6 +1607,23 @@ apply_builtin_tcap(char_u *term, tcap_entry_T *entries, int overwrite)
     }
 }
 
+/*
+ * Apply builtin termcap entries for a given keyprotocol.
+ */
+    void
+apply_keyprotocol(char_u *term, keyprot_T prot)
+{
+    if (prot == KEYPROTOCOL_KITTY)
+       apply_builtin_tcap(term, builtin_kitty, TRUE);
+    if (prot == KEYPROTOCOL_MOK2)
+       apply_builtin_tcap(term, builtin_mok2, TRUE);
+
+    if (prot != KEYPROTOCOL_NONE)
+       // Some function keys may accept modifiers even though the
+       // terminfo/termcap entry does not indicate this.
+       accept_modifiers_for_function_keys();
+}
+
 /*
  * Parsing of the builtin termcap entries.
  * Caller should check if "term" is a valid builtin terminal name.
@@ -2083,10 +2100,7 @@ set_termname(char_u *term)
        // Use the 'keyprotocol' option to adjust the t_TE and t_TI
        // termcap entries if there is an entry matching "term".
        keyprot_T kpc = match_keyprotocol(term);
-       if (kpc == KEYPROTOCOL_KITTY)
-           apply_builtin_tcap(term, builtin_kitty, TRUE);
-       else if (kpc == KEYPROTOCOL_MOK2)
-           apply_builtin_tcap(term, builtin_mok2, TRUE);
+       apply_keyprotocol(term, kpc);
 
 #ifdef FEAT_TERMGUICOLORS
        // There is no good way to detect that the terminal supports RGB
@@ -2098,11 +2112,6 @@ set_termname(char_u *term)
                && term_strings_not_set(KS_8U))
            apply_builtin_tcap(term, builtin_rgb, TRUE);
 #endif
-
-       if (kpc != KEYPROTOCOL_NONE)
-           // Some function keys may accept modifiers even though the
-           // terminfo/termcap entry does not indicate this.
-           accept_modifiers_for_function_keys();
     }
 
 /*
index fc81cec4eacfca506e08e4d4779341240ba15a94..ccaefc58494ca42fa346aa167d42dba52e3af6d3 100644 (file)
@@ -1861,4 +1861,18 @@ func Test_binary_depending_options()
   call delete('Xoutput_bin')
 endfunc
 
+func Test_set_keyprotocol()
+  CheckNotGui
+
+  let term = &term
+  set term=ansi
+  call assert_equal('', &t_TI)
+
+  " Setting 'keyprotocol' should affect terminal codes without needing to
+  " reset 'term'
+  set keyprotocol+=ansi:kitty
+  call assert_equal("\<Esc>[=1;1u", &t_TI)
+  let &term = term
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
index 3165cef295e62b9a90d52c3c408f4da04267c183..da027c5a1ef1dba5d122e1b234a9d9bbddf33b7a 100644 (file)
@@ -699,6 +699,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1957,
 /**/
     1956,
 /**/