Skip to content

Commit

Permalink
patch 9.0.1957: termcap options should change when setting keyprotocol
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
gpanders authored and chrisbra committed Sep 29, 2023
1 parent 28a2360 commit 3695d0e
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 10 deletions.
6 changes: 5 additions & 1 deletion src/optionstr.c
Expand Up @@ -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;
}

Expand Down
1 change: 1 addition & 0 deletions src/proto/term.pro
Expand Up @@ -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);
Expand Down
27 changes: 18 additions & 9 deletions src/term.c
Expand Up @@ -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.
Expand Down Expand Up @@ -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
Expand All @@ -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();
}

/*
Expand Down
14 changes: 14 additions & 0 deletions src/testdir/test_options.vim
Expand Up @@ -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
2 changes: 2 additions & 0 deletions src/version.c
Expand Up @@ -699,6 +699,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1957,
/**/
1956,
/**/
Expand Down

0 comments on commit 3695d0e

Please sign in to comment.