# HG changeset patch # User Bram Moolenaar # Date 1566149403 -7200 # Node ID b423bd231f3313e5f154632948668728b73355a2 # Parent fa8b9059947ba223d03010af709aa19f4bb2b96e 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 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) diff --git a/src/edit.c b/src/edit.c --- 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 --- 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 --- 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 --- 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,