changeset 29279:d178aaa96083 v8.2.5157

patch 8.2.5157: MS-Windows GUI: CTRL-key combinations do not always work Commit: https://github.com/vim/vim/commit/4e0fc8956649d3208aeaa1642c5efc44e385d77a Author: LemonBoy <thatlemon@gmail.com> Date: Fri Jun 24 20:18:09 2022 +0100 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 https://github.com/vim/vim/issues/10613, closes #10602, closes #10579)
author Bram Moolenaar <Bram@vim.org>
date Fri, 24 Jun 2022 21:30:02 +0200
parents 2784b86229f7
children 7e89a967ee84
files src/gui_w32.c src/version.c
diffstat 2 files changed, 21 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/gui_w32.c
+++ b/src/gui_w32.c
@@ -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)
--- a/src/version.c
+++ b/src/version.c
@@ -736,6 +736,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    5157,
+/**/
     5156,
 /**/
     5155,