diff options
author | Shougo Matsushita <Shougo.Matsu@gmail.com> | 2020-11-17 11:33:30 +0900 |
---|---|---|
committer | Shougo Matsushita <Shougo.Matsu@gmail.com> | 2020-11-17 14:42:29 +0900 |
commit | b98348258d6bb4476d5de822369687f2b70d05b7 (patch) | |
tree | 7b9c7bf501052d76ff6c402b370b0aac08964718 | |
parent | ce70edb80e965c90fadafea72d758b4d2d531077 (diff) | |
download | rneovim-b98348258d6bb4476d5de822369687f2b70d05b7.tar.gz rneovim-b98348258d6bb4476d5de822369687f2b70d05b7.tar.bz2 rneovim-b98348258d6bb4476d5de822369687f2b70d05b7.zip |
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
-rw-r--r-- | src/nvim/popupmnu.c | 18 |
1 files changed, 13 insertions, 5 deletions
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; } |