aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/terminal.c
diff options
context:
space:
mode:
authorbfredl <bjorn.linse@gmail.com>2025-01-14 14:46:34 +0100
committerGitHub <noreply@github.com>2025-01-14 14:46:34 +0100
commit7eabc8899af8b2fed1472165b74f43965282974f (patch)
tree85332ffa92ee59b3aaa9ecfb2cbe27fee2429156 /src/nvim/terminal.c
parent25d8c3a5ad7e9c5668841e66540ebe34ceda73a7 (diff)
parent913e81c35f162c1e2647565397608f63f38d7043 (diff)
downloadrneovim-7eabc8899af8b2fed1472165b74f43965282974f.tar.gz
rneovim-7eabc8899af8b2fed1472165b74f43965282974f.tar.bz2
rneovim-7eabc8899af8b2fed1472165b74f43965282974f.zip
Merge pull request #31932 from bfredl/termtab
fix(getchar): do not simplify keycodes in terminal mode
Diffstat (limited to 'src/nvim/terminal.c')
-rw-r--r--src/nvim/terminal.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/nvim/terminal.c b/src/nvim/terminal.c
index d7ed709906..ad343bad67 100644
--- a/src/nvim/terminal.c
+++ b/src/nvim/terminal.c
@@ -1011,7 +1011,7 @@ static void terminal_send_key(Terminal *term, int c)
c = Ctrl_AT;
}
- VTermKey key = convert_key(c, &mod);
+ VTermKey key = convert_key(&c, &mod);
if (key) {
vterm_keyboard_key(term->vt, key, mod);
@@ -1415,19 +1415,23 @@ static int term_selection_set(VTermSelectionMask mask, VTermStringFragment frag,
// }}}
// input handling {{{
-static void convert_modifiers(int key, VTermModifier *statep)
+static void convert_modifiers(int *key, VTermModifier *statep)
{
if (mod_mask & MOD_MASK_SHIFT) {
*statep |= VTERM_MOD_SHIFT;
}
if (mod_mask & MOD_MASK_CTRL) {
*statep |= VTERM_MOD_CTRL;
+ if (!(mod_mask & MOD_MASK_SHIFT) && *key >= 'A' && *key <= 'Z') {
+ // vterm interprets CTRL+A as SHIFT+CTRL, change to CTRL+a
+ *key += ('a' - 'A');
+ }
}
if (mod_mask & MOD_MASK_ALT) {
*statep |= VTERM_MOD_ALT;
}
- switch (key) {
+ switch (*key) {
case K_S_TAB:
case K_S_UP:
case K_S_DOWN:
@@ -1459,11 +1463,11 @@ static void convert_modifiers(int key, VTermModifier *statep)
}
}
-static VTermKey convert_key(int key, VTermModifier *statep)
+static VTermKey convert_key(int *key, VTermModifier *statep)
{
convert_modifiers(key, statep);
- switch (key) {
+ switch (*key) {
case K_BS:
return VTERM_KEY_BACKSPACE;
case K_S_TAB:
@@ -1791,7 +1795,7 @@ static bool send_mouse_event(Terminal *term, int c)
}
VTermModifier mod = VTERM_MOD_NONE;
- convert_modifiers(c, &mod);
+ convert_modifiers(&c, &mod);
mouse_action(term, button, row, col - offset, pressed, mod);
return false;
}