From 0319306f20d2a5989d1f5639a47d77cebeac2f29 Mon Sep 17 00:00:00 2001 From: Christopher Plewright Date: Tue, 22 Nov 2022 12:58:27 +0000 Subject: [PATCH] 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) --- src/getchar.c | 32 +++++--------------------------- src/os_win32.c | 3 ++- src/term.c | 19 ++++++++++++++++++- src/version.c | 2 ++ 4 files changed, 27 insertions(+), 29 deletions(-) diff --git a/src/getchar.c b/src/getchar.c index 2fa68a789..e2474be0b 100644 --- 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 index 36051f485..ead50e186 100644 --- 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 index 61c2311fa..3b2c3c063 100644 --- 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 index 4a2ad7782..325873669 100644 --- a/src/version.c +++ b/src/version.c @@ -695,6 +695,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 918, /**/ 917, /**/ -- 2.40.0