]> granicus.if.org Git - vim/commitdiff
patch 8.1.1832: win_execute() does not work in other tab v8.1.1832
authorBram Moolenaar <Bram@vim.org>
Fri, 9 Aug 2019 12:56:22 +0000 (14:56 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 9 Aug 2019 12:56:22 +0000 (14:56 +0200)
Problem:    Win_execute() does not work in other tab. (Rick Howe)
Solution:   Take care of the tab. (closes #4792)

src/evalfunc.c
src/proto/window.pro
src/testdir/test_execute_func.vim
src/version.c
src/window.c

index ab8efe92e5607cc31958967afc35a52c8a43b566..07a6768c277bcd63ede60f6c76565c5e6f29605f 100644 (file)
@@ -5726,14 +5726,14 @@ f_getwininfo(typval_T *argvars, typval_T *rettv)
 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);
index e9af75b8a65305d9b83633a568e92a76d9292c18..ccb7a2c03bd74cf9cb325c07f0a461adcb7ad548 100644 (file)
@@ -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);
index 81a67c0359c1f93cbf4326b99303c251fb9c4420..f3d7e3730d52f339bfb1bb512d0a3e10a567d9a9 100644 (file)
@@ -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
index 8b855ced9b2993cb20671265b2e4c5a62aec2ce7..adbf13802a8a3e9afcb3f76158aa8b17d4b34a50 100644 (file)
@@ -769,6 +769,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1832,
 /**/
     1831,
 /**/
index 1e1e4ba657159e890eb00a7bb6168cc6cd219168..f4154e7e12dfe1aa03b57a358cf0d25ad5b35761 100644 (file)
@@ -6887,24 +6887,48 @@ win_id2tabwin(typval_T *argvars, list_T *list)
     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;