From f8e43f6107f3a83b8c74a84c4c8f99598e2dc4c0 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 24 Mar 2022 15:15:15 +0000 Subject: 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) --- src/globals.h | 3 +++ src/gui.c | 2 +- src/popupwin.c | 27 ++++++++++++++++++++++++++- src/version.c | 2 ++ 4 files changed, 32 insertions(+), 2 deletions(-) (limited to 'src') 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 @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4619, /**/ 4618, /**/ -- cgit v1.2.1