diff options
author | Bram Moolenaar <Bram@vim.org> | 2022-12-16 18:33:20 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-12-16 18:33:20 +0000 |
commit | 9d1184cd1d4ebbfb13859adffec09077a84fd2b2 (patch) | |
tree | 63c05b85a2a65b1ceca9f1f66127c28b239d4bb5 | |
parent | 9aee8ec400fe617f6d82441c46a22d0cef6fa3e6 (diff) |
patch 9.0.1065: a shell command switching screens may still have a problemv9.0.1065
Problem: A shell command switching screens may still have a problem with
the kitty keyboard protocol.
Solution: Disable the kitty keyboard protocol both in the current and the
alternate screen, if there are indications it might be needed.
(issue #11705) Also fix naming.
-rw-r--r-- | src/globals.h | 16 | ||||
-rw-r--r-- | src/map.c | 4 | ||||
-rw-r--r-- | src/term.c | 20 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 27 insertions, 15 deletions
diff --git a/src/globals.h b/src/globals.h index 009165dd8d..1090f35895 100644 --- a/src/globals.h +++ b/src/globals.h @@ -1396,12 +1396,12 @@ typedef enum { MOKS_OFF, // Used when receiving the state and the level is two. MOKS_ENABLED, - // Used after outputting t_KE when the state was MOKS_ENABLED. We do not - // really know if t_KE actually disabled the protocol, the following t_KI + // Used after outputting t_TE when the state was MOKS_ENABLED. We do not + // really know if t_TE actually disabled the protocol, the following t_TI // is expected to request the state, but the response may come only later. MOKS_DISABLED, - // Used after outputting t_KE when the state was not MOKS_ENABLED. - MOKS_AFTER_T_KE, + // Used after outputting t_TE when the state was not MOKS_ENABLED. + MOKS_AFTER_T_TE, } mokstate_T; // Set when a response to XTQMODKEYS was received. Only works for xterm @@ -1416,12 +1416,12 @@ typedef enum { KKPS_OFF, // Used when receiving the state and the flags are non-zero. KKPS_ENABLED, - // Used after outputting t_KE when the state was KKPS_ENABLED. We do not - // really know if t_KE actually disabled the protocol, the following t_KI + // Used after outputting t_TE when the state was KKPS_ENABLED. We do not + // really know if t_TE actually disabled the protocol, the following t_TI // is expected to request the state, but the response may come only later. KKPS_DISABLED, - // Used after outputting t_KE when the state was not KKPS_ENABLED. - KKPS_AFTER_T_KE, + // Used after outputting t_TE when the state was not KKPS_ENABLED. + KKPS_AFTER_T_TE, } kkpstate_T; EXTERN kkpstate_T kitty_protocol_state INIT(= KKPS_INITIAL); @@ -326,7 +326,7 @@ list_mappings( case MOKS_OFF: name = _("Off"); break; case MOKS_ENABLED: name = _("On"); break; case MOKS_DISABLED: name = _("Disabled"); break; - case MOKS_AFTER_T_KE: name = _("Cleared"); break; + case MOKS_AFTER_T_TE: name = _("Cleared"); break; } char buf[200]; @@ -344,7 +344,7 @@ list_mappings( case KKPS_OFF: name = _("Off"); break; case KKPS_ENABLED: name = _("On"); break; case KKPS_DISABLED: name = _("Disabled"); break; - case KKPS_AFTER_T_KE: name = _("Cleared"); break; + case KKPS_AFTER_T_TE: name = _("Cleared"); break; } char buf[200]; diff --git a/src/term.c b/src/term.c index 777c510e86..590c21cc0e 100644 --- a/src/term.c +++ b/src/term.c @@ -3689,7 +3689,7 @@ out_str_t_TE(void) || modify_otherkeys_state == MOKS_DISABLED) modify_otherkeys_state = MOKS_DISABLED; else if (modify_otherkeys_state != MOKS_INITIAL) - modify_otherkeys_state = MOKS_AFTER_T_KE; + modify_otherkeys_state = MOKS_AFTER_T_TE; // When the kitty keyboard protocol is enabled we expect t_TE to disable // it. Remembering that it was detected to be enabled is useful in some @@ -3700,7 +3700,7 @@ out_str_t_TE(void) || kitty_protocol_state == KKPS_DISABLED) kitty_protocol_state = KKPS_DISABLED; else - kitty_protocol_state = KKPS_AFTER_T_KE; + kitty_protocol_state = KKPS_AFTER_T_TE; } static int send_t_RK = FALSE; @@ -3892,8 +3892,18 @@ stoptermcap(void) out_flush(); termcap_active = FALSE; - // Output t_te first, it may switch between main and alternate screen, - // and following codes may work on the active screen only. + // Output t_te before t_TE, t_te may switch between main and alternate + // screen and following codes may work on the active screen only. + // + // When using the Kitty keyboard protocol the main and alternate screen + // use a separate state. If we are (or were) using the Kitty keyboard + // protocol and t_te is not empty (possibly switching screens) then + // output t_TE both before and after outputting t_te. + if (*T_TE != NUL && (kitty_protocol_state == KKPS_ENABLED + || kitty_protocol_state == KKPS_DISABLED)) + out_str_t_TE(); // probably disables the kitty keyboard + // protocol + out_str(T_TE); // stop termcap mode cursor_on(); // just in case it is still off out_str_t_TE(); // stop "raw" mode, modifyOtherKeys and @@ -5158,7 +5168,7 @@ handle_key_with_modifier( if (trail != 'u' && (kitty_protocol_state == KKPS_INITIAL || kitty_protocol_state == KKPS_OFF - || kitty_protocol_state == KKPS_AFTER_T_KE) + || kitty_protocol_state == KKPS_AFTER_T_TE) && term_props[TPR_KITTY].tpr_status != TPR_YES) { #ifdef FEAT_EVAL diff --git a/src/version.c b/src/version.c index 140fa87cb6..0d306cc79e 100644 --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1065, +/**/ 1064, /**/ 1063, |