From: Bram Moolenaar Date: Mon, 16 Nov 2020 18:12:00 +0000 (+0100) Subject: patch 8.2.1995: the popup menu can cause too much redrawing X-Git-Tag: v8.2.1995 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=714cbe5b212abbecb578b90424d89f47142e8f25;p=vim 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 index 8033d7211..f4f210b5d 100644 --- 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 UNUSED) popup_hide_info(); #endif - if (!resized) - pum_redraw(); - return resized; } diff --git a/src/version.c b/src/version.c index 8418d98d2..8de530879 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1995, /**/ 1994, /**/