changeset 17670:1be29c149103 v8.1.1832

patch 8.1.1832: win_execute() does not work in other tab commit https://github.com/vim/vim/commit/820680b9ff1de8699156c7b060f97e5c0b87ad15 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Aug 9 14:56:22 2019 +0200 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 https://github.com/vim/vim/issues/4792)
author Bram Moolenaar <Bram@vim.org>
date Fri, 09 Aug 2019 15:00:05 +0200
parents 89ab05784a7e
children 276213598138
files src/evalfunc.c src/proto/window.pro src/testdir/test_execute_func.vim src/version.c src/window.c
diffstat 5 files changed, 41 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -5726,14 +5726,14 @@ f_getwininfo(typval_T *argvars, typval_T
 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 (switch_win_noblock(&save_curwin, &save_curtab, wp, curtab, TRUE)
-									 == OK)
+    if (wp != NULL && tp != NULL)
+    {
+	if (switch_win_noblock(&save_curwin, &save_curtab, wp, tp, TRUE) == OK)
 	{
 	    check_cursor();
 	    execute_common(argvars, rettv, 1);
--- a/src/proto/window.pro
+++ b/src/proto/window.pro
@@ -90,6 +90,7 @@ int win_getid(typval_T *argvars);
 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);
--- a/src/testdir/test_execute_func.vim
+++ b/src/testdir/test_execute_func.vim
@@ -100,3 +100,12 @@ func Test_win_execute()
   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
--- a/src/version.c
+++ b/src/version.c
@@ -770,6 +770,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1832,
+/**/
     1831,
 /**/
     1830,
--- a/src/window.c
+++ b/src/window.c
@@ -6887,24 +6887,48 @@ win_id2tabwin(typval_T *argvars, list_T 
     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;