# HG changeset patch # User Bram Moolenaar # Date 1648135803 -3600 # Node ID d27a9eed9849845aaa49adb052a34d64fdf1b55f # Parent 5d3592802fb97cb2a8a33f62bbfee77f263c9b55 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 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) diff --git a/src/globals.h b/src/globals.h --- 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 diff --git a/src/gui.c b/src/gui.c --- 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 --- 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 --- 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,