summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-03-24 15:15:15 +0000
committerBram Moolenaar <Bram@vim.org>2022-03-24 15:15:15 +0000
commitf8e43f6107f3a83b8c74a84c4c8f99598e2dc4c0 (patch)
tree2680c58532075caa477d253231fa63e15fc586e9
parentf4f0525c34d2aa32f214155b0dadcd274ed05dd1 (diff)
downloadvim-git-f8e43f6107f3a83b8c74a84c4c8f99598e2dc4c0.tar.gz
patch 8.2.4619: mapping is cancelled when mouse moves and popup is visiblev8.2.4619
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)
-rw-r--r--src/globals.h3
-rw-r--r--src/gui.c2
-rw-r--r--src/popupwin.c27
-rw-r--r--src/version.c2
4 files changed, 32 insertions, 2 deletions
diff --git a/src/globals.h b/src/globals.h
index 1a50649a1..cd8893b30 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -736,6 +736,9 @@ EXTERN win_T *popup_dragwin INIT(= NULL); // popup window being dragged
// 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
diff --git a/src/gui.c b/src/gui.c
index fb589fc1c..3e383a4b4 100644
--- 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);
diff --git a/src/popupwin.c b/src/popupwin.c
index 0aca7d324..55f98f8a6 100644
--- 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();
}
/*
diff --git a/src/version.c b/src/version.c
index 39eefb5f6..693cebc06 100644
--- 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,