]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.2.5157: MS-Windows GUI: CTRL-key combinations do not always work v8.2.5157
authorLemonBoy <thatlemon@gmail.com>
Fri, 24 Jun 2022 19:18:09 +0000 (20:18 +0100)
committerBram Moolenaar <Bram@vim.org>
Fri, 24 Jun 2022 19:18:09 +0000 (20:18 +0100)
Problem:    MS-Windows GUI: CTRL-key combinations do not always work.
Solution:   Handle special key combinations better. (closes #10613,
            closes #10602, closes #10579)

src/gui_w32.c
src/version.c

index 7bdbf418da29f5fd3253be3861f05d922100b7f1..ae419053b2f5e17110293b61a7cbcaa656a49035 100644 (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)
index b13e4ce3f86fc03e2615db0d764ceedf6bce9e85..3918d434561b5d017eaa5e799ab29e913e2d65e8 100644 (file)
@@ -735,6 +735,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    5157,
 /**/
     5156,
 /**/