1
0
forked from aniani/vim

patch 8.1.1751: when redrawing popups plines_win() may be called often

Problem:    When redrawing popups plines_win() may be called often.
Solution:   Pass a cache to mouse_comp_pos().
This commit is contained in:
Bram Moolenaar
2019-07-26 21:01:29 +02:00
parent 8a5c29aee9
commit 9d5ffceb3f
6 changed files with 52 additions and 23 deletions

View File

@@ -3381,7 +3381,7 @@ retnomove:
#endif
/* compute the position in the buffer line from the posn on the screen */
if (mouse_comp_pos(curwin, &row, &col, &curwin->w_cursor.lnum))
if (mouse_comp_pos(curwin, &row, &col, &curwin->w_cursor.lnum, NULL))
mouse_past_bottom = TRUE;
/* Start Visual mode before coladvance(), for when 'sel' != "old" */
@@ -3429,8 +3429,12 @@ retnomove:
#if defined(FEAT_MOUSE) || defined(FEAT_TEXT_PROP) || defined(PROTO)
/*
* Compute the position in the buffer line from the posn on the screen in
* Compute the buffer line position from the screen position "rowp" / "colp" in
* window "win".
* "plines_cache" can be NULL (no cache) or an array with "win->w_height"
* entries that caches the plines_win() result from a previous call. Entry is
* zero if not computed yet. There must be no text or setting changes since
* the entry is put in the cache.
* Returns TRUE if the position is below the last line.
*/
int
@@ -3438,7 +3442,8 @@ mouse_comp_pos(
win_T *win,
int *rowp,
int *colp,
linenr_T *lnump)
linenr_T *lnump,
int *plines_cache)
{
int col = *colp;
int row = *rowp;
@@ -3456,23 +3461,32 @@ mouse_comp_pos(
while (row > 0)
{
#ifdef FEAT_DIFF
/* Don't include filler lines in "count" */
if (win->w_p_diff
# ifdef FEAT_FOLDING
&& !hasFoldingWin(win, lnum, NULL, NULL, TRUE, NULL)
# endif
)
{
if (lnum == win->w_topline)
row -= win->w_topfill;
else
row -= diff_check_fill(win, lnum);
count = plines_win_nofill(win, lnum, TRUE);
}
int cache_idx = lnum - win->w_topline;
if (plines_cache != NULL && plines_cache[cache_idx] > 0)
count = plines_cache[cache_idx];
else
{
#ifdef FEAT_DIFF
/* Don't include filler lines in "count" */
if (win->w_p_diff
# ifdef FEAT_FOLDING
&& !hasFoldingWin(win, lnum, NULL, NULL, TRUE, NULL)
# endif
)
{
if (lnum == win->w_topline)
row -= win->w_topfill;
else
row -= diff_check_fill(win, lnum);
count = plines_win_nofill(win, lnum, TRUE);
}
else
#endif
count = plines_win(win, lnum, TRUE);
count = plines_win(win, lnum, TRUE);
if (plines_cache != NULL)
plines_cache[cache_idx] = count;
}
if (count > row)
break; /* Position is in this buffer line. */
#ifdef FEAT_FOLDING
@@ -3626,7 +3640,7 @@ get_fpos_of_mouse(pos_T *mpos)
return IN_UNKNOWN;
/* compute the position in the buffer line from the posn on the screen */
if (mouse_comp_pos(curwin, &row, &col, &mpos->lnum))
if (mouse_comp_pos(curwin, &row, &col, &mpos->lnum, NULL))
return IN_STATUS_LINE; /* past bottom */
mpos->col = vcol2col(wp, mpos->lnum, col);