mirror of
https://github.com/vim/vim.git
synced 2025-07-26 11:04:33 -04:00
patch 8.2.5157: MS-Windows GUI: CTRL-key combinations do not always work
Problem: MS-Windows GUI: CTRL-key combinations do not always work. Solution: Handle special key combinations better. (closes #10613, closes #10602, closes #10579)
This commit is contained in:
parent
e9b74c0361
commit
4e0fc89566
@ -2055,21 +2055,21 @@ process_message(void)
|
||||
int i;
|
||||
UINT scan_code;
|
||||
|
||||
// Construct the state table with only a few modifiers, we don't
|
||||
// really care about the presence of Ctrl/Alt as those modifiers are
|
||||
// handled by Vim separately.
|
||||
// Construct the keyboard state table, the modifiers can and will
|
||||
// affect the character translation performed by ToUnicode.
|
||||
// Eg. With a Russian keyboard layout pressing 'n' produces 'т' but
|
||||
// Ctrl+p produces 'p', this is essential for the keybindings to
|
||||
// work.
|
||||
memset(keyboard_state, 0, 256);
|
||||
if (GetKeyState(VK_CONTROL) & 0x8000)
|
||||
keyboard_state[VK_CONTROL] = 0x80;
|
||||
if (GetKeyState(VK_SHIFT) & 0x8000)
|
||||
keyboard_state[VK_SHIFT] = 0x80;
|
||||
if (GetKeyState(VK_CAPITAL) & 0x0001)
|
||||
keyboard_state[VK_CAPITAL] = 0x01;
|
||||
// Alt-Gr is synthesized as Alt + Ctrl.
|
||||
if ((GetKeyState(VK_RMENU) & 0x8000)
|
||||
&& (GetKeyState(VK_CONTROL) & 0x8000))
|
||||
{
|
||||
// Alt-Gr is synthesized as (Right)Alt + Ctrl.
|
||||
if ((GetKeyState(VK_RMENU) & 0x8000) && keyboard_state[VK_CONTROL])
|
||||
keyboard_state[VK_MENU] = 0x80;
|
||||
keyboard_state[VK_CONTROL] = 0x80;
|
||||
}
|
||||
|
||||
// Translate the virtual key according to the current keyboard
|
||||
// layout.
|
||||
@ -2079,6 +2079,16 @@ process_message(void)
|
||||
// If this is a dead key ToUnicode returns a negative value.
|
||||
len = ToUnicode(vk, scan_code, keyboard_state, ch, ARRAY_LENGTH(ch),
|
||||
0);
|
||||
if (len == 0 && keyboard_state[VK_CONTROL])
|
||||
{
|
||||
// Handle one more special case: pressing Ctrl+key may
|
||||
// generate an unprintable ASCII character, try again without
|
||||
// the modifier to get the pressed key value.
|
||||
keyboard_state[VK_CONTROL] = 0;
|
||||
len = ToUnicode(vk, scan_code, keyboard_state, ch,
|
||||
ARRAY_LENGTH(ch), 0);
|
||||
keyboard_state[VK_CONTROL] = 0x80;
|
||||
}
|
||||
dead_key = len < 0;
|
||||
|
||||
if (len <= 0)
|
||||
|
@ -735,6 +735,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
5157,
|
||||
/**/
|
||||
5156,
|
||||
/**/
|
||||
|
Loading…
x
Reference in New Issue
Block a user