summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-06-16 15:32:38 +0200
committerBram Moolenaar <Bram@vim.org>2018-06-16 15:32:38 +0200
commit6ba3ec1bace67513a352326864cebc16b3c5bc56 (patch)
treed8084d502418d4373963b7fe9f04ef8338e094af
parent43dee181f596c81b99e200b6cdfeb02ecfed42c8 (diff)
downloadvim-6ba3ec1bace67513a352326864cebc16b3c5bc56.zip
patch 8.1.0057: popup menu displayed wrong when using autocmd
Problem: Popup menu displayed wrong when using autocmd. Solution: Use aucmd_prepbuf(). Force updating status line if the popup menu is going to be redrawn anyway. (Christian Brabandt, closes #3009)
-rw-r--r--src/edit.c10
-rw-r--r--src/proto/screen.pro1
-rw-r--r--src/screen.c21
-rw-r--r--src/version.c2
4 files changed, 24 insertions, 10 deletions
diff --git a/src/edit.c b/src/edit.c
index 92c9d6ad4..326a382b5 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -1704,7 +1704,12 @@ ins_redraw(
#endif
)
{
+ aco_save_T aco;
+
+ // save and restore curwin and curbuf, in case the autocmd changes them
+ aucmd_prepbuf(&aco, curbuf);
apply_autocmds(EVENT_TEXTCHANGEDI, NULL, NULL, FALSE, curbuf);
+ aucmd_restbuf(&aco);
curbuf->b_last_changedtick = CHANGEDTICK(curbuf);
}
@@ -1716,7 +1721,12 @@ ins_redraw(
&& curbuf->b_last_changedtick_pum != CHANGEDTICK(curbuf)
&& pum_visible())
{
+ aco_save_T aco;
+
+ // save and restore curwin and curbuf, in case the autocmd changes them
+ aucmd_prepbuf(&aco, curbuf);
apply_autocmds(EVENT_TEXTCHANGEDP, NULL, NULL, FALSE, curbuf);
+ aucmd_restbuf(&aco);
curbuf->b_last_changedtick_pum = CHANGEDTICK(curbuf);
}
#endif
diff --git a/src/proto/screen.pro b/src/proto/screen.pro
index 5760dae1b..2b8a6fd02 100644
--- a/src/proto/screen.pro
+++ b/src/proto/screen.pro
@@ -25,7 +25,6 @@ void status_redraw_curbuf(void);
void redraw_statuslines(void);
void win_redraw_last_status(frame_T *frp);
void win_redr_status_matches(expand_T *xp, int num_matches, char_u **matches, int match, int showtail);
-void win_redr_status(win_T *wp);
int stl_connected(win_T *wp);
int get_keymap_str(win_T *wp, char_u *fmt, char_u *buf, int len);
void screen_putchar(int c, int row, int col, int attr);
diff --git a/src/screen.c b/src/screen.c
index f2c58bee7..cd2931592 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -125,6 +125,7 @@ static int redrawing_for_callback = 0;
static schar_T *current_ScreenLine;
static void win_update(win_T *wp);
+static void win_redr_status(win_T *wp, int ignore_pum);
static void win_draw_end(win_T *wp, int c1, int c2, int row, int endrow, hlf_T hl);
#ifdef FEAT_FOLDING
static void fold_line(win_T *wp, long fold_count, foldinfo_T *foldinfo, linenr_T lnum, int row);
@@ -774,7 +775,7 @@ update_screen(int type_arg)
if (wp->w_redr_status)
{
cursor_off();
- win_redr_status(wp);
+ win_redr_status(wp, TRUE); // any popup menu will be redrawn below
}
}
#if defined(FEAT_SEARCH_EXTRA)
@@ -1030,7 +1031,7 @@ update_debug_sign(buf_T *buf, linenr_T lnum)
if (wp->w_redr_type != 0)
win_update(wp);
if (wp->w_redr_status)
- win_redr_status(wp);
+ win_redr_status(wp, FALSE);
}
update_finish();
@@ -1074,7 +1075,7 @@ updateWindow(win_T *wp)
|| *p_stl != NUL || *wp->w_p_stl != NUL
# endif
)
- win_redr_status(wp);
+ win_redr_status(wp, FALSE);
update_finish();
}
@@ -6535,7 +6536,7 @@ redraw_statuslines(void)
FOR_ALL_WINDOWS(wp)
if (wp->w_redr_status)
- win_redr_status(wp);
+ win_redr_status(wp, FALSE);
if (redraw_tabline)
draw_tabline();
}
@@ -6864,9 +6865,11 @@ win_redr_status_matches(
* Redraw the status line of window wp.
*
* If inversion is possible we use it. Else '=' characters are used.
+ * If "ignore_pum" is TRUE, also redraw statusline when the popup menu is
+ * displayed.
*/
- void
-win_redr_status(win_T *wp)
+ static void
+win_redr_status(win_T *wp, int ignore_pum)
{
int row;
char_u *p;
@@ -6890,9 +6893,9 @@ win_redr_status(win_T *wp)
}
else if (!redrawing()
#ifdef FEAT_INS_EXPAND
- /* don't update status line when popup menu is visible and may be
- * drawn over it */
- || pum_visible()
+ // don't update status line when popup menu is visible and may be
+ // drawn over it, unless it will be redrawn later
+ || (!ignore_pum && pum_visible())
#endif
)
{
diff --git a/src/version.c b/src/version.c
index bd8efafeb..f4ecfe755 100644
--- a/src/version.c
+++ b/src/version.c
@@ -762,6 +762,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 57,
+/**/
56,
/**/
55,