diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-05-26 14:11:23 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-05-26 14:11:23 +0200 |
commit | ec58384afa0dc1678afd7b8d19b4645ac2f73f42 (patch) | |
tree | 542962e10b9053a34c1a966e7583709e9d40b960 /src/popupwin.c | |
parent | a8c99fb78e9d747c127e8878518d5a43837b022b (diff) | |
download | vim-git-ec58384afa0dc1678afd7b8d19b4645ac2f73f42.tar.gz |
patch 8.1.1399: popup windows not adjusted when switching tabsv8.1.1399
Problem: Popup windows not adjusted when switching tabs.
Solution: Save and restore first_tab_popupwin. Fix closing a tabpage.
Diffstat (limited to 'src/popupwin.c')
-rw-r--r-- | src/popupwin.c | 61 |
1 files changed, 40 insertions, 21 deletions
diff --git a/src/popupwin.c b/src/popupwin.c index f7a8921df..294f3b1d6 100644 --- a/src/popupwin.c +++ b/src/popupwin.c @@ -177,40 +177,59 @@ f_popup_close(typval_T *argvars, typval_T *rettv UNUSED) popup_close(nr); } +/* + * Close a popup window by Window-id. + */ void -popup_close(int nr) +popup_close(int id) { win_T *wp; + tabpage_T *tp; win_T *prev = NULL; + // go through global popups for (wp = first_popupwin; wp != NULL; prev = wp, wp = wp->w_next) - if (wp->w_id == nr) + if (wp->w_id == id) { if (prev == NULL) first_popupwin = wp->w_next; else prev->w_next = wp->w_next; - break; + win_free_popup(wp); + redraw_all_later(NOT_VALID); + return; } - if (wp == NULL) - { - prev = NULL; - for (wp = first_tab_popupwin; wp != NULL; prev = wp, wp = wp->w_next) - if (wp->w_id == nr) - { - if (prev == NULL) - first_tab_popupwin = wp->w_next; - else - prev->w_next = wp->w_next; - break; - } - } - if (wp != NULL) - { - win_free_popup(wp); - redraw_all_later(NOT_VALID); - } + // go through tab-local popups + FOR_ALL_TABPAGES(tp) + popup_close_tabpage(tp, id); +} + +/* + * Close a popup window with Window-id "id" in tabpage "tp". + */ + void +popup_close_tabpage(tabpage_T *tp, int id) +{ + win_T *wp; + win_T **root; + win_T *prev = NULL; + + if (tp == curtab) + root = &first_tab_popupwin; + else + root = &tp->tp_first_popupwin; + for (wp = *root; wp != NULL; prev = wp, wp = wp->w_next) + if (wp->w_id == id) + { + if (prev == NULL) + *root = wp->w_next; + else + prev->w_next = wp->w_next; + win_free_popup(wp); + redraw_all_later(NOT_VALID); + return; + } } void |