changeset 30936:38d20a201beb v9.0.0802

patch 9.0.0802: MS-Windows: cannot map console mouse scroll events Commit: https://github.com/vim/vim/commit/4c36678ffd1f933a6d4a12415994dea15e4ccec6 Author: Christopher Plewright <chris@createng.com> Date: Thu Oct 20 13:11:15 2022 +0100 patch 9.0.0802: MS-Windows: cannot map console mouse scroll events Problem: MS-Windows: cannot map console mouse scroll events. Solution: Change CSI to K_SPECIAL when checking for a mapping. (Christopher Plewright, closes #11410)
author Bram Moolenaar <Bram@vim.org>
date Thu, 20 Oct 2022 14:15:06 +0200
parents 464a04119e94
children d192688c8bab
files src/getchar.c src/os_win32.c src/version.c
diffstat 3 files changed, 25 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -2520,12 +2520,29 @@ handle_mapping(
 	    && State != MODE_CONFIRM
 	    && !at_ins_compl_key())
     {
-#ifdef FEAT_GUI
-	if (gui.in_use && tb_c1 == CSI && typebuf.tb_len >= 2
-		&& typebuf.tb_buf[typebuf.tb_off + 1] == KS_MODIFIER)
+#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
+		      && 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
+		   )
+	   )
 	{
 	    // 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
+	    // mappings expect K_SPECIAL KS_EXTRA {what}.
 	    tb_c1 = K_SPECIAL;
 	}
 #endif
@@ -2568,7 +2585,8 @@ handle_mapping(
 		    && (mp->m_mode & local_State)
 		    && !(mp->m_simplified && seenModifyOtherKeys
 						     && typebuf.tb_maplen == 0)
-		    && ((mp->m_mode & MODE_LANGMAP) == 0 || typebuf.tb_maplen == 0))
+		    && ((mp->m_mode & MODE_LANGMAP) == 0
+						    || typebuf.tb_maplen == 0))
 	    {
 #ifdef FEAT_LANGMAP
 		int	nomap = nolmaplen;
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -1265,7 +1265,7 @@ decode_mouse_wheel(MOUSE_EVENT_RECORD *p
 #ifdef FEAT_PROP_POPUP
     int lcol = g_xMouse;
     int lrow = g_yMouse;
-    wp = mouse_find_win(&lrow, &lcol, FAIL_POPUP);
+    wp = mouse_find_win(&lrow, &lcol, FIND_POPUP);
     if (wp != NULL && popup_is_popup(wp))
     {
 	g_nMouseClick = -1;
--- 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 */
 /**/
+    802,
+/**/
     801,
 /**/
     800,