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 8033d72..f4f210b 100644
--- a/src/popupmenu.c
+++ b/src/popupmenu.c
@@ -361,6 +361,8 @@
// 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 @@
{
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 @@
popup_hide_info();
#endif
- if (!resized)
- pum_redraw();
-
return resized;
}