patch 9.0.0930: cannot debug the Kitty keyboard protocol with TermDebug

Problem:    Cannot debug the Kitty keyboard protocol with TermDebug.
Solution:   Add Kitty keyboard protocol support to the libvterm fork.
            Recognize the escape sequences that the protocol generates.  Add
            the 'keyprotocol' option to allow the user to specify for which
            terminal what protocol is to be used, instead of hard-coding this.
            Add recognizing the kitty keyboard protocol status.
This commit is contained in:
Bram Moolenaar
2022-11-23 20:20:18 +00:00
parent 0b6d6a186e
commit 63a2e360cc
22 changed files with 381 additions and 43 deletions

View File

@ -368,6 +368,7 @@ size_t vterm_output_get_buffer_remaining(const VTerm *vt);
size_t vterm_output_read(VTerm *vt, char *buffer, size_t len);
int vterm_is_modify_other_keys(VTerm *vt);
int vterm_is_kitty_keyboard(VTerm *vt);
void vterm_keyboard_unichar(VTerm *vt, uint32_t c, VTermModifier mod);
void vterm_keyboard_key(VTerm *vt, VTermKey key, VTermModifier mod);

View File

@ -10,6 +10,12 @@ int vterm_is_modify_other_keys(VTerm *vt)
return vt->state->mode.modify_other_keys;
}
// VIM: added
int vterm_is_kitty_keyboard(VTerm *vt)
{
return vt->state->mode.kitty_keyboard;
}
void vterm_keyboard_unichar(VTerm *vt, uint32_t c, VTermModifier mod)
{
@ -19,6 +25,12 @@ void vterm_keyboard_unichar(VTerm *vt, uint32_t c, VTermModifier mod)
return;
}
// VIM: added kitty keyboard protocol support
if (vterm_is_kitty_keyboard(vt) && mod != 0) {
vterm_push_output_sprintf_ctrl(vt, C1_CSI, "%d;%du", c, mod+1);
return;
}
/* The shift modifier is never important for Unicode characters
* apart from Space
*/
@ -166,8 +178,10 @@ void vterm_keyboard_key(VTerm *vt, VTermKey key, VTermModifier mod)
break;
case KEYCODE_TAB:
if (vterm_is_kitty_keyboard(vt) && mod != 0)
vterm_push_output_sprintf_ctrl(vt, C1_CSI, "9;%du", mod+1);
/* Shift-Tab is CSI Z but plain Tab is 0x09 */
if(mod == VTERM_MOD_SHIFT)
else if(mod == VTERM_MOD_SHIFT)
vterm_push_output_sprintf_ctrl(vt, C1_CSI, "Z");
else if(mod & VTERM_MOD_SHIFT)
vterm_push_output_sprintf_ctrl(vt, C1_CSI, "1;%dZ", mod+1);
@ -186,7 +200,10 @@ void vterm_keyboard_key(VTerm *vt, VTermKey key, VTermModifier mod)
case KEYCODE_LITERAL: case_LITERAL:
if (vterm_is_modify_other_keys(vt) && mod != 0)
vterm_push_output_sprintf_ctrl(vt, C1_CSI, "27;%d;%d~", mod+1, k.literal);
else if(mod & (VTERM_MOD_SHIFT|VTERM_MOD_CTRL))
else if (vterm_is_kitty_keyboard(vt) && mod == 0 && k.literal == '\x1b')
vterm_push_output_sprintf_ctrl(vt, C1_CSI, "%du", k.literal);
else if ((vterm_is_kitty_keyboard(vt) && mod != 0)
|| (mod & (VTERM_MOD_SHIFT|VTERM_MOD_CTRL)))
vterm_push_output_sprintf_ctrl(vt, C1_CSI, "%d;%du", k.literal, mod+1);
else
vterm_push_output_sprintf(vt, mod & VTERM_MOD_ALT ? ESC_S "%c" : "%c", k.literal);

View File

@ -1423,9 +1423,37 @@ static int on_csi(const char *leader, const long args[], int argcount, const cha
}
break;
case LEADER('>', 0x6d): // xterm resource modifyOtherKeys
case LEADER('>', 0x6d): // CSI > 4 ; Pv m xterm resource modifyOtherKeys
if (argcount == 2 && args[0] == 4)
{
// can't have both modify_other_keys and kitty_keyboard
state->mode.kitty_keyboard = 0;
state->mode.modify_other_keys = args[1] == 2;
}
break;
case LEADER('>', 0x75): // CSI > 1 u enable kitty keyboard protocol
if (argcount == 1 && args[0] == 1)
{
// can't have both modify_other_keys and kitty_keyboard
state->mode.modify_other_keys = 0;
state->mode.kitty_keyboard = 1;
}
break;
case LEADER('<', 0x75): // CSI < u disable kitty keyboard protocol
if (argcount <= 1)
state->mode.kitty_keyboard = 0;
break;
case LEADER('?', 0x75): // CSI ? u request kitty keyboard protocol state
if (argcount <= 1)
// TODO: this only uses the values zero and one. The protocol specifies
// more values, the progressive enhancement flags.
vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "?%du",
state->mode.kitty_keyboard);
break;
case 0x6e: // DSR - ECMA-48 8.3.35

View File

@ -130,6 +130,7 @@ struct VTermState
unsigned int bracketpaste:1;
unsigned int report_focus:1;
unsigned int modify_other_keys:1;
unsigned int kitty_keyboard:1;
} mode;
VTermEncodingInstance encoding[4], encoding_utf8;