diff src/getchar.c @ 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 6a2a38b26caf
children 109aa4913cba
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;