]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.2.1019: mapping <M-S-a> does not work in the GUI v8.2.1019
authorBram Moolenaar <Bram@vim.org>
Sat, 20 Jun 2020 12:43:23 +0000 (14:43 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 20 Jun 2020 12:43:23 +0000 (14:43 +0200)
Problem:    Mapping <M-S-a> does not work in the GUI.
Solution:   Move the logic to remove the shift modifier to
            may_remove_shift_modifier() and also use it in the GUI.

src/gui_gtk_x11.c
src/misc2.c
src/proto/misc2.pro
src/term.c
src/version.c

index a5af3fa21cbbabdfab6d19f07ba0bf6e3dd76191..b2770ca47fc0ff56329ede00bfb58be6b3206327 100644 (file)
@@ -1211,15 +1211,16 @@ key_press_event(GtkWidget *widget UNUSED,
     if (len == 0)   // Unrecognized key
        return TRUE;
 
-    // Handle modifiers.
-    modifiers = modifiers_gdk2vim(state);
-
     // For some keys a shift modifier is translated into another key code.
     if (len == -3)
        key = TO_SPECIAL(string[1], string[2]);
     else
        key = string[0];
 
+    // Handle modifiers.
+    modifiers = modifiers_gdk2vim(state);
+
+    // Recognize special keys.
     key = simplify_key(key, &modifiers);
     if (key == CSI)
        key = K_CSI;
@@ -1235,6 +1236,10 @@ key_press_event(GtkWidget *widget UNUSED,
        // <C-H> and <C-h> mean the same thing, always use "H"
        if ((modifiers & MOD_MASK_CTRL) && ASCII_ISALPHA(key))
            key = TOUPPER_ASC(key);
+
+       // May remove the shift modifier if it's included in the key.
+       modifiers = may_remove_shift_modifier(modifiers, key);
+
        string[0] = key;
        len = 1;
     }
index 649cb65c9b91c23ba21b58b2acc4881828741b94..7ef6cdf44d03f8cc8ebc029199983461ee139f64 100644 (file)
@@ -2910,6 +2910,25 @@ find_special_key(
     return 0;
 }
 
+
+/*
+ * Some keys already have Shift included, pass them as normal keys.
+ * Not when Ctrl is also used, because <C-H> and <C-S-H> are different.
+ * Also for <A-S-a> and <M-S-a>.
+ */
+    int
+may_remove_shift_modifier(int modifiers, int key)
+{
+    if ((modifiers == MOD_MASK_SHIFT
+               || modifiers == (MOD_MASK_SHIFT | MOD_MASK_ALT)
+               || modifiers == (MOD_MASK_SHIFT | MOD_MASK_META))
+           && ((key >= '@' && key <= 'Z')
+               || key == '^' || key == '_'
+               || (key >= '{' && key <= '~')))
+       return modifiers & ~MOD_MASK_SHIFT;
+    return modifiers;
+}
+
 /*
  * Try to include modifiers in the key.
  * Changes "Shift-a" to 'A', "Alt-A" to 0xc0, etc.
index 347745252531f1801f712ec1eba3b53df17f5a24..e1e20aaab17ce5999bf3867630980e8aaafa520e 100644 (file)
@@ -71,6 +71,7 @@ char_u *get_special_key_name(int c, int modifiers);
 int trans_special(char_u **srcp, char_u *dst, int flags, int *did_simplify);
 int special_to_buf(int key, int modifiers, int keycode, char_u *dst);
 int find_special_key(char_u **srcp, int *modp, int flags, int *did_simplify);
+int may_remove_shift_modifier(int modifiers, int key);
 int extract_modifiers(int key, int *modp, int simplify, int *did_simplify);
 int find_special_key_in_table(int c);
 int get_special_key_code(char_u *name);
index 1556c2eeccdc90048f9e53fef15ef69615e23f87..3bda87ccccec05c09fc38071201f72ba7f9d1858 100644 (file)
@@ -4769,17 +4769,8 @@ handle_key_with_modifier(
 
     modifiers = decode_modifiers(arg[1]);
 
-    // Some keys already have Shift included, pass them as
-    // normal keys.  Not when Ctrl is also used, because <C-H>
-    // and <C-S-H> are different.
-    // Also for <A-S-a> and <M-S-a>.
-    if ((modifiers == MOD_MASK_SHIFT
-               || modifiers == (MOD_MASK_SHIFT | MOD_MASK_ALT)
-               || modifiers == (MOD_MASK_SHIFT | MOD_MASK_META))
-           && ((key >= '@' && key <= 'Z')
-               || key == '^' || key == '_'
-               || (key >= '{' && key <= '~')))
-       modifiers &= ~MOD_MASK_SHIFT;
+    // May remove the shift modifier if it's already included in the key.
+    modifiers = may_remove_shift_modifier(modifiers, key);
 
     // When used with Ctrl we always make a letter upper case,
     // so that mapping <C-H> and <C-h> are the same.  Typing
index fdb7c9f9ee525e99cc040f2318427f5b14d98810..5d7e45135ef0af3ba072ad8b7d7b35aea45c98c9 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1019,
 /**/
     1018,
 /**/