From b98348258d6bb4476d5de822369687f2b70d05b7 Mon Sep 17 00:00:00 2001 From: Shougo Matsushita Date: Tue, 17 Nov 2020 11:33:30 +0900 Subject: 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 vim/vim#7306) https://github.com/vim/vim/commit/714cbe5b212abbecb578b90424d89f47142e8f25 --- src/nvim/popupmnu.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/nvim/popupmnu.c b/src/nvim/popupmnu.c index ac0c1f6eb1..f242b7d71a 100644 --- a/src/nvim/popupmnu.c +++ b/src/nvim/popupmnu.c @@ -376,6 +376,8 @@ void pum_display(pumitem_T *array, int size, int selected, bool array_changed, // 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(); } /// Redraw the popup menu, using "pum_first" and "pum_selected". @@ -534,7 +536,17 @@ void pum_redraw(void) xfree(st); col -= width; } else { - grid_puts_len(&pum_grid, st, (int)STRLEN(st), row, col, attr); + int size = (int)STRLEN(st); + int cells = (int)mb_string2cells(st); + + // only draw the text that fits + while (size > 0 && col + cells > pum_width + pum_col) { + size--; + size -= utf_head_off(st, st + size); + cells -= utf_ptr2cells(st + size); + } + + grid_puts_len(&pum_grid, st, size, row, col, attr); xfree(st); col += width; } @@ -824,10 +836,6 @@ static int pum_set_selected(int n, int repeat) } } - if (!resized) { - pum_redraw(); - } - return resized; } -- cgit