summaryrefslogtreecommitdiffstats
path: root/src/getchar.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2023-03-18 17:22:46 +0000
committerBram Moolenaar <Bram@vim.org>2023-03-18 17:22:46 +0000
commitea83c194625e51c28a2796eba9ba87b0b9ab23e0 (patch)
treec19f6698892653a098f416bcf57667009a236415 /src/getchar.c
parent2a003177eb3cee535bb8a384b4b87db13f0486ae (diff)
patch 9.0.1414: <M-S-x> in Kitty does not use the Shift modifierv9.0.1414
Problem: <M-S-x> in Kitty does not use the Shift modifier. Solution: Apply the Shift modifier to ASCII letters. (closes #11913)
Diffstat (limited to 'src/getchar.c')
-rw-r--r--src/getchar.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/getchar.c b/src/getchar.c
index dac57eb26c..125f0b0aad 100644
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -1623,13 +1623,14 @@ updatescript(int c)
/*
* Convert "c" plus "modifiers" to merge the effect of modifyOtherKeys into the
- * character.
+ * character. Also for when the Kitty key protocol is used.
*/
int
merge_modifyOtherKeys(int c_arg, int *modifiers)
{
int c = c_arg;
+ // CTRL only uses the lower 5 bits of the character.
if (*modifiers & MOD_MASK_CTRL)
{
if ((c >= '`' && c <= 0x7f) || (c >= '@' && c <= '_'))
@@ -1658,12 +1659,23 @@ merge_modifyOtherKeys(int c_arg, int *modifiers)
if (c != c_arg)
*modifiers &= ~MOD_MASK_CTRL;
}
+
+ // Alt/Meta sets the 8th bit of the character.
if ((*modifiers & (MOD_MASK_META | MOD_MASK_ALT))
&& c >= 0 && c <= 127)
{
+ // Some terminals (esp. Kitty) do not include Shift in the character.
+ // Apply it here to get consistency across terminals. Only do ASCII
+ // letters, for other characters it depends on the keyboard layout.
+ if ((*modifiers & MOD_MASK_SHIFT) && c >= 'a' && c <= 'z')
+ {
+ c += 'a' - 'A';
+ *modifiers &= ~MOD_MASK_SHIFT;
+ }
c += 0x80;
*modifiers &= ~(MOD_MASK_META | MOD_MASK_ALT);
}
+
return c;
}