changeset 28187:d27a9eed9849 v8.2.4619

patch 8.2.4619: mapping is cancelled when mouse moves and popup is visible Commit: https://github.com/vim/vim/commit/f8e43f6107f3a83b8c74a84c4c8f99598e2dc4c0 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Mar 24 15:15:15 2022 +0000 patch 8.2.4619: mapping is cancelled when mouse moves and popup is visible Problem: Mapping is cancelled when mouse moves and popup is visible. Solution: Only generate mouse moved events when a popup may use them. (closes #10004)
author Bram Moolenaar <Bram@vim.org>
date Thu, 24 Mar 2022 16:30:03 +0100
parents 5d3592802fb9
children 01d18a7ad1cf
files src/globals.h src/gui.c src/popupwin.c src/version.c
diffstat 4 files changed, 32 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/globals.h
+++ b/src/globals.h
@@ -736,6 +736,9 @@ EXTERN win_T	*popup_dragwin INIT(= NULL)
 // Set to TRUE if there is any visible popup window.
 EXTERN int	popup_visible INIT(= FALSE);
 
+// Set to TRUE if a visible popup window may use a MOUSE_MOVE event
+EXTERN int	popup_uses_mouse_move INIT(= FALSE);
+
 EXTERN int	text_prop_frozen INIT(= 0);
 #endif
 
--- a/src/gui.c
+++ b/src/gui.c
@@ -4968,7 +4968,7 @@ gui_mouse_moved(int x, int y)
     gui_mouse_focus(x, y);
 
 #ifdef FEAT_PROP_POPUP
-    if (popup_visible)
+    if (popup_uses_mouse_move)
 	// Generate a mouse-moved event, so that the popup can perhaps be
 	// closed, just like in the terminal.
 	gui_send_mouse_event(MOUSE_MOVE, x, y, FALSE, 0);
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -150,6 +150,29 @@ set_mousemoved_values(win_T *wp)
     wp->w_popup_mouse_maxcol = mouse_col;
 }
 
+    static void
+update_popup_uses_mouse_move(void)
+{
+    popup_uses_mouse_move = FALSE;
+    if (popup_visible)
+    {
+	win_T *wp;
+
+	FOR_ALL_POPUPWINS(wp)
+	    if (wp->w_popup_mouse_row != 0)
+	    {
+		popup_uses_mouse_move = TRUE;
+		return;
+	    }
+	FOR_ALL_POPUPWINS_IN_TAB(curtab, wp)
+	    if (wp->w_popup_mouse_row != 0)
+	    {
+		popup_uses_mouse_move = TRUE;
+		return;
+	    }
+    }
+}
+
 /*
  * Used when popup options contain "moved" with "word" or "WORD".
  */
@@ -3586,7 +3609,7 @@ popup_need_position_adjust(win_T *wp)
 /*
  * Update "popup_mask" if needed.
  * Also recomputes the popup size and positions.
- * Also updates "popup_visible".
+ * Also updates "popup_visible" and "popup_uses_mouse_move".
  * Also marks window lines for redrawing.
  */
     void
@@ -3755,6 +3778,8 @@ may_update_popup_mask(int type)
 
 	vim_free(plines_cache);
     }
+
+    update_popup_uses_mouse_move();
 }
 
 /*
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    4619,
+/**/
     4618,
 /**/
     4617,