comparison src/libvterm/src/keyboard.c @ 31192:dcde141f2d1e v9.0.0930

patch 9.0.0930: cannot debug the Kitty keyboard protocol with TermDebug Commit: https://github.com/vim/vim/commit/63a2e360cca2c70ab0a85d14771d3259d4b3aafa Author: Bram Moolenaar <Bram@vim.org> Date: Wed Nov 23 20:20:18 2022 +0000 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.
author Bram Moolenaar <Bram@vim.org>
date Wed, 23 Nov 2022 21:30:04 +0100
parents 0ecb16d5f86f
children
comparison
equal deleted inserted replaced
31191:b8c6d994ce31 31192:dcde141f2d1e
6 6
7 // VIM: added 7 // VIM: added
8 int vterm_is_modify_other_keys(VTerm *vt) 8 int vterm_is_modify_other_keys(VTerm *vt)
9 { 9 {
10 return vt->state->mode.modify_other_keys; 10 return vt->state->mode.modify_other_keys;
11 }
12
13 // VIM: added
14 int vterm_is_kitty_keyboard(VTerm *vt)
15 {
16 return vt->state->mode.kitty_keyboard;
11 } 17 }
12 18
13 19
14 void vterm_keyboard_unichar(VTerm *vt, uint32_t c, VTermModifier mod) 20 void vterm_keyboard_unichar(VTerm *vt, uint32_t c, VTermModifier mod)
15 { 21 {
16 // VIM: added modifyOtherKeys support 22 // VIM: added modifyOtherKeys support
17 if (vterm_is_modify_other_keys(vt) && mod != 0) { 23 if (vterm_is_modify_other_keys(vt) && mod != 0) {
18 vterm_push_output_sprintf_ctrl(vt, C1_CSI, "27;%d;%d~", mod+1, c); 24 vterm_push_output_sprintf_ctrl(vt, C1_CSI, "27;%d;%d~", mod+1, c);
25 return;
26 }
27
28 // VIM: added kitty keyboard protocol support
29 if (vterm_is_kitty_keyboard(vt) && mod != 0) {
30 vterm_push_output_sprintf_ctrl(vt, C1_CSI, "%d;%du", c, mod+1);
19 return; 31 return;
20 } 32 }
21 33
22 /* The shift modifier is never important for Unicode characters 34 /* The shift modifier is never important for Unicode characters
23 * apart from Space 35 * apart from Space
164 switch(k.type) { 176 switch(k.type) {
165 case KEYCODE_NONE: 177 case KEYCODE_NONE:
166 break; 178 break;
167 179
168 case KEYCODE_TAB: 180 case KEYCODE_TAB:
181 if (vterm_is_kitty_keyboard(vt) && mod != 0)
182 vterm_push_output_sprintf_ctrl(vt, C1_CSI, "9;%du", mod+1);
169 /* Shift-Tab is CSI Z but plain Tab is 0x09 */ 183 /* Shift-Tab is CSI Z but plain Tab is 0x09 */
170 if(mod == VTERM_MOD_SHIFT) 184 else if(mod == VTERM_MOD_SHIFT)
171 vterm_push_output_sprintf_ctrl(vt, C1_CSI, "Z"); 185 vterm_push_output_sprintf_ctrl(vt, C1_CSI, "Z");
172 else if(mod & VTERM_MOD_SHIFT) 186 else if(mod & VTERM_MOD_SHIFT)
173 vterm_push_output_sprintf_ctrl(vt, C1_CSI, "1;%dZ", mod+1); 187 vterm_push_output_sprintf_ctrl(vt, C1_CSI, "1;%dZ", mod+1);
174 else 188 else
175 goto case_LITERAL; 189 goto case_LITERAL;
184 break; 198 break;
185 199
186 case KEYCODE_LITERAL: case_LITERAL: 200 case KEYCODE_LITERAL: case_LITERAL:
187 if (vterm_is_modify_other_keys(vt) && mod != 0) 201 if (vterm_is_modify_other_keys(vt) && mod != 0)
188 vterm_push_output_sprintf_ctrl(vt, C1_CSI, "27;%d;%d~", mod+1, k.literal); 202 vterm_push_output_sprintf_ctrl(vt, C1_CSI, "27;%d;%d~", mod+1, k.literal);
189 else if(mod & (VTERM_MOD_SHIFT|VTERM_MOD_CTRL)) 203 else if (vterm_is_kitty_keyboard(vt) && mod == 0 && k.literal == '\x1b')
204 vterm_push_output_sprintf_ctrl(vt, C1_CSI, "%du", k.literal);
205 else if ((vterm_is_kitty_keyboard(vt) && mod != 0)
206 || (mod & (VTERM_MOD_SHIFT|VTERM_MOD_CTRL)))
190 vterm_push_output_sprintf_ctrl(vt, C1_CSI, "%d;%du", k.literal, mod+1); 207 vterm_push_output_sprintf_ctrl(vt, C1_CSI, "%d;%du", k.literal, mod+1);
191 else 208 else
192 vterm_push_output_sprintf(vt, mod & VTERM_MOD_ALT ? ESC_S "%c" : "%c", k.literal); 209 vterm_push_output_sprintf(vt, mod & VTERM_MOD_ALT ? ESC_S "%c" : "%c", k.literal);
193 break; 210 break;
194 211