Mercurial > vim
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(); } /*