summaryrefslogtreecommitdiffstats
path: root/src/evalwindow.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-01-06 13:24:51 +0000
committerBram Moolenaar <Bram@vim.org>2022-01-06 13:24:51 +0000
commit18f4740f043b353abe47b7a00131317052457686 (patch)
treee5c469ce7c20a1801a9340ab2027455e256f1b55 /src/evalwindow.c
parenta33737b6d80f5461c1c6c4c96b5bc4964a737927 (diff)
patch 8.2.4018: ml_get error when win_execute redraws with Visual selectionv8.2.4018
Problem: ml_get error when win_execute redraws with Visual selection. Solution: Disable Visual area temporarily. (closes #9479)
Diffstat (limited to 'src/evalwindow.c')
-rw-r--r--src/evalwindow.c67
1 files changed, 38 insertions, 29 deletions
diff --git a/src/evalwindow.c b/src/evalwindow.c
index 0fc62d1cc2..d29f3e4baa 100644
--- a/src/evalwindow.c
+++ b/src/evalwindow.c
@@ -689,8 +689,7 @@ f_win_execute(typval_T *argvars, typval_T *rettv)
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 @@ f_win_execute(typval_T *argvars, typval_T *rettv)
}
#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 @@ f_winwidth(typval_T *argvars, typval_T *rettv)
*/
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 @@ switch_win(
*/
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 @@ switch_win_noblock(
*/
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 @@ restore_win(
*/
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