diff src/popupwin.c @ 16794:ddfa924df50d v8.1.1399

patch 8.1.1399: popup windows not adjusted when switching tabs commit https://github.com/vim/vim/commit/ec58384afa0dc1678afd7b8d19b4645ac2f73f42 Author: Bram Moolenaar <Bram@vim.org> Date: Sun May 26 14:11:23 2019 +0200 patch 8.1.1399: popup windows not adjusted when switching tabs Problem: Popup windows not adjusted when switching tabs. Solution: Save and restore first_tab_popupwin. Fix closing a tabpage.
author Bram Moolenaar <Bram@vim.org>
date Sun, 26 May 2019 14:15:06 +0200
parents eda4d65f232c
children 5f98d80d116a
line wrap: on
line diff
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -177,40 +177,59 @@ f_popup_close(typval_T *argvars, typval_
     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