forked from aniani/vim
patch 8.2.1019: mapping <M-S-a> does not work in the GUI
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.
This commit is contained in:
parent
280b0dc815
commit
ef6746f637
@ -1211,15 +1211,16 @@ key_press_event(GtkWidget *widget UNUSED,
|
|||||||
if (len == 0) // Unrecognized key
|
if (len == 0) // Unrecognized key
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
// Handle modifiers.
|
|
||||||
modifiers = modifiers_gdk2vim(state);
|
|
||||||
|
|
||||||
// For some keys a shift modifier is translated into another key code.
|
// For some keys a shift modifier is translated into another key code.
|
||||||
if (len == -3)
|
if (len == -3)
|
||||||
key = TO_SPECIAL(string[1], string[2]);
|
key = TO_SPECIAL(string[1], string[2]);
|
||||||
else
|
else
|
||||||
key = string[0];
|
key = string[0];
|
||||||
|
|
||||||
|
// Handle modifiers.
|
||||||
|
modifiers = modifiers_gdk2vim(state);
|
||||||
|
|
||||||
|
// Recognize special keys.
|
||||||
key = simplify_key(key, &modifiers);
|
key = simplify_key(key, &modifiers);
|
||||||
if (key == CSI)
|
if (key == CSI)
|
||||||
key = K_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"
|
// <C-H> and <C-h> mean the same thing, always use "H"
|
||||||
if ((modifiers & MOD_MASK_CTRL) && ASCII_ISALPHA(key))
|
if ((modifiers & MOD_MASK_CTRL) && ASCII_ISALPHA(key))
|
||||||
key = TOUPPER_ASC(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;
|
string[0] = key;
|
||||||
len = 1;
|
len = 1;
|
||||||
}
|
}
|
||||||
|
19
src/misc2.c
19
src/misc2.c
@ -2910,6 +2910,25 @@ find_special_key(
|
|||||||
return 0;
|
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.
|
* Try to include modifiers in the key.
|
||||||
* Changes "Shift-a" to 'A', "Alt-A" to 0xc0, etc.
|
* Changes "Shift-a" to 'A', "Alt-A" to 0xc0, etc.
|
||||||
|
@ -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 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 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 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 extract_modifiers(int key, int *modp, int simplify, int *did_simplify);
|
||||||
int find_special_key_in_table(int c);
|
int find_special_key_in_table(int c);
|
||||||
int get_special_key_code(char_u *name);
|
int get_special_key_code(char_u *name);
|
||||||
|
13
src/term.c
13
src/term.c
@ -4769,17 +4769,8 @@ handle_key_with_modifier(
|
|||||||
|
|
||||||
modifiers = decode_modifiers(arg[1]);
|
modifiers = decode_modifiers(arg[1]);
|
||||||
|
|
||||||
// Some keys already have Shift included, pass them as
|
// May remove the shift modifier if it's already included in the key.
|
||||||
// normal keys. Not when Ctrl is also used, because <C-H>
|
modifiers = may_remove_shift_modifier(modifiers, key);
|
||||||
// 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,
|
// When used with Ctrl we always make a letter upper case,
|
||||||
// so that mapping <C-H> and <C-h> are the same. Typing
|
// so that mapping <C-H> and <C-h> are the same. Typing
|
||||||
|
@ -754,6 +754,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1019,
|
||||||
/**/
|
/**/
|
||||||
1018,
|
1018,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user