summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-08-18 19:23:45 +0200
committerBram Moolenaar <Bram@vim.org>2019-08-18 19:23:45 +0200
commitf0bc15c769b60f472d411b3ef98d57db510113c1 (patch)
tree7f970397d8e98743ab01e33b707de5a97ded25ac /src
parent9513d91be02f654658b8b33ff429a52ff3c4de12 (diff)
downloadvim-git-f0bc15c769b60f472d411b3ef98d57db510113c1.tar.gz
patch 8.1.1884: cannot use mouse scroll wheel in popup in Insert modev8.1.1884
Problem: Cannot use mouse scroll wheel in popup in Insert mode. Mouse clicks in popup close the popup menu. Solution: Check if the mouse is in a popup window. Do not let mouse events close the popup menu. (closes #4544)
Diffstat (limited to 'src')
-rw-r--r--src/edit.c6
-rw-r--r--src/insexpand.c30
-rw-r--r--src/popupmnu.c12
-rw-r--r--src/version.c2
4 files changed, 48 insertions, 2 deletions
diff --git a/src/edit.c b/src/edit.c
index 4de17aa18..83b4be784 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -5267,7 +5267,7 @@ ins_mousescroll(int dir)
col = mouse_col;
/* find the window at the pointer coordinates */
- wp = mouse_find_win(&row, &col, FAIL_POPUP);
+ wp = mouse_find_win(&row, &col, FIND_POPUP);
if (wp == NULL)
return;
curwin = wp;
@@ -5288,6 +5288,10 @@ ins_mousescroll(int dir)
(long)(curwin->w_botline - curwin->w_topline));
else
scroll_redraw(dir, 3L);
+# ifdef FEAT_TEXT_PROP
+ if (WIN_IS_POPUP(curwin))
+ popup_set_firstline(curwin);
+# endif
}
#ifdef FEAT_GUI
else
diff --git a/src/insexpand.c b/src/insexpand.c
index 136fb67f0..a86630f62 100644
--- a/src/insexpand.c
+++ b/src/insexpand.c
@@ -1943,6 +1943,36 @@ ins_compl_prep(int c)
|| c == K_MOUSELEFT || c == K_MOUSERIGHT)
return retval;
+#ifdef FEAT_TEXT_PROP
+ // Ignore mouse events in a popup window
+ if (is_mouse_key(c))
+ {
+ // Ignore drag and release events, the position does not need to be in
+ // the popup and it may have just closed.
+ if (c == K_LEFTRELEASE
+ || c == K_LEFTRELEASE_NM
+ || c == K_MIDDLERELEASE
+ || c == K_RIGHTRELEASE
+ || c == K_X1RELEASE
+ || c == K_X2RELEASE
+ || c == K_LEFTDRAG
+ || c == K_MIDDLEDRAG
+ || c == K_RIGHTDRAG
+ || c == K_X1DRAG
+ || c == K_X2DRAG)
+ return retval;
+ if (popup_visible)
+ {
+ int row = mouse_row;
+ int col = mouse_col;
+ win_T *wp = mouse_find_win(&row, &col, FIND_POPUP);
+
+ if (wp != NULL && WIN_IS_POPUP(wp))
+ return retval;
+ }
+ }
+#endif
+
// Set "compl_get_longest" when finding the first matches.
if (ctrl_x_mode == CTRL_X_NOT_DEFINED_YET
|| (ctrl_x_mode == CTRL_X_NORMAL && !compl_started))
diff --git a/src/popupmnu.c b/src/popupmnu.c
index 97b2fff1e..4d84ba843 100644
--- a/src/popupmnu.c
+++ b/src/popupmnu.c
@@ -638,6 +638,7 @@ pum_set_selected(int n, int repeat)
{
int resized = FALSE;
int context = pum_height / 2;
+ int prev_selected = pum_selected;
#ifdef FEAT_TEXT_PROP
int has_info = FALSE;
#endif
@@ -826,7 +827,16 @@ pum_set_selected(int n, int repeat)
curbuf->b_changed = 0;
curbuf->b_p_ma = FALSE;
- curwin->w_cursor.lnum = 1;
+ if (pum_selected != prev_selected)
+ {
+# ifdef FEAT_TEXT_PROP
+ curwin->w_firstline = 1;
+# endif
+ curwin->w_topline = 1;
+ }
+ else if (curwin->w_topline > curbuf->b_ml.ml_line_count)
+ curwin->w_topline = curbuf->b_ml.ml_line_count;
+ curwin->w_cursor.lnum = curwin->w_topline;
curwin->w_cursor.col = 0;
if (use_popup && win_valid(curwin_save))
redraw_win_later(curwin_save, SOME_VALID);
diff --git a/src/version.c b/src/version.c
index e39567f58..85d47c679 100644
--- a/src/version.c
+++ b/src/version.c
@@ -770,6 +770,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1884,
+/**/
1883,
/**/
1882,