From 714cbe5b212abbecb578b90424d89f47142e8f25 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Mon, 16 Nov 2020 19:12:00 +0100 Subject: [PATCH] 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) --- src/popupmenu.c | 24 +++++++++++++++++++----- src/version.c | 2 ++ 2 files changed, 21 insertions(+), 5 deletions(-) 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, /**/ -- 2.50.1