Patch 8.2.1019
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.
Files:      src/gui_gtk_x11.c, src/misc2.c, src/proto/misc2.pro, src/term.c


*** ../vim-8.2.1018/src/gui_gtk_x11.c   2020-05-31 13:53:01.548186282 +0200
--- src/gui_gtk_x11.c   2020-06-20 14:30:03.179918323 +0200
***************
*** 1211,1225 ****
      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];
  
      key = simplify_key(key, &modifiers);
      if (key == CSI)
        key = K_CSI;
--- 1211,1226 ----
      if (len == 0)   // Unrecognized key
        return TRUE;
  
      // 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,1240 ****
--- 1236,1245 ----
        // <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;
      }
*** ../vim-8.2.1018/src/misc2.c 2020-06-19 21:46:48.534308768 +0200
--- src/misc2.c 2020-06-20 14:29:51.783949940 +0200
***************
*** 2910,2915 ****
--- 2910,2934 ----
      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.
*** ../vim-8.2.1018/src/proto/misc2.pro 2020-06-07 20:49:02.073891895 +0200
--- src/proto/misc2.pro 2020-06-20 14:29:48.231959793 +0200
***************
*** 71,76 ****
--- 71,77 ----
  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);
*** ../vim-8.2.1018/src/term.c  2020-06-19 21:46:48.534308768 +0200
--- src/term.c  2020-06-20 14:29:57.415934322 +0200
***************
*** 4769,4785 ****
  
      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;
  
      // When used with Ctrl we always make a letter upper case,
      // so that mapping <C-H> and <C-h> are the same.  Typing
--- 4769,4776 ----
  
      modifiers = decode_modifiers(arg[1]);
  
!     // 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
*** ../vim-8.2.1018/src/version.c       2020-06-20 13:28:59.789336842 +0200
--- src/version.c       2020-06-20 14:25:28.432673156 +0200
***************
*** 756,757 ****
--- 756,759 ----
  {   /* Add new patch number below this line */
+ /**/
+     1019,
  /**/

-- 
In Africa some of the native tribes have a custom of beating the ground
with clubs and uttering spine chilling cries.  Anthropologists call
this a form of primitive self-expression.  In America we call it golf.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/202006201243.05KChqYb888348%40masaka.moolenaar.net.

Raspunde prin e-mail lui