# HG changeset patch # User Bram Moolenaar # Date 1605550503 -3600 # Node ID 6145a1232c3a40c856a9493b6e065a9c0009299b # Parent 040778b130ee4ab3d873eab484876cf1d4f12599 patch 8.2.1995: the popup menu can cause too much redrawing Commit: https://github.com/vim/vim/commit/714cbe5b212abbecb578b90424d89f47142e8f25 Author: Bram Moolenaar Date: Mon Nov 16 19:12:00 2020 +0100 patch 8.2.1995: the popup menu can cause too much redrawing Problem: The popup menu can cause too much redrawing. Solution: Reduce the length of the displayed text. (Yasuhiro Matsumoto, closes #7306) diff --git a/src/popupmenu.c b/src/popupmenu.c --- a/src/popupmenu.c +++ b/src/popupmenu.c @@ -361,6 +361,8 @@ pum_display( // redo the positioning. Limit this to two times, when there is not // much room the window size will keep changing. } while (pum_set_selected(selected, redo_count) && ++redo_count <= 2); + + pum_redraw(); } /* @@ -541,8 +543,23 @@ pum_redraw(void) { if (st != NULL) { - screen_puts_len(st, (int)STRLEN(st), row, col, - attr); + int size = (int)STRLEN(st); + int cells = (*mb_string2cells)(st, size); + + // only draw the text that fits + while (size > 0 + && col + cells > pum_width + pum_col) + { + --size; + if (has_mbyte) + { + size -= (*mb_head_off)(st, st + size); + cells -= (*mb_ptr2cells)(st + size); + } + else + --cells; + } + screen_puts_len(st, size, row, col, attr); vim_free(st); } col += width; @@ -990,9 +1007,6 @@ pum_set_selected(int n, int repeat UNUSE popup_hide_info(); #endif - if (!resized) - pum_redraw(); - return resized; } diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1995, +/**/ 1994, /**/ 1993,