From: Bram Moolenaar Date: Fri, 9 Aug 2019 12:56:22 +0000 (+0200) Subject: patch 8.1.1832: win_execute() does not work in other tab X-Git-Tag: v8.1.1832 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=820680b9ff1de8699156c7b060f97e5c0b87ad15;p=vim 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 ab8efe92e..07a6768c2 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -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); diff --git a/src/proto/window.pro b/src/proto/window.pro index e9af75b8a..ccb7a2c03 100644 --- 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); diff --git a/src/testdir/test_execute_func.vim b/src/testdir/test_execute_func.vim index 81a67c035..f3d7e3730 100644 --- 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 diff --git a/src/version.c b/src/version.c index 8b855ced9..adbf13802 100644 --- a/src/version.c +++ b/src/version.c @@ -769,6 +769,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1832, /**/ 1831, /**/ diff --git a/src/window.c b/src/window.c index 1e1e4ba65..f4154e7e1 100644 --- a/src/window.c +++ b/src/window.c @@ -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;