patch 9.0.1414: <M-S-x> in Kitty does not use the Shift modifier
Problem: <M-S-x> in Kitty does not use the Shift modifier.
Solution: Apply the Shift modifier to ASCII letters. (closes #11913)
diff --git a/src/getchar.c b/src/getchar.c
index dac57eb..125f0b0 100644
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -1623,13 +1623,14 @@
/*
* 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 @@
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;
}
diff --git a/src/version.c b/src/version.c
index 98369f6..277e522 100644
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1414,
+/**/
1413,
/**/
1412,