From 6ba3ec1bace67513a352326864cebc16b3c5bc56 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 16 Jun 2018 15:32:38 +0200 Subject: [PATCH] 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) --- src/edit.c | 10 ++++++++++ src/proto/screen.pro | 1 - src/screen.c | 21 ++++++++++++--------- src/version.c | 2 ++ 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 @@ -761,6 +761,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 57, /**/ 56, /**/ -- 2.40.0