summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGregory Anders <greg@gpanders.com>2023-09-29 20:17:20 +0200
committerChristian Brabandt <cb@256bit.org>2023-09-29 20:17:20 +0200
commit3695d0e41ba26db074dd5680564a6f87d522fb61 (patch)
tree4e7a0cc8868eda94d01428a7d4bf0be4aa0b7d5b /src
parent28a23602e8f88937645b8506b7915ecea6e09b18 (diff)
patch 9.0.1957: termcap options should change when setting keyprotocolv9.0.1957
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>
Diffstat (limited to 'src')
-rw-r--r--src/optionstr.c6
-rw-r--r--src/proto/term.pro1
-rw-r--r--src/term.c27
-rw-r--r--src/testdir/test_options.vim14
-rw-r--r--src/version.c2
5 files changed, 40 insertions, 10 deletions
diff --git a/src/optionstr.c b/src/optionstr.c
index 5fceb85737..9b4464d85c 100644
--- a/src/optionstr.c
+++ b/src/optionstr.c
@@ -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;
}
diff --git a/src/proto/term.pro b/src/proto/term.pro
index 4150cbe000..e95befef5c 100644
--- a/src/proto/term.pro
+++ b/src/proto/term.pro
@@ -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);
diff --git a/src/term.c b/src/term.c
index 2dbfdad7d4..43f5fe5db3 100644
--- a/src/term.c
+++ b/src/term.c
@@ -1608,6 +1608,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.
* The terminal's name is not set, as this is already done in termcapinit().
@@ -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();
}
/*
diff --git a/src/testdir/test_options.vim b/src/testdir/test_options.vim
index fc81cec4ea..ccaefc5849 100644
--- a/src/testdir/test_options.vim
+++ b/src/testdir/test_options.vim
@@ -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
diff --git a/src/version.c b/src/version.c
index 3165cef295..da027c5a1e 100644
--- a/src/version.c
+++ b/src/version.c
@@ -700,6 +700,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1957,
+/**/
1956,
/**/
1955,