patch 8.1.1832: win_execute() does not work in other tab
Problem: Win_execute() does not work in other tab. (Rick Howe)
Solution: Take care of the tab. (closes #4792)
diff --git a/src/evalfunc.c b/src/evalfunc.c
index ab8efe9..07a6768 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -5726,14 +5726,14 @@
f_win_execute(typval_T *argvars, typval_T *rettv)
{
int id = (int)tv_get_number(argvars);
- win_T *wp = win_id2wp(id);
+ tabpage_T *tp;
+ win_T *wp = win_id2wp_tp(id, &tp);
win_T *save_curwin;
tabpage_T *save_curtab;
- if (wp != NULL)
+ if (wp != NULL && tp != NULL)
{
- if (switch_win_noblock(&save_curwin, &save_curtab, wp, curtab, TRUE)
- == OK)
+ if (switch_win_noblock(&save_curwin, &save_curtab, wp, tp, TRUE) == OK)
{
check_cursor();
execute_common(argvars, rettv, 1);
diff --git a/src/proto/window.pro b/src/proto/window.pro
index e9af75b..ccb7a2c 100644
--- a/src/proto/window.pro
+++ b/src/proto/window.pro
@@ -90,6 +90,7 @@
int win_gotoid(typval_T *argvars);
void win_id2tabwin(typval_T *argvars, list_T *list);
win_T *win_id2wp(int id);
+win_T *win_id2wp_tp(int id, tabpage_T **tpp);
int win_id2win(typval_T *argvars);
void win_findbuf(typval_T *argvars, list_T *list);
void get_framelayout(frame_T *fr, list_T *l, int outer);
diff --git a/src/testdir/test_execute_func.vim b/src/testdir/test_execute_func.vim
index 81a67c0..f3d7e37 100644
--- a/src/testdir/test_execute_func.vim
+++ b/src/testdir/test_execute_func.vim
@@ -100,3 +100,12 @@
call win_gotoid(otherwin)
bwipe!
endfunc
+
+func Test_win_execute_other_tab()
+ let thiswin = win_getid()
+ tabnew
+ call win_execute(thiswin, 'let xyz = 1')
+ call assert_equal(1, xyz)
+ tabclose
+ unlet xyz
+endfunc
diff --git a/src/version.c b/src/version.c
index 8b855ce..adbf138 100644
--- a/src/version.c
+++ b/src/version.c
@@ -770,6 +770,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1832,
+/**/
1831,
/**/
1830,
diff --git a/src/window.c b/src/window.c
index 1e1e4ba..f4154e7 100644
--- a/src/window.c
+++ b/src/window.c
@@ -6887,24 +6887,48 @@
list_append_number(list, 0);
}
+/*
+ * Return the window pointer of window "id".
+ */
win_T *
win_id2wp(int id)
{
+ return win_id2wp_tp(id, NULL);
+}
+
+/*
+ * Return the window and tab pointer of window "id".
+ */
+ win_T *
+win_id2wp_tp(int id, tabpage_T **tpp)
+{
win_T *wp;
tabpage_T *tp;
FOR_ALL_TAB_WINDOWS(tp, wp)
if (wp->w_id == id)
+ {
+ if (tpp != NULL)
+ *tpp = tp;
return wp;
+ }
#ifdef FEAT_TEXT_PROP
// popup windows are in separate lists
FOR_ALL_TABPAGES(tp)
for (wp = tp->tp_first_popupwin; wp != NULL; wp = wp->w_next)
if (wp->w_id == id)
+ {
+ if (tpp != NULL)
+ *tpp = tp;
return wp;
+ }
for (wp = first_popupwin; wp != NULL; wp = wp->w_next)
if (wp->w_id == id)
+ {
+ if (tpp != NULL)
+ *tpp = tp;
return wp;
+ }
#endif
return NULL;