# HG changeset patch # User Bram Moolenaar # Date 1669122004 -3600 # Node ID 25f6c7f77c700f98a45d1636c3025b445d4723c6 # Parent 8cf717ffd0dedf363533e7a691677c8c3c6fe48b 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 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) diff --git a/src/getchar.c b/src/getchar.c --- 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 diff --git a/src/os_win32.c b/src/os_win32.c --- 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; } diff --git a/src/term.c b/src/term.c --- 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; diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 918, +/**/ 917, /**/ 916,