Skip to content

Commit 18f4740

Browse files
committed
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)
1 parent a33737b commit 18f4740

10 files changed

Lines changed: 109 additions & 88 deletions

File tree

src/evalbuffer.c

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -930,31 +930,29 @@ find_win_for_buf(
930930
*/
931931
void
932932
switch_to_win_for_buf(
933-
buf_T *buf,
934-
win_T **save_curwinp,
935-
tabpage_T **save_curtabp,
936-
bufref_T *save_curbuf)
933+
buf_T *buf,
934+
switchwin_T *switchwin,
935+
bufref_T *save_curbuf)
937936
{
938937
win_T *wp;
939938
tabpage_T *tp;
940939

941940
if (find_win_for_buf(buf, &wp, &tp) == FAIL)
942941
switch_buffer(save_curbuf, buf);
943-
else if (switch_win(save_curwinp, save_curtabp, wp, tp, TRUE) == FAIL)
942+
else if (switch_win(switchwin, wp, tp, TRUE) == FAIL)
944943
{
945-
restore_win(*save_curwinp, *save_curtabp, TRUE);
944+
restore_win(switchwin, TRUE);
946945
switch_buffer(save_curbuf, buf);
947946
}
948947
}
949948

950949
void
951950
restore_win_for_buf(
952-
win_T *save_curwin,
953-
tabpage_T *save_curtab,
954-
bufref_T *save_curbuf)
951+
switchwin_T *switchwin,
952+
bufref_T *save_curbuf)
955953
{
956954
if (save_curbuf->br_buf == NULL)
957-
restore_win(save_curwin, save_curtab, TRUE);
955+
restore_win(switchwin, TRUE);
958956
else
959957
restore_buffer(save_curbuf);
960958
}

src/evalfunc.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6864,8 +6864,7 @@ f_line(typval_T *argvars, typval_T *rettv)
68646864
int id;
68656865
tabpage_T *tp;
68666866
win_T *wp;
6867-
win_T *save_curwin;
6868-
tabpage_T *save_curtab;
6867+
switchwin_T switchwin;
68696868

68706869
if (in_vim9script()
68716870
&& (check_for_string_arg(argvars, 0) == FAIL
@@ -6879,13 +6878,12 @@ f_line(typval_T *argvars, typval_T *rettv)
68796878
wp = win_id2wp_tp(id, &tp);
68806879
if (wp != NULL && tp != NULL)
68816880
{
6882-
if (switch_win_noblock(&save_curwin, &save_curtab, wp, tp, TRUE)
6883-
== OK)
6881+
if (switch_win_noblock(&switchwin, wp, tp, TRUE) == OK)
68846882
{
68856883
check_cursor();
68866884
fp = var2fpos(&argvars[0], TRUE, &fnum, FALSE);
68876885
}
6888-
restore_win_noblock(save_curwin, save_curtab, TRUE);
6886+
restore_win_noblock(&switchwin, TRUE);
68896887
}
68906888
}
68916889
else

src/evalvars.c

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3769,8 +3769,7 @@ getwinvar(
37693769
dictitem_T *v;
37703770
tabpage_T *tp = NULL;
37713771
int done = FALSE;
3772-
win_T *oldcurwin;
3773-
tabpage_T *oldtabpage;
3772+
switchwin_T switchwin;
37743773
int need_switch_win;
37753774

37763775
if (off == 1)
@@ -3791,7 +3790,7 @@ getwinvar(
37913790
// autocommands get blocked.
37923791
need_switch_win = !(tp == curtab && win == curwin);
37933792
if (!need_switch_win
3794-
|| switch_win(&oldcurwin, &oldtabpage, win, tp, TRUE) == OK)
3793+
|| switch_win(&switchwin, win, tp, TRUE) == OK)
37953794
{
37963795
if (*varname == '&')
37973796
{
@@ -3826,7 +3825,7 @@ getwinvar(
38263825

38273826
if (need_switch_win)
38283827
// restore previous notion of curwin
3829-
restore_win(oldcurwin, oldtabpage, TRUE);
3828+
restore_win(&switchwin, TRUE);
38303829
}
38313830

38323831
if (!done && argvars[off + 2].v_type != VAR_UNKNOWN)
@@ -3869,8 +3868,7 @@ set_option_from_tv(char_u *varname, typval_T *varp)
38693868
setwinvar(typval_T *argvars, int off)
38703869
{
38713870
win_T *win;
3872-
win_T *save_curwin;
3873-
tabpage_T *save_curtab;
3871+
switchwin_T switchwin;
38743872
int need_switch_win;
38753873
char_u *varname, *winvarname;
38763874
typval_T *varp;
@@ -3891,7 +3889,7 @@ setwinvar(typval_T *argvars, int off)
38913889
{
38923890
need_switch_win = !(tp == curtab && win == curwin);
38933891
if (!need_switch_win
3894-
|| switch_win(&save_curwin, &save_curtab, win, tp, TRUE) == OK)
3892+
|| switch_win(&switchwin, win, tp, TRUE) == OK)
38953893
{
38963894
if (*varname == '&')
38973895
set_option_from_tv(varname + 1, varp);
@@ -3908,7 +3906,7 @@ setwinvar(typval_T *argvars, int off)
39083906
}
39093907
}
39103908
if (need_switch_win)
3911-
restore_win(save_curwin, save_curtab, TRUE);
3909+
restore_win(&switchwin, TRUE);
39123910
}
39133911
}
39143912

@@ -4165,8 +4163,8 @@ get_clear_redir_ga(void)
41654163
void
41664164
f_gettabvar(typval_T *argvars, typval_T *rettv)
41674165
{
4168-
win_T *oldcurwin;
4169-
tabpage_T *tp, *oldtabpage;
4166+
switchwin_T switchwin;
4167+
tabpage_T *tp;
41704168
dictitem_T *v;
41714169
char_u *varname;
41724170
int done = FALSE;
@@ -4185,7 +4183,7 @@ f_gettabvar(typval_T *argvars, typval_T *rettv)
41854183
{
41864184
// Set tp to be our tabpage, temporarily. Also set the window to the
41874185
// first window in the tabpage, otherwise the window is not valid.
4188-
if (switch_win(&oldcurwin, &oldtabpage,
4186+
if (switch_win(&switchwin,
41894187
tp == curtab || tp->tp_firstwin == NULL ? firstwin
41904188
: tp->tp_firstwin, tp, TRUE) == OK)
41914189
{
@@ -4200,7 +4198,7 @@ f_gettabvar(typval_T *argvars, typval_T *rettv)
42004198
}
42014199

42024200
// restore previous notion of curwin
4203-
restore_win(oldcurwin, oldtabpage, TRUE);
4201+
restore_win(&switchwin, TRUE);
42044202
}
42054203

42064204
if (!done && argvars[2].v_type != VAR_UNKNOWN)

src/evalwindow.c

Lines changed: 38 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -689,8 +689,7 @@ f_win_execute(typval_T *argvars, typval_T *rettv)
689689
int id;
690690
tabpage_T *tp;
691691
win_T *wp;
692-
win_T *save_curwin;
693-
tabpage_T *save_curtab;
692+
switchwin_T switchwin;
694693

695694
// Return an empty string if something fails.
696695
rettv->v_type = VAR_STRING;
@@ -727,12 +726,12 @@ f_win_execute(typval_T *argvars, typval_T *rettv)
727726
}
728727
#endif
729728

730-
if (switch_win_noblock(&save_curwin, &save_curtab, wp, tp, TRUE) == OK)
729+
if (switch_win_noblock(&switchwin, wp, tp, TRUE) == OK)
731730
{
732731
check_cursor();
733732
execute_common(argvars, rettv, 1);
734733
}
735-
restore_win_noblock(save_curwin, save_curtab, TRUE);
734+
restore_win_noblock(&switchwin, TRUE);
736735
#ifdef FEAT_AUTOCHDIR
737736
if (apply_acd)
738737
do_autochdir();
@@ -1247,31 +1246,39 @@ f_winwidth(typval_T *argvars, typval_T *rettv)
12471246
*/
12481247
int
12491248
switch_win(
1250-
win_T **save_curwin,
1251-
tabpage_T **save_curtab,
1252-
win_T *win,
1253-
tabpage_T *tp,
1254-
int no_display)
1249+
switchwin_T *switchwin,
1250+
win_T *win,
1251+
tabpage_T *tp,
1252+
int no_display)
12551253
{
12561254
block_autocmds();
1257-
return switch_win_noblock(save_curwin, save_curtab, win, tp, no_display);
1255+
return switch_win_noblock(switchwin, win, tp, no_display);
12581256
}
12591257

12601258
/*
12611259
* As switch_win() but without blocking autocommands.
12621260
*/
12631261
int
12641262
switch_win_noblock(
1265-
win_T **save_curwin,
1266-
tabpage_T **save_curtab,
1267-
win_T *win,
1268-
tabpage_T *tp,
1269-
int no_display)
1263+
switchwin_T *switchwin,
1264+
win_T *win,
1265+
tabpage_T *tp,
1266+
int no_display)
12701267
{
1271-
*save_curwin = curwin;
1268+
CLEAR_POINTER(switchwin);
1269+
switchwin->sw_curwin = curwin;
1270+
if (win == curwin)
1271+
switchwin->sw_same_win = TRUE;
1272+
else
1273+
{
1274+
// Disable Visual selection, because redrawing may fail.
1275+
switchwin->sw_visual_active = VIsual_active;
1276+
VIsual_active = FALSE;
1277+
}
1278+
12721279
if (tp != NULL)
12731280
{
1274-
*save_curtab = curtab;
1281+
switchwin->sw_curtab = curtab;
12751282
if (no_display)
12761283
{
12771284
curtab->tp_firstwin = firstwin;
@@ -1299,11 +1306,10 @@ switch_win_noblock(
12991306
*/
13001307
void
13011308
restore_win(
1302-
win_T *save_curwin,
1303-
tabpage_T *save_curtab,
1304-
int no_display)
1309+
switchwin_T *switchwin,
1310+
int no_display)
13051311
{
1306-
restore_win_noblock(save_curwin, save_curtab, no_display);
1312+
restore_win_noblock(switchwin, no_display);
13071313
unblock_autocmds();
13081314
}
13091315

@@ -1312,28 +1318,31 @@ restore_win(
13121318
*/
13131319
void
13141320
restore_win_noblock(
1315-
win_T *save_curwin,
1316-
tabpage_T *save_curtab,
1317-
int no_display)
1321+
switchwin_T *switchwin,
1322+
int no_display)
13181323
{
1319-
if (save_curtab != NULL && valid_tabpage(save_curtab))
1324+
if (switchwin->sw_curtab != NULL && valid_tabpage(switchwin->sw_curtab))
13201325
{
13211326
if (no_display)
13221327
{
13231328
curtab->tp_firstwin = firstwin;
13241329
curtab->tp_lastwin = lastwin;
13251330
curtab->tp_topframe = topframe;
1326-
curtab = save_curtab;
1331+
curtab = switchwin->sw_curtab;
13271332
firstwin = curtab->tp_firstwin;
13281333
lastwin = curtab->tp_lastwin;
13291334
topframe = curtab->tp_topframe;
13301335
}
13311336
else
1332-
goto_tabpage_tp(save_curtab, FALSE, FALSE);
1337+
goto_tabpage_tp(switchwin->sw_curtab, FALSE, FALSE);
13331338
}
1334-
if (win_valid(save_curwin))
1339+
1340+
if (!switchwin->sw_same_win)
1341+
VIsual_active = switchwin->sw_visual_active;
1342+
1343+
if (win_valid(switchwin->sw_curwin))
13351344
{
1336-
curwin = save_curwin;
1345+
curwin = switchwin->sw_curwin;
13371346
curbuf = curwin->w_buffer;
13381347
}
13391348
# ifdef FEAT_PROP_POPUP

0 commit comments

Comments
 (0)