0
0
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:
LemonBoy 2022-06-24 20:18:09 +01:00 committed by Bram Moolenaar
parent e9b74c0361
commit 4e0fc89566
2 changed files with 21 additions and 9 deletions

View File

@ -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)

View File

@ -735,6 +735,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
5157,
/**/
5156,
/**/