diff options
author | Gregory Anders <greg@gpanders.com> | 2023-09-29 20:17:20 +0200 |
---|---|---|
committer | Christian Brabandt <cb@256bit.org> | 2023-09-29 20:17:20 +0200 |
commit | 3695d0e41ba26db074dd5680564a6f87d522fb61 (patch) | |
tree | 4e7a0cc8868eda94d01428a7d4bf0be4aa0b7d5b /src | |
parent | 28a23602e8f88937645b8506b7915ecea6e09b18 (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.c | 6 | ||||
-rw-r--r-- | src/proto/term.pro | 1 | ||||
-rw-r--r-- | src/term.c | 27 | ||||
-rw-r--r-- | src/testdir/test_options.vim | 14 | ||||
-rw-r--r-- | src/version.c | 2 |
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, |