Mercurial > vim
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 |