To: vim_dev@googlegroups.com Subject: Patch 9.0.1169 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 9.0.1169 Problem: Some key+modifier tests fail on some AppVeyor images. Solution: Adjust the tests for key movements and fix the revealed bugs. (Christopher Plewright, closes #11798) Files: src/os_win32.c, src/testdir/test_gui.vim, src/testdir/test_mswin_event.vim *** ../vim-9.0.1168/src/os_win32.c 2023-01-04 18:05:55.408803650 +0000 --- src/os_win32.c 2023-01-10 13:41:03.137935193 +0000 *************** *** 1043,1049 **** } // check if it already has a valid unicode character. ! if (pker->uChar.UnicodeChar > 0 && pker->uChar.UnicodeChar < 0xFFFD) return 1; CLEAR_FIELD(abKeystate); --- 1043,1049 ---- } // check if it already has a valid unicode character. ! if (pker->uChar.UnicodeChar != 0) return 1; CLEAR_FIELD(abKeystate); *************** *** 1154,1165 **** else if (pker->wVirtualKeyCode >= VK_END && pker->wVirtualKeyCode <= VK_DOWN) { ! // VK_END 0x23 ! // VK_HOME 0x24 ! // VK_LEFT 0x25 ! // VK_UP 0x26 ! // VK_RIGHT 0x27 ! // VK_DOWN 0x28 *pmodifiers = 0; *pch2 = VirtKeyMap[i].chAlone; if ((nModifs & SHIFT) != 0 --- 1154,1162 ---- else if (pker->wVirtualKeyCode >= VK_END && pker->wVirtualKeyCode <= VK_DOWN) { ! // (0x23 - 0x28): VK_END, VK_HOME, ! // VK_LEFT, VK_UP, VK_RIGHT, VK_DOWN ! *pmodifiers = 0; *pch2 = VirtKeyMap[i].chAlone; if ((nModifs & SHIFT) != 0 *************** *** 1167,1173 **** { *pch2 = VirtKeyMap[i].chShift; } ! else if ((nModifs & CTRL) != 0 && (nModifs & ~CTRL) == 0) { *pch2 = VirtKeyMap[i].chCtrl; --- 1164,1170 ---- { *pch2 = VirtKeyMap[i].chShift; } ! if ((nModifs & CTRL) != 0 && (nModifs & ~CTRL) == 0) { *pch2 = VirtKeyMap[i].chCtrl; *************** *** 1178,1194 **** *pch2 = VirtKeyMap[i].chAlone; } } ! else if ((nModifs & ALT) != 0 ! && (nModifs & ~ALT) == 0) ! { ! *pch2 = VirtKeyMap[i].chAlt; ! } ! else if ((nModifs & SHIFT) != 0 && (nModifs & CTRL) != 0) { *pmodifiers |= MOD_MASK_CTRL; *pch2 = VirtKeyMap[i].chShift; } } else { --- 1175,1212 ---- *pch2 = VirtKeyMap[i].chAlone; } } ! if ((nModifs & SHIFT) != 0 && (nModifs & CTRL) != 0) { *pmodifiers |= MOD_MASK_CTRL; *pch2 = VirtKeyMap[i].chShift; } + if ((nModifs & ALT) != 0) + { + *pch2 = VirtKeyMap[i].chAlt; + *pmodifiers |= MOD_MASK_ALT; + if ((nModifs & ~ALT) == 0) + { + *pch2 = VirtKeyMap[i].chAlone; + } + else if ((nModifs & SHIFT) != 0) + { + *pch2 = VirtKeyMap[i].chShift; + } + else if ((nModifs & CTRL) != 0) + { + if (pker->wVirtualKeyCode == VK_UP + || pker->wVirtualKeyCode == VK_DOWN) + { + *pmodifiers |= MOD_MASK_CTRL; + *pch2 = VirtKeyMap[i].chAlone; + } + else + { + *pch2 = VirtKeyMap[i].chCtrl; + } + } + } } else { *************** *** 1319,1325 **** } ker.dwControlKeyState |= s_dwMods; ker.wVirtualKeyCode = vkCode; ! ker.uChar.UnicodeChar = 0xFFFD; // UNICODE REPLACEMENT CHARACTER ir->Event.KeyEvent = ker; vim_free(action); } --- 1337,1343 ---- } ker.dwControlKeyState |= s_dwMods; ker.wVirtualKeyCode = vkCode; ! ker.uChar.UnicodeChar = 0; ir->Event.KeyEvent = ker; vim_free(action); } *** ../vim-9.0.1168/src/testdir/test_gui.vim 2022-12-30 16:54:53.456987927 +0000 --- src/testdir/test_gui.vim 2023-01-10 13:37:34.665439089 +0000 *************** *** 1656,1749 **** call assert_equal(nr2char(kc - 64), ch) endfor ! " Test for the various Ctrl and Shift key combinations. ! " Refer to the following page for the virtual key codes: ! " https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes ! let keytests = [ ! \ [[0x10, 0x21], "S-Pageup", 2], ! \ [[0xA0, 0x21], "S-Pageup", 2], ! \ [[0xA1, 0x21], "S-Pageup", 2], ! \ [[0x11, 0x21], "C-Pageup", 4], ! \ [[0xA2, 0x21], "C-Pageup", 4], ! \ [[0xA3, 0x21], "C-Pageup", 4], ! \ [[0x11, 0x10, 0x21], "C-S-Pageup", 6], ! \ [[0x10, 0x22], "S-PageDown", 2], ! \ [[0xA0, 0x22], "S-PageDown", 2], ! \ [[0xA1, 0x22], "S-PageDown", 2], ! \ [[0x11, 0x22], "C-PageDown", 4], ! \ [[0xA2, 0x22], "C-PageDown", 4], ! \ [[0xA3, 0x22], "C-PageDown", 4], ! \ [[0x11, 0x10, 0x22], "C-S-PageDown", 6], ! \ [[0x10, 0x23], "S-End", 0], ! \ [[0x11, 0x23], "C-End", 0], ! \ [[0x11, 0x10, 0x23], "C-S-End", 4], ! \ [[0x10, 0x24], "S-Home", 0], ! \ [[0x11, 0x24], "C-Home", 0], ! \ [[0x11, 0x10, 0x24], "C-S-Home", 4], ! \ [[0x10, 0x25], "S-Left", 0], ! \ [[0x11, 0x25], "C-Left", 0], ! \ [[0x11, 0x10, 0x25], "C-S-Left", 4], ! \ [[0x10, 0x26], "S-Up", 0], ! \ [[0x11, 0x26], "C-Up", 4], ! \ [[0x11, 0x10, 0x26], "C-S-Up", 4], ! \ [[0x10, 0x27], "S-Right", 0], ! \ [[0x11, 0x27], "C-Right", 0], ! \ [[0x11, 0x10, 0x27], "C-S-Right", 4], ! \ [[0x10, 0x28], "S-Down", 0], ! \ [[0x11, 0x28], "C-Down", 4], ! \ [[0x11, 0x10, 0x28], "C-S-Down", 4], ! \ [[0x11, 0x30], "C-0", 4], ! \ [[0x11, 0x31], "C-1", 4], ! \ [[0x11, 0x32], "C-@", 0], ! \ [[0x11, 0x33], "C-3", 4], ! \ [[0x11, 0x34], "C-4", 4], ! \ [[0x11, 0x35], "C-5", 4], ! \ [[0x11, 0x36], "C-^", 0], ! \ [[0x11, 0x37], "C-7", 4], ! \ [[0x11, 0x38], "C-8", 4], ! \ [[0x11, 0x39], "C-9", 4], ! \ [[0x11, 0x60], "C-0", 4], ! \ [[0x11, 0x61], "C-1", 4], ! \ [[0x11, 0x62], "C-2", 4], ! \ [[0x11, 0x63], "C-3", 4], ! \ [[0x11, 0x64], "C-4", 4], ! \ [[0x11, 0x65], "C-5", 4], ! \ [[0x11, 0x66], "C-6", 4], ! \ [[0x11, 0x67], "C-7", 4], ! \ [[0x11, 0x68], "C-8", 4], ! \ [[0x11, 0x69], "C-9", 4], ! \ [[0x11, 0x6A], "C-*", 4], ! \ [[0x11, 0x6B], "C-+", 4], ! \ [[0x11, 0x6D], "C--", 4], ! \ [[0x11, 0xBD], "C-_", 0], ! \ [[0x11, 0x70], "C-F1", 4], ! \ [[0x11, 0x10, 0x70], "C-S-F1", 4], ! \ [[0x11, 0x71], "C-F2", 4], ! \ [[0x11, 0x10, 0x71], "C-S-F2", 4], ! \ [[0x11, 0x72], "C-F3", 4], ! \ [[0x11, 0x10, 0x72], "C-S-F3", 4], ! \ [[0x11, 0x73], "C-F4", 4], ! \ [[0x11, 0x10, 0x73], "C-S-F4", 4], ! \ [[0x11, 0x74], "C-F5", 4], ! \ [[0x11, 0x10, 0x74], "C-S-F5", 4], ! \ [[0x11, 0x75], "C-F6", 4], ! \ [[0x11, 0x10, 0x75], "C-S-F6", 4], ! \ [[0x11, 0x76], "C-F7", 4], ! \ [[0x11, 0x10, 0x76], "C-S-F7", 4], ! \ [[0x11, 0x77], "C-F8", 4], ! \ [[0x11, 0x10, 0x77], "C-S-F8", 4], ! \ [[0x11, 0x78], "C-F9", 4], ! \ [[0x11, 0x10, 0x78], "C-S-F9", 4], ! \ ] ! ! for [kcodes, kstr, kmod] in keytests ! call SendKeys(kcodes) ! let ch = getcharstr() ! let mod = getcharmod() ! let keycode = eval('"\<' .. kstr .. '>"') ! call assert_equal(keycode, ch, $"key = {kstr}") ! call assert_equal(kmod, mod, $"key = {kstr}") ! endfor bw! endfunc --- 1656,1663 ---- call assert_equal(nr2char(kc - 64), ch) endfor ! " Testing more extensive windows keyboard handling ! " is covered in test_mswin_event.vim bw! endfunc *** ../vim-9.0.1168/src/testdir/test_mswin_event.vim 2023-01-04 18:05:55.408803650 +0000 --- src/testdir/test_mswin_event.vim 2023-01-10 13:37:34.669439101 +0000 *************** *** 155,173 **** \ 'ESCAPE' : 0x1B \ } ! let s:vim_MOD_MASK_SHIFT = 0x02 ! let s:vim_MOD_MASK_CTRL = 0x04 ! let s:vim_MOD_MASK_ALT = 0x08 let s:vim_key_modifiers = [ \ ["", 0, []], ! \ ["S-", 2, [s:VK.SHIFT]], ! \ ["C-", 4, [s:VK.CONTROL]], ! \ ["C-S-", 6, [s:VK.CONTROL, s:VK.SHIFT]], ! \ ["A-", 8, [s:VK.MENU]], ! \ ["A-S-", 10, [s:VK.MENU, s:VK.SHIFT]], ! \ ["A-C-", 12, [s:VK.MENU, s:VK.CONTROL]], ! \ ["A-C-S-", 14, [s:VK.MENU, s:VK.CONTROL, s:VK.SHIFT]], \] " Assuming Standard US PC Keyboard layout --- 155,173 ---- \ 'ESCAPE' : 0x1B \ } ! let s:MOD_MASK_SHIFT = 0x02 ! let s:MOD_MASK_CTRL = 0x04 ! let s:MOD_MASK_ALT = 0x08 let s:vim_key_modifiers = [ \ ["", 0, []], ! \ ["S-", 2, [s:VK.LSHIFT]], ! \ ["C-", 4, [s:VK.LCONTROL]], ! \ ["C-S-", 6, [s:VK.LCONTROL, s:VK.LSHIFT]], ! \ ["A-", 8, [s:VK.LMENU]], ! \ ["A-S-", 10, [s:VK.LMENU, s:VK.LSHIFT]], ! \ ["A-C-", 12, [s:VK.LMENU, s:VK.LCONTROL]], ! \ ["A-C-S-", 14, [s:VK.LMENU, s:VK.LCONTROL, s:VK.LSHIFT]], \] " Assuming Standard US PC Keyboard layout *************** *** 340,346 **** \ ] func s:LoopTestKeyArray(arr) ! " flush out anything in the typeahead buffer while getchar(0) endwhile --- 340,346 ---- \ ] func s:LoopTestKeyArray(arr) ! " flush out the typeahead buffer while getchar(0) endwhile *************** *** 364,376 **** let key = kcodes[0] for key in kcodes if index([s:VK.SHIFT, s:VK.LSHIFT, s:VK.RSHIFT], key) >= 0 ! let modifiers = modifiers + s:vim_MOD_MASK_SHIFT endif if index([s:VK.CONTROL, s:VK.LCONTROL, s:VK.RCONTROL], key) >= 0 ! let modifiers = modifiers + s:vim_MOD_MASK_CTRL endif if index([s:VK.ALT, s:VK.LALT, s:VK.RALT], key) >= 0 ! let modifiers = modifiers + s:vim_MOD_MASK_ALT endif endfor call SendKeyWithModifiers(key, modifiers) --- 364,376 ---- let key = kcodes[0] for key in kcodes if index([s:VK.SHIFT, s:VK.LSHIFT, s:VK.RSHIFT], key) >= 0 ! let modifiers = modifiers + s:MOD_MASK_SHIFT endif if index([s:VK.CONTROL, s:VK.LCONTROL, s:VK.RCONTROL], key) >= 0 ! let modifiers = modifiers + s:MOD_MASK_CTRL endif if index([s:VK.ALT, s:VK.LALT, s:VK.RALT], key) >= 0 ! let modifiers = modifiers + s:MOD_MASK_ALT endif endfor call SendKeyWithModifiers(key, modifiers) *************** *** 387,400 **** call assert_equal(0, mod_mask, $"key = {kstr}") endfor ! " flush out anything in the typeahead buffer while getchar(0) endwhile endfunc " Test MS-Windows key events ! func Test_mswin_key_event() CheckMSWindows new --- 387,400 ---- call assert_equal(0, mod_mask, $"key = {kstr}") endfor ! " flush out the typeahead buffer while getchar(0) endwhile endfunc " Test MS-Windows key events ! func Test_mswin_event_character_keys() CheckMSWindows new *************** *** 422,428 **** call SendKeyGroup([modkey, kc]) let ch = getchar(0) call assert_equal(kc+128, ch) ! call SendKeyWithModifiers(kc, s:vim_MOD_MASK_ALT) let ch = getchar(0) call assert_equal(kc+128, ch) endfor --- 422,428 ---- call SendKeyGroup([modkey, kc]) let ch = getchar(0) call assert_equal(kc+128, ch) ! call SendKeyWithModifiers(kc, s:MOD_MASK_ALT) let ch = getchar(0) call assert_equal(kc+128, ch) endfor *************** *** 451,457 **** call SendKeyGroup([modkey, kc]) let ch = getcharstr(0) call assert_equal(nr2char(kc), ch) ! call SendKeyWithModifiers(kc, s:vim_MOD_MASK_SHIFT) let ch = getcharstr(0) call assert_equal(nr2char(kc), ch) endfor --- 451,457 ---- call SendKeyGroup([modkey, kc]) let ch = getcharstr(0) call assert_equal(nr2char(kc), ch) ! call SendKeyWithModifiers(kc, s:MOD_MASK_SHIFT) let ch = getcharstr(0) call assert_equal(nr2char(kc), ch) endfor *************** *** 464,470 **** call SendKeyGroup([modkey, kc]) let ch = getcharstr(0) call assert_equal(nr2char(kc - 64), ch) ! call SendKeyWithModifiers(kc, s:vim_MOD_MASK_CTRL) let ch = getcharstr(0) call assert_equal(nr2char(kc - 64), ch) endfor --- 464,470 ---- call SendKeyGroup([modkey, kc]) let ch = getcharstr(0) call assert_equal(nr2char(kc - 64), ch) ! call SendKeyWithModifiers(kc, s:MOD_MASK_CTRL) let ch = getcharstr(0) call assert_equal(nr2char(kc - 64), ch) endfor *************** *** 480,588 **** call SendKeyGroup([modkey, kc]) let ch = getchar(0) call assert_equal(kc+160, ch) ! call SendKeyWithModifiers(kc, s:vim_MOD_MASK_ALT) let ch = getchar(0) call assert_equal(kc+160, ch) endfor endfor endif " Test for Function Keys 'F1' to 'F12' " VK codes 112(0x70) - 123(0x7B) " Also with ALL permutatios of modifiers; Shift, Ctrl & Alt ! " NOTE: Windows intercepts some of these keys in the GUI ! if !has("gui_running") ! for [mod_str, vim_mod_mask, mod_keycodes] in s:vim_key_modifiers ! for n in range(1, 12) ! let kstr = $"{mod_str}F{n}" let keycode = eval('"\<' .. kstr .. '>"') ! " flush out anything in the typeahead buffer while getchar(0) endwhile - " call SendKeyGroup(mod_keycodes + [111+n]) call SendKeyWithModifiers(111+n, vim_mod_mask) let ch = getcharstr(0) let mod_mask = getcharmod() call assert_equal(keycode, $"{ch}", $"key = {kstr}") ! " workaround for the virtual termcap maps changing the character instead ! " of sending Shift for mod_key in mod_keycodes if index([s:VK.SHIFT, s:VK.LSHIFT, s:VK.RSHIFT], mod_key) >= 0 ! let mod_mask = mod_mask + s:vim_MOD_MASK_SHIFT endif endfor ! call assert_equal(vim_mod_mask, mod_mask, $"mod = {vim_mod_mask} for key = {kstr}") ! endfor endfor endif ! " Test for the various Ctrl and Shift key combinations. ! let keytests = [ ! \ [[s:VK.SHIFT, s:VK.PRIOR], "S-Pageup", 2], ! \ [[s:VK.LSHIFT, s:VK.PRIOR], "S-Pageup", 2], ! \ [[s:VK.RSHIFT, s:VK.PRIOR], "S-Pageup", 2], ! \ [[s:VK.CONTROL, s:VK.PRIOR], "C-Pageup", 4], ! \ [[s:VK.LCONTROL, s:VK.PRIOR], "C-Pageup", 4], ! \ [[s:VK.RCONTROL, s:VK.PRIOR], "C-Pageup", 4], ! \ [[s:VK.CONTROL, s:VK.SHIFT, s:VK.PRIOR], "C-S-Pageup", 6], ! \ [[s:VK.SHIFT, s:VK.NEXT], "S-PageDown", 2], ! \ [[s:VK.LSHIFT, s:VK.NEXT], "S-PageDown", 2], ! \ [[s:VK.RSHIFT, s:VK.NEXT], "S-PageDown", 2], ! \ [[s:VK.CONTROL, s:VK.NEXT], "C-PageDown", 4], ! \ [[s:VK.LCONTROL, s:VK.NEXT], "C-PageDown", 4], ! \ [[s:VK.RCONTROL, s:VK.NEXT], "C-PageDown", 4], ! \ [[s:VK.CONTROL, s:VK.SHIFT, s:VK.NEXT], "C-S-PageDown", 6], ! \ [[s:VK.SHIFT, s:VK.END], "S-End", 0], ! \ [[s:VK.CONTROL, s:VK.END], "C-End", 0], ! \ [[s:VK.CONTROL, s:VK.SHIFT, s:VK.END], "C-S-End", 4], ! \ [[s:VK.SHIFT, s:VK.HOME], "S-Home", 0], ! \ [[s:VK.CONTROL, s:VK.HOME], "C-Home", 0], ! \ [[s:VK.CONTROL, s:VK.SHIFT, s:VK.HOME], "C-S-Home", 4], ! \ [[s:VK.SHIFT, s:VK.LEFT], "S-Left", 0], ! \ [[s:VK.CONTROL, s:VK.LEFT], "C-Left", 0], ! \ [[s:VK.CONTROL, s:VK.SHIFT, s:VK.LEFT], "C-S-Left", 4], ! \ [[s:VK.SHIFT, s:VK.UP], "S-Up", 0], ! \ [[s:VK.CONTROL, s:VK.UP], "C-Up", 4], ! \ [[s:VK.CONTROL, s:VK.SHIFT, s:VK.UP], "C-S-Up", 4], ! \ [[s:VK.SHIFT, s:VK.RIGHT], "S-Right", 0], ! \ [[s:VK.CONTROL, s:VK.RIGHT], "C-Right", 0], ! \ [[s:VK.CONTROL, s:VK.SHIFT, s:VK.RIGHT], "C-S-Right", 4], ! \ [[s:VK.SHIFT, s:VK.DOWN], "S-Down", 0], ! \ [[s:VK.CONTROL, s:VK.DOWN], "C-Down", 4], ! \ [[s:VK.CONTROL, s:VK.SHIFT, s:VK.DOWN], "C-S-Down", 4], ! \ [[s:VK.CONTROL, s:VK.KEY_0], "C-0", 4], ! \ [[s:VK.CONTROL, s:VK.KEY_1], "C-1", 4], ! \ [[s:VK.CONTROL, s:VK.KEY_2], "C-@", 0], ! \ [[s:VK.CONTROL, s:VK.KEY_3], "C-3", 4], ! \ [[s:VK.CONTROL, s:VK.KEY_4], "C-4", 4], ! \ [[s:VK.CONTROL, s:VK.KEY_5], "C-5", 4], ! \ [[s:VK.CONTROL, s:VK.KEY_6], "C-^", 0], ! \ [[s:VK.CONTROL, s:VK.KEY_7], "C-7", 4], ! \ [[s:VK.CONTROL, s:VK.KEY_8], "C-8", 4], ! \ [[s:VK.CONTROL, s:VK.KEY_9], "C-9", 4], ! \ [[s:VK.CONTROL, s:VK.NUMPAD0], "C-0", 4], ! \ [[s:VK.CONTROL, s:VK.NUMPAD1], "C-1", 4], ! \ [[s:VK.CONTROL, s:VK.NUMPAD2], "C-2", 4], ! \ [[s:VK.CONTROL, s:VK.NUMPAD3], "C-3", 4], ! \ [[s:VK.CONTROL, s:VK.NUMPAD4], "C-4", 4], ! \ [[s:VK.CONTROL, s:VK.NUMPAD5], "C-5", 4], ! \ [[s:VK.CONTROL, s:VK.NUMPAD6], "C-6", 4], ! \ [[s:VK.CONTROL, s:VK.NUMPAD7], "C-7", 4], ! \ [[s:VK.CONTROL, s:VK.NUMPAD8], "C-8", 4], ! \ [[s:VK.CONTROL, s:VK.NUMPAD9], "C-9", 4], ! \ [[s:VK.CONTROL, s:VK.MULTIPLY], "C-*", 4], ! \ [[s:VK.CONTROL, s:VK.ADD], "C-+", 4], ! \ [[s:VK.CONTROL, s:VK.SUBTRACT], "C--", 4], ! \ [[s:VK.CONTROL, s:VK.OEM_MINUS], "C-_", 0] \ ] ! for [kcodes, kstr, kmod] in keytests ! call SendKeyGroup(kcodes) ! let ch = getcharstr(0) ! let mod = getcharmod() ! let keycode = eval('"\<' .. kstr .. '>"') ! call assert_equal(keycode, ch, $"key = {kstr}") ! call assert_equal(kmod, mod, $"mod = {kmod} key = {kstr}") endfor bw! --- 480,645 ---- call SendKeyGroup([modkey, kc]) let ch = getchar(0) call assert_equal(kc+160, ch) ! call SendKeyWithModifiers(kc, s:MOD_MASK_ALT) let ch = getchar(0) call assert_equal(kc+160, ch) endfor endfor endif + endfun + " Test for Function Keys 'F1' to 'F12' " VK codes 112(0x70) - 123(0x7B) " Also with ALL permutatios of modifiers; Shift, Ctrl & Alt ! func Test_mswin_event_function_keys() ! ! if has('gui_running') ! let g:test_is_flaky = 1 ! endif ! ! " NOTE: Windows intercepts these combinations in the GUI ! let gui_nogo = ["A-F1", "A-F2", "A-F3", "A-F4", "A-S-F4", "A-C-S-F4", ! \ "A-F5", "A-F6", "A-F7", "A-F8", "A-C-F8", "A-F9", ! \ "A-F10", "A-F11" , "A-C-F11", "A-C-F12"] ! ! " flush out the typeahead buffer ! while getchar(0) ! endwhile ! ! for [mod_str, vim_mod_mask, mod_keycodes] in s:vim_key_modifiers ! for n in range(1, 12) ! let expected_mod_mask = vim_mod_mask ! let kstr = $"{mod_str}F{n}" ! if !has('gui_running') || (has('gui_running') && n != 10 ! \ && index(gui_nogo, kstr) == -1) let keycode = eval('"\<' .. kstr .. '>"') ! " flush out the typeahead buffer while getchar(0) endwhile call SendKeyWithModifiers(111+n, vim_mod_mask) let ch = getcharstr(0) let mod_mask = getcharmod() call assert_equal(keycode, $"{ch}", $"key = {kstr}") ! " workaround for the virtual termcap maps changing the character ! "instead of sending Shift for mod_key in mod_keycodes if index([s:VK.SHIFT, s:VK.LSHIFT, s:VK.RSHIFT], mod_key) >= 0 ! let expected_mod_mask -= s:MOD_MASK_SHIFT ! break endif endfor ! call assert_equal(expected_mod_mask, mod_mask, $"mod = {expected_mod_mask} for key = {kstr}") ! endif endfor + endfor + endfunc + + func ExtractModifiers(mod_keycodes) + let has_shift = 0 + let has_ctrl = 0 + let has_alt = 0 + for mod_key in a:mod_keycodes + if index([s:VK.SHIFT, s:VK.LSHIFT, s:VK.RSHIFT], mod_key) >= 0 + let has_shift = 1 + endif + if index([s:VK.CONTROL, s:VK.LCONTROL, s:VK.RCONTROL], mod_key) >= 0 + let has_ctrl = 1 + endif + if index([s:VK.MENU, s:VK.LMENU, s:VK.RMENU], mod_key) >= 0 + let has_alt = 1 + endif + endfor + return [has_shift, has_ctrl, has_alt] + endfunc + + " Test for Movement Keys; + " VK_PRIOR 0x21, VK_NEXT 0x22, + " VK_END 0x23, VK_HOME 0x24, + " VK_LEFT 0x25, VK_UP 0x26, + " VK_RIGHT 0x27, VK_DOWN 0x28 + " With ALL permutations of modifiers; none, Shift, Ctrl & Alt + func Test_mswin_event_movement_keys() + + if has('gui_running') + let g:test_is_flaky = 1 endif ! let movement_keys = [ ! \ [s:VK.PRIOR, "PageUp"], ! \ [s:VK.NEXT, "PageDown"], ! \ [s:VK.END, "End"], ! \ [s:VK.HOME, "Home"], ! \ [s:VK.LEFT, "Left"], ! \ [s:VK.UP, "Up"], ! \ [s:VK.RIGHT, "Right"], ! \ [s:VK.DOWN, "Down"], \ ] ! " flush out the typeahead buffer ! while getchar(0) ! endwhile ! ! for [mod_str, vim_mod_mask, mod_keycodes] in s:vim_key_modifiers ! for [kcode, kname] in movement_keys ! let exp_mod_mask = vim_mod_mask ! let kstr = $"{mod_str}{kname}" ! let chstr_eval = eval('"\<' .. kstr .. '>"') ! ! " flush out the typeahead buffer ! while getchar(0) ! endwhile ! execute 'call feedkeys("\<' .. kstr .. '>")' ! let chstr_fk = getcharstr(0) ! call assert_equal(chstr_eval, chstr_fk, $"feedkeys = <{kstr}>") ! ! " flush out the typeahead buffer ! while getchar(0) ! endwhile ! call SendKey(kcode) ! let chstr_alone = getcharstr(0) ! let chstr_alone_end = chstr_alone[len(chstr_alone)-2:len(chstr_alone)-1] ! ! " flush out the typeahead buffer ! while getchar(0) ! endwhile ! call SendKeyGroup(mod_keycodes + [kcode]) ! let chstr_mswin = getcharstr(0) ! let chstr_mswin_end = chstr_mswin[len(chstr_mswin)-2:len(chstr_mswin)-1] ! let mod_mask = getcharmod() ! ! " The virtual termcap maps may** change the character and either; ! " - remove the Shift modifier, or ! " - remove the Ctrl modifier if the Shift modifier was not removed. ! let [has_shift, has_ctrl, has_alt] = ExtractModifiers(mod_keycodes) ! if chstr_alone_end != chstr_mswin_end ! if has_shift != 0 ! let exp_mod_mask -= s:MOD_MASK_SHIFT ! elseif has_ctrl != 0 ! let exp_mod_mask -= s:MOD_MASK_CTRL ! endif ! endif ! " **Note: The appveyor Windows GUI test environments, from VS2017 on, ! " consistently intercepts the Shift modifier WITHOUT changing the ! " MOVEMENT character. This issue does not happen in any github actions ! " CI Windows test environments. Attempted to reproduce this manually ! " on Windows versions; 7, 8.1, 10, 11, Server 2019 and Server 2022, but ! " the issue did not occur on any of those environments. ! " Below is a workaround for the issue. ! if has('gui_running') && has_shift != 0 ! if exp_mod_mask != mod_mask && chstr_eval != chstr_mswin ! let kstr_sub = substitute(kstr, "S-", "", "") ! let chstr_eval = eval('"\<' .. kstr_sub .. '>"') ! if exp_mod_mask - s:MOD_MASK_SHIFT == mod_mask ! let exp_mod_mask -= s:MOD_MASK_SHIFT ! elseif has_ctrl != 0 && exp_mod_mask - s:MOD_MASK_CTRL == mod_mask ! let exp_mod_mask -= s:MOD_MASK_CTRL ! endif ! endif ! endif ! call assert_equal(chstr_eval, chstr_mswin, $"key = {kstr}") ! call assert_equal(exp_mod_mask, mod_mask, $"mod_mask for key = {kstr}") ! endfor endfor bw! *************** *** 628,634 **** endfunc " Test MS-Windows mouse events ! func Test_mswin_mouse_event() CheckMSWindows new --- 685,691 ---- endfunc " Test MS-Windows mouse events ! func Test_mswin_event_mouse() CheckMSWindows new *************** *** 940,946 **** call assert_fails("sandbox call test_mswin_event('key', {'event': 'keydown', 'keycode': 61 })", 'E48:') ! " flush out anything in the typeahead buffer while getchar(0) endwhile endfunc --- 997,1003 ---- call assert_fails("sandbox call test_mswin_event('key', {'event': 'keydown', 'keycode': 61 })", 'E48:') ! " flush out the typeahead buffer while getchar(0) endwhile endfunc *** ../vim-9.0.1168/src/version.c 2023-01-10 12:37:33.253580676 +0000 --- src/version.c 2023-01-10 13:39:55.529798073 +0000 *************** *** 697,698 **** --- 697,700 ---- { /* Add new patch number below this line */ + /**/ + 1169, /**/ -- Your company is doomed if your primary product is overhead transparencies. (Scott Adams - The Dilbert principle) /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///