summaryrefslogtreecommitdiff
path: root/src/popupwin.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-05-26 14:11:23 +0200
committerBram Moolenaar <Bram@vim.org>2019-05-26 14:11:23 +0200
commitec58384afa0dc1678afd7b8d19b4645ac2f73f42 (patch)
tree542962e10b9053a34c1a966e7583709e9d40b960 /src/popupwin.c
parenta8c99fb78e9d747c127e8878518d5a43837b022b (diff)
downloadvim-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.c61
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