patch 8.1.1884: cannot use mouse scroll wheel in popup in Insert mode
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)
diff --git a/src/edit.c b/src/edit.c
index 4de17aa..83b4be7 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -5267,7 +5267,7 @@
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 @@
(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 136fb67..a86630f 100644
--- a/src/insexpand.c
+++ b/src/insexpand.c
@@ -1943,6 +1943,36 @@
|| 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 97b2fff..4d84ba8 100644
--- a/src/popupmnu.c
+++ b/src/popupmnu.c
@@ -638,6 +638,7 @@
{
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 @@
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 e39567f..85d47c6 100644
--- a/src/version.c
+++ b/src/version.c
@@ -770,6 +770,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1884,
+/**/
1883,
/**/
1882,