patch 8.2.4018: ml_get error when win_execute redraws with Visual selection
Problem: ml_get error when win_execute redraws with Visual selection.
Solution: Disable Visual area temporarily. (closes #9479)
diff --git a/src/evalwindow.c b/src/evalwindow.c
index 0fc62d1..d29f3e4 100644
--- a/src/evalwindow.c
+++ b/src/evalwindow.c
@@ -689,8 +689,7 @@
int id;
tabpage_T *tp;
win_T *wp;
- win_T *save_curwin;
- tabpage_T *save_curtab;
+ switchwin_T switchwin;
// Return an empty string if something fails.
rettv->v_type = VAR_STRING;
@@ -727,12 +726,12 @@
}
#endif
- if (switch_win_noblock(&save_curwin, &save_curtab, wp, tp, TRUE) == OK)
+ if (switch_win_noblock(&switchwin, wp, tp, TRUE) == OK)
{
check_cursor();
execute_common(argvars, rettv, 1);
}
- restore_win_noblock(save_curwin, save_curtab, TRUE);
+ restore_win_noblock(&switchwin, TRUE);
#ifdef FEAT_AUTOCHDIR
if (apply_acd)
do_autochdir();
@@ -1247,14 +1246,13 @@
*/
int
switch_win(
- win_T **save_curwin,
- tabpage_T **save_curtab,
- win_T *win,
- tabpage_T *tp,
- int no_display)
+ switchwin_T *switchwin,
+ win_T *win,
+ tabpage_T *tp,
+ int no_display)
{
block_autocmds();
- return switch_win_noblock(save_curwin, save_curtab, win, tp, no_display);
+ return switch_win_noblock(switchwin, win, tp, no_display);
}
/*
@@ -1262,16 +1260,25 @@
*/
int
switch_win_noblock(
- win_T **save_curwin,
- tabpage_T **save_curtab,
- win_T *win,
- tabpage_T *tp,
- int no_display)
+ switchwin_T *switchwin,
+ win_T *win,
+ tabpage_T *tp,
+ int no_display)
{
- *save_curwin = curwin;
+ CLEAR_POINTER(switchwin);
+ switchwin->sw_curwin = curwin;
+ if (win == curwin)
+ switchwin->sw_same_win = TRUE;
+ else
+ {
+ // Disable Visual selection, because redrawing may fail.
+ switchwin->sw_visual_active = VIsual_active;
+ VIsual_active = FALSE;
+ }
+
if (tp != NULL)
{
- *save_curtab = curtab;
+ switchwin->sw_curtab = curtab;
if (no_display)
{
curtab->tp_firstwin = firstwin;
@@ -1299,11 +1306,10 @@
*/
void
restore_win(
- win_T *save_curwin,
- tabpage_T *save_curtab,
- int no_display)
+ switchwin_T *switchwin,
+ int no_display)
{
- restore_win_noblock(save_curwin, save_curtab, no_display);
+ restore_win_noblock(switchwin, no_display);
unblock_autocmds();
}
@@ -1312,28 +1318,31 @@
*/
void
restore_win_noblock(
- win_T *save_curwin,
- tabpage_T *save_curtab,
- int no_display)
+ switchwin_T *switchwin,
+ int no_display)
{
- if (save_curtab != NULL && valid_tabpage(save_curtab))
+ if (switchwin->sw_curtab != NULL && valid_tabpage(switchwin->sw_curtab))
{
if (no_display)
{
curtab->tp_firstwin = firstwin;
curtab->tp_lastwin = lastwin;
curtab->tp_topframe = topframe;
- curtab = save_curtab;
+ curtab = switchwin->sw_curtab;
firstwin = curtab->tp_firstwin;
lastwin = curtab->tp_lastwin;
topframe = curtab->tp_topframe;
}
else
- goto_tabpage_tp(save_curtab, FALSE, FALSE);
+ goto_tabpage_tp(switchwin->sw_curtab, FALSE, FALSE);
}
- if (win_valid(save_curwin))
+
+ if (!switchwin->sw_same_win)
+ VIsual_active = switchwin->sw_visual_active;
+
+ if (win_valid(switchwin->sw_curwin))
{
- curwin = save_curwin;
+ curwin = switchwin->sw_curwin;
curbuf = curwin->w_buffer;
}
# ifdef FEAT_PROP_POPUP