Mercurial > vim
changeset 31168:25f6c7f77c70 v9.0.0918
patch 9.0.0918: MS-Windows: modifier keys do not work with mouse scroll event
Commit: https://github.com/vim/vim/commit/0319306f20d2a5989d1f5639a47d77cebeac2f29
Author: Christopher Plewright <chris@createng.com>
Date: Tue Nov 22 12:58:27 2022 +0000
patch 9.0.0918: MS-Windows: modifier keys do not work with mouse scroll event
Problem: MS-Windows: modifier keys do not work with mouse scroll events.
Solution: Use K_SPECIAL instead of CSI for the modifier keys. (Christopher
Plewright, closes #11587)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Tue, 22 Nov 2022 14:00:04 +0100 |
parents | 8cf717ffd0de |
children | 7bff4aaf060c |
files | src/getchar.c src/os_win32.c src/term.c src/version.c |
diffstat | 4 files changed, 27 insertions(+), 29 deletions(-) [+] |
line wrap: on
line diff
--- a/src/getchar.c +++ b/src/getchar.c @@ -1743,11 +1743,9 @@ vgetc(void) --allow_keys; } - // Get two extra bytes for special keys + // Get two extra bytes for special keys, handle modifiers. if (c == K_SPECIAL -#if defined(FEAT_GUI) || defined(MSWIN) - // GUI codes start with CSI; MS-Windows sends mouse scroll - // events with CSI. +#ifdef FEAT_GUI || c == CSI #endif ) @@ -2520,32 +2518,12 @@ handle_mapping( && State != MODE_CONFIRM && !at_ins_compl_key()) { -#if defined(FEAT_GUI) || defined(MSWIN) - if (tb_c1 == CSI -# if !defined(MSWIN) - && gui.in_use -# endif - && typebuf.tb_len >= 2 - && (typebuf.tb_buf[typebuf.tb_off + 1] == KS_MODIFIER -# if defined(MSWIN) - || (typebuf.tb_len >= 3 -# ifdef FEAT_GUI - && !gui.in_use -# endif - && typebuf.tb_buf[typebuf.tb_off + 1] == KS_EXTRA - && (typebuf.tb_buf[typebuf.tb_off + 2] == KE_MOUSEUP - || typebuf.tb_buf[typebuf.tb_off + 2] == KE_MOUSEDOWN - || typebuf.tb_buf[typebuf.tb_off + 2] == KE_MOUSELEFT - || typebuf.tb_buf[typebuf.tb_off + 2] == KE_MOUSERIGHT) - ) -# endif - ) - ) +#ifdef FEAT_GUI + if (gui.in_use && tb_c1 == CSI && typebuf.tb_len >= 2 + && typebuf.tb_buf[typebuf.tb_off + 1] == KS_MODIFIER) { // The GUI code sends CSI KS_MODIFIER {flags}, but mappings expect // K_SPECIAL KS_MODIFIER {flags}. - // MS-Windows sends mouse scroll events CSI KS_EXTRA {what}, but - // non-GUI mappings expect K_SPECIAL KS_EXTRA {what}. tb_c1 = K_SPECIAL; } #endif
--- a/src/os_win32.c +++ b/src/os_win32.c @@ -2047,7 +2047,8 @@ mch_inchar( { if (modifiers > 0) { - typeahead[typeaheadlen++] = CSI; + // use K_SPECIAL instead of CSI to make mappings work + typeahead[typeaheadlen++] = K_SPECIAL; typeahead[typeaheadlen++] = KS_MODIFIER; typeahead[typeaheadlen++] = modifiers; }
--- a/src/term.c +++ b/src/term.c @@ -5125,7 +5125,7 @@ handle_csi( csi_len, offset, buf, bufsize, buflen); } - // Key without modifier (bad Kitty may send this): + // Key without modifier (Kitty sends this for Esc): // {lead}{key}u else if (argc == 1 && trail == 'u') { @@ -5456,6 +5456,23 @@ check_termcode( } else #endif // FEAT_GUI +#ifdef MSWIN + if (len >= 3 && tp[0] == CSI && tp[1] == KS_EXTRA + && (tp[2] == KE_MOUSEUP + || tp[2] == KE_MOUSEDOWN + || tp[2] == KE_MOUSELEFT + || tp[2] == KE_MOUSERIGHT)) + { + // MS-Windows console sends mouse scroll events encoded: + // - CSI + // - KS_EXTRA + // - {KE_MOUSE[UP|DOWN|LEFT|RIGHT]} + slen = 3; + key_name[0] = tp[1]; + key_name[1] = tp[2]; + } + else +#endif { int mouse_index_found = -1;