changeset 17775:b423bd231f33 v8.1.1884

patch 8.1.1884: cannot use mouse scroll wheel in popup in Insert mode commit https://github.com/vim/vim/commit/f0bc15c769b60f472d411b3ef98d57db510113c1 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Aug 18 19:23:45 2019 +0200 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)
author Bram Moolenaar <Bram@vim.org>
date Sun, 18 Aug 2019 19:30:03 +0200
parents fa8b9059947b
children 5c9a1d9d02ad
files src/edit.c src/insexpand.c src/popupmnu.c src/version.c
diffstat 4 files changed, 48 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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))
--- 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);
--- 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,